html, body {
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}

a, .btn-link {
    color: #006bb7;
}

.btn-primary {
    color: #fff;
    background-color: #1b6ec2;
    border-color: #1861ac;
}

.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
  box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}

.content {
    padding-top: 1.1rem;
}

h1:focus {
    outline: none;
}

.valid.modified:not([type=checkbox]) {
    outline: 1px solid #26b050;
}

.invalid {
    outline: 1px solid #e50000;
}

.validation-message {
    color: #e50000;
}

.blazor-error-boundary {
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}

    .blazor-error-boundary::after {
        content: "An error has occurred."
    }

.darker-border-checkbox.form-check-input {
    border-color: #929292;
}

.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
    color: var(--bs-secondary-color);
    text-align: end;
}

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
    text-align: start;
}

/* =====================================================================
   ProbaLab Theme – Design Tokens & Komponenten
   Quelle: agents/designer.md
   Hinweis: Custom-Klassen werden mit dem Präfix "nl-" versehen,
   um Konflikte mit Bootstrap/DevExpress zu vermeiden.
   ===================================================================== */

/* Inter-Font einbinden — lokal gehostet (DSGVO Art. 44: kein Abruf bei Google Fonts /
   fonts.gstatic.com, damit keine Besucher-IP in die USA uebertragen wird).
   Quelle: Google Fonts "Inter" v20, WOFF2-Subsets unter wwwroot/lib/inter/.
   Es handelt sich um eine Variable Font (fvar/gvar) — eine Datei je Subset deckt den
   gesamten Gewichtsbereich 400-700 ab (400/500/600/700 werden daraus instanziiert).
   Lizenz: SIL Open Font License 1.1. */
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('lib/inter/inter-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('lib/inter/inter-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('lib/inter/inter-cyrillic.woff2') format('woff2');
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('lib/inter/inter-cyrillic-ext.woff2') format('woff2');
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('lib/inter/inter-greek.woff2') format('woff2');
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('lib/inter/inter-greek-ext.woff2') format('woff2');
    unicode-range: U+1F00-1FFF;
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('lib/inter/inter-vietnamese.woff2') format('woff2');
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

:root {
    /* Brand-Reinwerte (2026-06-01 Rebrand) — nie direkt in Komponenten verwenden,
       stets über semantische Tokens referenzieren. */
    --nl-color-brand-navy: #262766;
    --nl-color-brand-mid:  #5678b5;
    --nl-color-brand-gold: #fbbc3a;

    /* Primärfarben – Vertrauen, Wissenschaft */
    --nl-color-primary:        #262766;
    --nl-color-primary-light:  #5678b5;
    --nl-color-primary-dark:   #1a1b4b;

    /* Sekundärfarben */
    --nl-color-secondary:      #5678b5;
    --nl-color-accent:         #fbbc3a;

    /* Hintergrund */
    --nl-color-bg:             #F5F7FA;
    --nl-color-bg-card:        #FFFFFF;
    --nl-color-bg-sidebar:     #F5F7FB;
    --nl-color-sidebar-border: #E1E6F0;
    /* Footer (Landing-Page) bleibt dunkel — entkoppelt vom hellen Sidebar-BG seit
       Re-Brand 2026-06-01. Nutzt Brand-Navy als Anker. */
    --nl-color-bg-footer:      #262766;

    /* Text */
    --nl-color-text-primary:   #1A1A2E;
    --nl-color-text-secondary: #6B7280;
    --nl-color-text-inverted:  #FFFFFF;

    /* Bewertungs-Status */
    --nl-color-io:     #16A34A;
    --nl-color-warn:   #fbbc3a;
    --nl-color-nio:    #DC2626;
    --nl-color-nb:     #6B7280;
    --nl-color-nwg:    #2563EB;
    /* Kraeftigeres Amber fuer Reklamation/Ampel-Kontexte — bewusst EIGENES Token,
       NICHT identisch mit --nl-color-warn (#fbbc3a, helles Marken-Gold). Gleicher
       Bedeutungsraum (Warnung/in Klaerung), aber sichtbar dunklerer Ton. */
    --nl-color-warn-strong: #D97706;
    /* [Welle 4 Batch I] "-strong"-Geschwister zu io/info: dunklere, AA-kontrastsichere
       Text-Variante fuer helle Pill-Badges (z. B. ProbeStatusBadge), analog zu
       --nl-color-warn-strong. --nl-color-io/--nl-color-probe-nachuntersuchung
       selbst sind fuer helle Flaechen (Solid-Badge, Icon) gedacht, nicht als Text
       auf weissem/hellem Grund (Kontrast < 4.5:1). */
    --nl-color-io-strong:   #15803D;
    --nl-color-info-strong: #0E7490;

    /* [Handbuch-Prose-Aufwertung] Callout-Akzentfarben — reine Aliase auf bestehende
       Bewertungs-/Marken-Tokens, KEINE neuen Farbwerte. Ordnen den vier Handbuch-
       Hinweisbox-Varianten (danger/emphasis/info/tip) je ein bestehendes Token zu;
       die neutrale "note"-Variante nutzt direkt --nl-color-nb (kein eigenes Token). */
    --nl-color-callout-danger:   var(--nl-color-nio);
    --nl-color-callout-emphasis: var(--nl-color-primary);
    --nl-color-callout-info:     var(--nl-color-info-strong);
    --nl-color-callout-tip:      var(--nl-color-io-strong);

    /* Versionierungs-Status */
    --nl-color-entwurf:        #6B7280;
    --nl-color-zur-freigabe:   #fbbc3a;
    --nl-color-freigegeben:    #16A34A;
    --nl-color-archiviert:     #9CA3AF;
    --nl-color-abgelehnt:      #DC2626;

    /* DevExpress Grid-Selection — konsistent zum NavMenu-Active-Style (Mittelblau-Tint
       + Navy-Text). Vorher zeigte DxGrid die selektierte Zeile als dunkles Navy-Solid.
       ACHTUNG: Diese Custom-Properties greifen nur fuer "nur selected"-Rows. Die echte
       Farbe der fokussierten Zeile (geklickt) kommt aus einem ::before-Pseudo mit
       hartkodiertem `var(--bs-primary)` + 90-100% Opacity — siehe Override-Block weiter
       unten (Suchstring "dxbl-grid-focused-row"). */
    --dxbl-grid-selection-bg:          rgba(86, 120, 181, 0.12);
    --dxbl-grid-selection-color:       var(--nl-color-brand-navy, #262766);
    --dxbl-grid-selection-focus-bg:    rgba(86, 120, 181, 0.22);
    --dxbl-grid-selection-focus-color: var(--nl-color-brand-navy, #262766);

    /* Proben-Typen (Probenbaum) */
    --nl-color-probe-original:         #1B4F8A;
    --nl-color-probe-teilung:          #7C3AED;
    --nl-color-probe-nachuntersuchung: #0891B2;
    --nl-color-probe-rueckstellprobe:  #92400E;
    --nl-color-probe-blindwert:        #374151;
    --nl-color-probe-duplikat:         #065F46;

    /* Typografie */
    --nl-font-family: 'Inter', system-ui, -apple-system, 'Helvetica Neue', Helvetica, Arial, sans-serif;
    --nl-font-family-mono: ui-monospace, SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
    --nl-font-size-xs:   0.75rem;
    --nl-font-size-sm:   0.875rem;
    --nl-font-size-base: 1rem;
    --nl-font-size-lg:   1.125rem;
    --nl-font-size-xl:   1.25rem;
    --nl-font-size-2xl:  1.5rem;
    --nl-font-size-3xl:  2rem;

    /* Layout */
    --nl-radius-sm: 6px;
    --nl-radius-md: 10px;
    --nl-radius-lg: 14px;
    --nl-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
    --nl-shadow-md: 0 4px 14px rgba(15, 48, 87, 0.10);

    /* [E-22] Strukturelle Oberflächen- und Rahmen-Tokens
       Abgeleitet aus den zuvor hardcodierten Hex-Werten in app.css (UX-04).
       KEINE visuelle Änderung — identische Farbwerte, jetzt semantisch benannt.
       - surface-hover : blauer Hover-Hintergrund (Cockpit-Rows, TreeList-Links)
       - surface-subtle : sehr helles Grau für Chip-Rows, Meta-Leisten, Mapping-Header
       - border-default : Standard-Trennlinie (ECEEF2) — meistverwendeter Rahmenton
       - border-card    : leicht dunklere Card-Rahmenlinie (E2E6EC / DDE1E6) */
    --nl-color-surface-hover:   #EFF6FF;
    --nl-color-surface-subtle:  #F4F6F9;
    --nl-color-border-default:  #ECEEF2;
    --nl-color-border-card:     #DDE1E6;

    /* [Welle 4 Batch III] Pruefmittel-Lifecycle-Status — dedupliziert aus
       PruefmittelDetail/-Liste/-Termine.razor.css (identischer Block war 3x kopiert,
       siehe Abschnitt "Pruefmittel-Status-Badges (global)" weiter unten).
       "inbetrieb" nutzt bewusst --nl-color-io (identischer Hex #16A34A) statt eines
       eigenen Tokens. "inkalibrierung"/"verschrottet" sind neue, domänenspezifische
       Tokens — auch wenn die Hex-Werte zufällig mit --nl-color-nwg (Bewertungsstufe
       < NWG) bzw. --nl-color-probe-blindwert (Probentyp) übereinstimmen, sind das
       fachlich andere Konzepte, daher bewusst eigene Namen statt Wiederverwendung. */
    --nl-color-pm-inkalibrierung: #2563EB;
    --nl-color-pm-verschrottet:   #374151;

    /* [Welle 4 Batch III] Ergebnis-Matrix (ErgebnisMatrix.razor.css) — Ad-hoc-Farben
       tokenisiert. Teal (Formel-Zelle) und Amber (mehrdeutige Zelle) sind echte
       Tag-Highlight-Akzentfarben ohne bestehendes Pendant im globalen Tokenset. */
    --nl-color-matrix-ink:            #4A5160;
    --nl-color-matrix-colhead-ink:    #2A3340;
    --nl-color-matrix-text-faint:     #8A8F99;
    --nl-color-matrix-formula-bg:     rgba(0, 168, 150, 0.06);
    --nl-color-matrix-formula-fg:     #0E7C6F;
    --nl-color-matrix-mehrdeutig-bg:  #FFF8E6;
    --nl-color-matrix-mehrdeutig-fg:  #8B5E00;

    /* [Welle 4 Batch III] "Informativ"-Badge-Ton (Parameter ohne Konformitätsaussage,
       ISO 17025 §7.8.2.1 lit. n) — vorher als rohes Hex sowohl in .nl-badge-informativ
       (unten) als auch dupliziert in ErgebnisMatrix.razor.css. Jetzt eine Quelle. */
    --nl-color-informativ: #475569;

    /* [Feature 3 — Umgebungs-/Hygienemonitoring] Hygiene-Zonen-Kritikalität (Zone 1 =
       produktberührend/höchstes Risiko … Zone 4 = Peripherie/unkritisch). Bewusst EIGENE,
       von den Bewertungsstufen (--nl-color-nio/warn/io) entkoppelte Tokens: die
       Zonen-Kritikalität eines Ortes ist fachlich ein anderes Konzept als eine einzelne
       Ergebnis-Bewertung, auch wenn die Ampel-Anmutung (rot…grau) bewusst der etablierten
       Konvention folgt. Siehe docs/umgebungsmonitoring/00-konzept.md. */
    --nl-color-zone1: #B91C1C;
    --nl-color-zone2: #EA580C;
    --nl-color-zone3: #D97706;
    --nl-color-zone4: #6B7280;

    /* [Welle 4 Batch III] Admin-Backoffice — eigenes, bewusst ENTKOPPELTES Tokenset.
       Das Anbieter-Backoffice (/admin, siehe AdminLayout.razor.css) ist explizit ein
       eigenständiges visuelles Sub-System (dunkler Topbar, reduziertes Chrome, keine
       DevExpress-Theming). Deshalb KEINE Wiederverwendung der Mandanten-Tokens, auch
       wenn einzelne Werte zufällig identisch sind (z. B. --nl-admin-bg/--nl-color-bg,
       --nl-admin-primary/--nl-color-primary) — die beiden Systeme sollen unabhängig
       voneinander weiterentwickelt/gebrandet werden können. */
    --nl-admin-bg:             #F5F7FA;
    --nl-admin-surface:        #FFFFFF;
    --nl-admin-surface-muted:  #FAFBFC;
    --nl-admin-ink:            #1A1A2E;
    --nl-admin-ink-inverted:   #FFFFFF;
    --nl-admin-text-secondary: #6B7280;
    --nl-admin-text-faint:     #9CA3AF;
    --nl-admin-border:         #E5E7EB;
    --nl-admin-border-strong:  #D1D5DB;
    --nl-admin-divider:        #F1F3F5;
    --nl-admin-muted-fg:       #4B5563;
    --nl-admin-topbar-bg:      #1B2B45;
    --nl-admin-primary:        #262766;
    --nl-admin-primary-light:  #5678b5;
    --nl-admin-accent-bg:      #EEF2FF;
    --nl-admin-success-bg:     #DCFCE7;
    --nl-admin-success-fg:     #166534;
    --nl-admin-info-bg:        #DBEAFE;
    --nl-admin-info-fg:        #1E3A8A;
    --nl-admin-info-accent:    #3B82F6;
    --nl-admin-warn-bg:        #FEF3C7;
    --nl-admin-warn-fg:        #92400E;
    --nl-admin-warn-border:    #FCD34D;
    --nl-admin-warn-accent:    #F59E0B;
    --nl-admin-danger-bg:      #FEE2E2;
    --nl-admin-danger-fg:      #991B1B;
    --nl-admin-danger:         #DC2626;
    --nl-admin-danger-border:  #FCA5A5;
    --nl-admin-danger-accent:  #EF4444;
    --nl-admin-danger-strong-border: #B91C1C;
    --nl-admin-danger-strong-fg:     #7F1D1D;
    --nl-admin-preview-bg:     #F9FAFB;
}

/* Globale Schrift im ProbaLab-Wrapper aktivieren (nicht aufzwingen). */
.nl-app, .nl-app * {
    font-family: var(--nl-font-family);
}

/* ---------------------------------------------------------------------
   [E-13] Globaler Fokus-Ring — WCAG 2.1 AA §2.4.7 (Fokus sichtbar)
   Gilt für alle interaktiven Elemente im nl-app-Wrapper: NavLinks,
   native Buttons, Anchor-Links, Formular-Elemente. Die spezifischeren
   Regeln (nl-kpi-card-link, nl-chip, nl-akk-cell usw.) behalten ihre
   Wirkung durch Kaskade — diese Regel ist der Fallback für alle
   bisher nicht explizit adressierten Elemente.
   Kein hardcodiertes Hex — ausschließlich Token.
   --------------------------------------------------------------------- */
.nl-app *:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
    border-radius: 3px;
}

/* DevExpress-Datenzellen handhaben Focus intern und benötigen einen
   negativen offset, damit der Ring innerhalb der Zellgrenzen bleibt
   und das Grid-Layout nicht verschiebt. !important ist hier
   zulässig, da DevExpress selbst inline-styles/high-specificity
   für Focus verwendet. */
.nl-app .dxbl-grid-data-row td:focus-visible,
.nl-app .dxbl-grid-data-row td:focus {
    outline: 2px solid var(--nl-color-primary-light) !important;
    outline-offset: -2px !important;
    border-radius: 0 !important;
}

/* ---------------------------------------------------------------------
   Globales SVG-Sicherheitsnetz
   Verhindert, dass Inline-SVGs ohne explizite Größe durch das Layout
   "explodieren". Lucide-Icons in der Sidebar/Topbar haben width/height-
   Attribute - die werden hier nicht überschrieben. Zusätzlich wird ein
   harter Höchstwert für img/svg-Hintergründe in DevExpress-Filterzellen
   gesetzt, falls das DevExpress-Theme einmal nicht greifen sollte. */
svg:not([width]):not([height]) {
    width: 1em;
    height: 1em;
}

/* ---------------------------------------------------------------------
   Bewertungs-Badges
   --------------------------------------------------------------------- */
.nl-bewertungs-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    letter-spacing: 0.03em;
    line-height: 1.4;
    color: #fff;
}

.nl-badge-io   { background: var(--nl-color-io); }
/* [UI-Audit 2026-07] Weißer Text (siehe .nl-bewertungs-badge oben) auf dem hellen
   Marken-Gold --nl-color-warn (#fbbc3a) ergibt nur ~1,7:1 Kontrast (WCAG AA verfehlt).
   --nl-color-warn-strong (#D97706) als Hintergrund reicht mit weißem Text ebenfalls nicht
   auf 4,5:1 (~3,2:1) — deshalb hier bewusst dunkler Text auf dem unveränderten hellen
   Gold-Hintergrund (~10:1 Kontrast), analog zum bereits etablierten "bg-warning text-dark"-
   Muster (siehe RingversuchListe/-Detail). */
.nl-badge-warn { background: var(--nl-color-warn); color: var(--nl-color-text-primary, #1A1A2E); }
.nl-badge-nio  { background: var(--nl-color-nio); }
.nl-badge-nb   { background: var(--nl-color-nb); }
.nl-badge-nwg  { background: var(--nl-color-nwg); }
/* Informativ: Parameter bewusst ohne Konformitätsaussage (ISO 17025 §7.8.2.1 lit. n).
   Bewusst neutraler Blauton statt grün — KEIN Konformitätssymbol. */
.nl-badge-informativ { background: var(--nl-color-informativ, #475569); }

/* ---------------------------------------------------------------------
   Versionierungs-Status Badges
   --------------------------------------------------------------------- */
.nl-status-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    letter-spacing: 0.03em;
    line-height: 1.4;
    color: #fff;
}

.nl-status-entwurf       { background: var(--nl-color-entwurf); }
.nl-status-zur-freigabe  { background: var(--nl-color-zur-freigabe); }
.nl-status-freigegeben   { background: var(--nl-color-freigegeben); }
.nl-status-abgelehnt     { background: var(--nl-color-abgelehnt); }
.nl-status-archiviert    { background: var(--nl-color-archiviert); }

/* ---------------------------------------------------------------------
   ErgebnisStatus Badges (Freigegeben / Gesperrt / Verworfen)
   Welle 4 Batch I — ersetzt das rohe bg-success/bg-warning/bg-light-Mapping
   in ProbeDetail.razor (siehe ErgebnisStatusBadge.razor). Gleiche
   Solid-Pill-Optik wie .nl-status-badge/.nl-bewertungs-badge oben.
   "Gesperrt" bewusst rot (--nl-color-nio) statt Amber — analog zum
   ProbeStatusBadge-Gesperrt (konsistente "Gesperrt = rot"-Sprache im
   ganzen Produkt). "Verworfen" nutzt denselben Graustufen-Ton wie
   --nl-color-entwurf (bereits als Weiss-auf-Grau erprobt).
   --------------------------------------------------------------------- */
.nl-ergebnisstatus-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    letter-spacing: 0.03em;
    line-height: 1.4;
    color: #fff;
}

.nl-ergebnisstatus-freigegeben { background: var(--nl-color-freigegeben); }
.nl-ergebnisstatus-gesperrt    { background: var(--nl-color-nio); }
.nl-ergebnisstatus-verworfen   { background: var(--nl-color-nb); }

/* ---------------------------------------------------------------------
   Generischer Lifecycle-Status-Badge (Welle C, Rest-Backlog 2026-07-13,
   Design-Audit docs/gesamtanalyse-2026-07-13/02-design.md P1-2/P1-3).
   Ersetzt die rohen bg-success/bg-danger/bg-warning/bg-secondary/bg-info-
   Badges der 2026-06/07-Module (Endprodukt-/Wareneingangschargen,
   Chargenzeugnis/CoA, Ringversuche, Produktionsplanung-Import/-Zeilen).
   Bewusst EIN gemeinsamer Namespace für alle sechs neuen Status-Enums
   statt sechs separater, fast identischer Kopien — siehe Design-Audit
   Abschnitt 6 P1-2 ("… bzw. ein gemeinsamer generischer nl-status-badge-
   Helfer mit Farb-Dictionary" als ausdrücklich sanktionierte Alternative
   zu Einzel-Components). Farbsemantik deckungsgleich mit der etablierten
   io/warn/nio/nb-Ampel-Logik (nl-bewertungs-badge), aber EIGENER
   Klassenname/Namespace, damit eine spätere Anpassung von nl-badge-*
   nicht versehentlich alle Lifecycle-Domänen mitzieht (Kollisions-Lehre
   aus ProbeStatusBadge.razor). "warn" bewusst mit dunklem Text (siehe
   Kontrast-Begründung bei .nl-badge-warn oben) — alle anderen Varianten
   sind gegen Weiß WCAG-AA-konform (≥ 4,5:1) geprüft.
   --------------------------------------------------------------------- */
.nl-lc-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs, 0.75rem);
    font-weight: 600;
    letter-spacing: 0.03em;
    line-height: 1.4;
    color: #fff;
    white-space: nowrap;
}
.nl-lc-io      { background: var(--nl-color-io); }
.nl-lc-warn    { background: var(--nl-color-warn); color: var(--nl-color-text-primary, #1A1A2E); }
.nl-lc-nio     { background: var(--nl-color-nio); }
.nl-lc-nb      { background: var(--nl-color-nb); }
.nl-lc-info    { background: var(--nl-color-info-strong); }
.nl-lc-primary { background: var(--nl-color-primary); }
.nl-lc-muted   { background: var(--nl-color-archiviert); color: var(--nl-color-text-secondary, #374151); }

/* ---------------------------------------------------------------------
   Pruefmittel-Status-Badges (global)
   [Welle 4 Batch III] Vorher identisch 3x scoped kopiert in
   PruefmittelDetail.razor.css, PruefmittelListe.razor.css und
   PruefmittelTermine.razor.css. Die Klassen werden im Markup rein per
   Klassenname gesetzt (kein ::deep/Scope-Bezug in den Komponenten), daher
   verhält sich der globale Block identisch zu den 3 vorherigen scoped Kopien —
   jetzt nur noch eine Quelle statt drei.
   --------------------------------------------------------------------- */
.nl-krit {
    display: inline-block;
    width: 24px;
    text-align: center;
    border-radius: 4px;
    font-weight: 700;
    font-size: 0.78rem;
    padding: 1px 4px;
    color: white;
}
.nl-krit-a { background: var(--nl-color-nio, #DC2626); }
.nl-krit-b { background: var(--nl-color-warn, #D97706); }
.nl-krit-c { background: var(--nl-color-text-secondary, #6B7280); }

.nl-pm-status {
    display: inline-block;
    border-radius: 9999px;
    padding: 2px 10px;
    font-size: 0.75rem;
    font-weight: 600;
    color: white;
    letter-spacing: 0.02em;
}
.nl-pm-status-inbetrieb           { background: var(--nl-color-io, #16A34A); }
.nl-pm-status-kalibrierungfaellig { background: var(--nl-color-warn, #D97706); }
.nl-pm-status-inkalibrierung      { background: var(--nl-color-pm-inkalibrierung, #2563EB); }
.nl-pm-status-eingeschraenkt      { background: var(--nl-color-warn, #D97706); }
.nl-pm-status-ausserbetrieb       { background: var(--nl-color-nio, #DC2626); }
.nl-pm-status-verschrottet        { background: var(--nl-color-pm-verschrottet, #374151); }

/* ---------------------------------------------------------------------
   Versionsketten-Marker & -Historie
   --------------------------------------------------------------------- */
.nl-version-markers {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-left: 6px;
    vertical-align: middle;
}

.nl-version-marker {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 1px 7px;
    border-radius: 9999px;
    font-size: 11px;
    font-weight: 600;
    line-height: 1.4;
    border: 1px solid transparent;
    cursor: help;
}

.nl-version-marker-warn {
    background: rgba(251, 188, 58, 0.12);
    color: var(--nl-color-zur-freigabe);
    border-color: rgba(251, 188, 58, 0.3);
}

.nl-version-marker-draft {
    background: rgba(107, 114, 128, 0.12);
    color: #4b5563;
    border-color: rgba(107, 114, 128, 0.3);
}

.nl-version-marker-archive {
    background: rgba(156, 163, 175, 0.18);
    color: #6b7280;
    border-color: rgba(156, 163, 175, 0.35);
}

.nl-version-history {
    background: #f9fafb;
    border-radius: var(--nl-radius-md);
    padding: 12px 16px;
    border: 1px solid rgba(15, 48, 87, 0.08);
}

.nl-version-history-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    margin-bottom: 8px;
}

.nl-version-history-title {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-primary);
}

.nl-version-history-count {
    font-size: 11px;
    color: var(--nl-color-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.nl-version-history-table {
    width: 100%;
    font-size: var(--nl-font-size-sm);
    border-collapse: collapse;
}

.nl-version-history-table thead th {
    text-align: left;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    padding: 6px 10px;
    border-bottom: 1px solid rgba(15, 48, 87, 0.1);
}

.nl-version-history-table tbody td {
    padding: 8px 10px;
    border-bottom: 1px solid rgba(15, 48, 87, 0.05);
    vertical-align: top;
}

.nl-version-history-table tbody tr:last-child td { border-bottom: none; }

.nl-version-history-table tbody tr.is-head {
    background: rgba(22, 163, 74, 0.06);
}

.nl-version-history-num {
    font-family: var(--nl-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-weight: 600;
    color: var(--nl-color-text-primary);
}

.nl-version-history-badge {
    display: inline-block;
    margin-left: 6px;
    padding: 0 6px;
    border-radius: 9999px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    background: var(--nl-color-freigegeben);
    color: #fff;
}

.nl-list-toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    padding: 6px 12px;
    background: var(--nl-color-bg-card);
    border: 1px solid rgba(15, 48, 87, 0.06);
    border-radius: var(--nl-radius-md);
    box-shadow: var(--nl-shadow-sm);
}

/* Tabs auf der Grenzwertset-Liste — Bootstrap nav-tabs leicht angepasst. */
.nl-grenzwertset-tabs .nav-link {
    color: var(--nl-color-text-primary);
    border: none;
    border-bottom: 2px solid transparent;
    background: transparent;
    padding: 8px 14px;
}

.nl-grenzwertset-tabs .nav-link:hover {
    background: rgba(15, 48, 87, 0.04);
}

.nl-grenzwertset-tabs .nav-link.active {
    color: var(--nl-color-primary);
    border-bottom-color: var(--nl-color-primary);
    background: transparent;
    font-weight: 600;
}

.nl-list-toolbar-info {
    margin-left: auto;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
}

/* ---------------------------------------------------------------------
   Probenbaum-Knoten (Vorbereitung)
   --------------------------------------------------------------------- */
.nl-probe-node {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 8px;
    border-radius: var(--nl-radius-sm);
    border-left: 3px solid transparent;
    transition: background 0.15s;
}

.nl-probe-node:hover { background: var(--nl-color-surface-hover); }
.nl-probe-node.nl-selected { background: #DBEAFE; border-left-color: var(--nl-color-primary); }

.nl-probe-typ-original         { border-left-color: var(--nl-color-probe-original); }
.nl-probe-typ-teilung          { border-left-color: var(--nl-color-probe-teilung); }
.nl-probe-typ-nachuntersuchung { border-left-color: var(--nl-color-probe-nachuntersuchung); }
.nl-probe-typ-rueckstellprobe  { border-left-color: var(--nl-color-probe-rueckstellprobe); }
.nl-probe-typ-blindwert        { border-left-color: var(--nl-color-probe-blindwert); }
.nl-probe-typ-duplikat         { border-left-color: var(--nl-color-probe-duplikat); }

/* ---------------------------------------------------------------------
   [E-26] Probentyp-Legende (unter den Filter-Chips der Probenliste)
   Kompakte horizontale Zeile: Farbpunkt + Label für jeden der 6 Probentypen.
   Nur CSS-Token werden verwendet — kein Hardcoding.
   Markup liefert blazor-devexpress (ProbenListe.razor / ProbenFilter).
   --------------------------------------------------------------------- */
.nl-probe-legend {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    padding: 6px 0 2px;
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
}

/* Einzelner Legende-Eintrag: Farbpunkt + Text nebeneinander */
.nl-probe-legend-item {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    white-space: nowrap;
}

/* Farbiger Kreis — background wird per Inline-Modifier gesetzt (s. u.) */
.nl-probe-legend-dot {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
}

/* Farben der Legende — exakt dieselben Tokens wie Probenbaum-Kanten */
.nl-probe-legend-dot.nl-probe-typ-original         { background: var(--nl-color-probe-original); }
.nl-probe-legend-dot.nl-probe-typ-teilung          { background: var(--nl-color-probe-teilung); }
.nl-probe-legend-dot.nl-probe-typ-nachuntersuchung { background: var(--nl-color-probe-nachuntersuchung); }
.nl-probe-legend-dot.nl-probe-typ-rueckstellprobe  { background: var(--nl-color-probe-rueckstellprobe); }
.nl-probe-legend-dot.nl-probe-typ-blindwert        { background: var(--nl-color-probe-blindwert); }
.nl-probe-legend-dot.nl-probe-typ-duplikat         { background: var(--nl-color-probe-duplikat); }

/* ---------------------------------------------------------------------
   KPI-Cards (Dashboard)
   --------------------------------------------------------------------- */
.nl-kpi-card {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    padding: 20px 24px;
    box-shadow: var(--nl-shadow-sm);
    border-top: 4px solid var(--nl-color-primary);
    display: flex;
    flex-direction: column;
    gap: 6px;
    min-height: 110px;
}

/* Rollen-Permission-Matrix (Benutzer → Rollen verwalten).
   Zeilen sind Permissions, Spalten sind Rollen — sticky erste Spalte für Scroll. */
.nl-rollen-matrix th, .nl-rollen-matrix td {
    font-size: 13px;
    vertical-align: middle;
}

.nl-rollen-matrix-head {
    display: flex;
    flex-direction: column;
    align-items: center;
    line-height: 1.2;
    gap: 2px;
}

.nl-rollen-matrix-gruppe {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--nl-color-text-secondary);
    padding: 8px 12px !important;
    background: rgba(15, 48, 87, 0.04) !important;
}

/* Benachrichtigungs-Liste — kompakte Zeilen, ungelesene farblich abgehoben. */
.nl-benachrichtigung-item {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 8px 12px;
    border-bottom: 1px solid rgba(15, 48, 87, 0.06);
}

.nl-benachrichtigung-item:last-child {
    border-bottom: none;
}

.nl-benachrichtigung-ungelesen {
    background: rgba(38, 39, 102, 0.04);
    border-left: 3px solid var(--nl-color-primary, #262766);
    padding-left: 9px;
}

.nl-benachrichtigung-icon {
    font-size: 1.1rem;
    line-height: 1.2;
    flex-shrink: 0;
}

.nl-benachrichtigung-titel {
    font-weight: 600;
    color: var(--nl-color-text-primary);
    text-decoration: none;
}

.nl-benachrichtigung-titel:hover {
    color: var(--nl-color-primary);
    text-decoration: underline;
}

/* Klickbare Kennzahl-Card — visuelles Affordance, Hover-Lift, klare Link-Semantik. */
a.nl-kpi-card-link {
    color: inherit;
    text-decoration: none;
    cursor: pointer;
    transition: transform 0.12s ease, box-shadow 0.15s ease;
}

a.nl-kpi-card-link:hover {
    transform: translateY(-1px);
    box-shadow: 0 4px 12px rgba(15, 48, 87, 0.12);
}

a.nl-kpi-card-link:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
}

.nl-kpi-card .nl-kpi-titel {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.nl-kpi-card .nl-kpi-wert {
    font-size: var(--nl-font-size-2xl);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    line-height: 1.2;
}

.nl-kpi-card .nl-kpi-trend {
    font-size: var(--nl-font-size-sm);
    font-weight: 500;
    color: var(--nl-color-text-secondary);
}

.nl-kpi-card .nl-kpi-trend.nl-trend-up   { color: var(--nl-color-io); }
.nl-kpi-card .nl-kpi-trend.nl-trend-down { color: var(--nl-color-nio); }

.nl-kpi-card.nl-kpi-warnung  { border-top-color: var(--nl-color-warn); }
.nl-kpi-card.nl-kpi-kritisch { border-top-color: var(--nl-color-nio); }

/* ---------------------------------------------------------------------
   Landing-Page Styles
   --------------------------------------------------------------------- */
.nl-landing {
    font-family: var(--nl-font-family);
    color: var(--nl-color-text-primary);
    background: var(--nl-color-bg);
    min-height: 100vh;
    display: flex;
    flex-direction: column;
}

.nl-landing-nav {
    background: var(--nl-color-bg-card);
    box-shadow: var(--nl-shadow-sm);
    padding: 14px 0;
}

.nl-landing-nav .nl-brand {
    font-weight: 700;
    font-size: var(--nl-font-size-xl);
    /* "Proba" in Mittelblau auf hellem Nav-Hintergrund. */
    color: var(--nl-color-brand-mid, #5678b5);
    letter-spacing: -0.01em;
}

.nl-landing-nav .nl-brand-dot {
    /* "Lab" in Navy — Brand-Wortmarken-Logik. */
    color: var(--nl-color-brand-navy, #262766);
}

.nl-hero {
    padding: 80px 0 64px;
    background: linear-gradient(135deg, var(--nl-color-primary-dark, #1a1b4b) 0%, var(--nl-color-primary, #262766) 60%, var(--nl-color-primary-light, #5678b5) 100%);
    color: var(--nl-color-text-inverted);
    position: relative;
    overflow: hidden;
}

.nl-hero::before {
    content: "";
    position: absolute;
    inset: 0;
    background-image:
        radial-gradient(circle at 20% 20%, rgba(251, 188, 58, 0.25), transparent 40%),
        radial-gradient(circle at 80% 80%, rgba(91, 141, 184, 0.30), transparent 45%);
    pointer-events: none;
}

.nl-hero > .container { position: relative; }

.nl-hero h1 {
    font-size: clamp(2rem, 4.5vw, 3.25rem);
    font-weight: 700;
    line-height: 1.15;
    margin-bottom: 1rem;
    letter-spacing: -0.02em;
}

.nl-hero .nl-hero-pitch {
    font-size: var(--nl-font-size-lg);
    line-height: 1.55;
    color: rgba(255, 255, 255, 0.88);
    max-width: 640px;
    margin-bottom: 2rem;
}

/* Hero-H1 mit Akzent-Zeile (Teal) für „ISO 17025 by design"-Aussage. */
.nl-hero-h1-accent {
    color: var(--nl-color-accent);
    font-weight: 700;
}

/* Trustline unter den Hero-CTAs ("Keine Kreditkarte · EU-Hosting · ..."). */
.nl-hero-trustline {
    margin-top: 1.5rem;
    font-size: var(--nl-font-size-sm);
    color: rgba(255, 255, 255, 0.65);
    letter-spacing: 0.02em;
}

/* Hero-KPI-Stack: drei leicht gekippte Cards rechts im Hero, sollen das Produkt
   sofort als „echt gebaut" signalisieren statt nur deklarativ zu beschreiben. */
.nl-hero-kpi-stack {
    display: flex;
    flex-direction: column;
    gap: 14px;
    transform: rotate(-1.5deg);
}

.nl-hero-kpi-card {
    background: var(--nl-color-bg-card);
    border-radius: 10px;
    padding: 14px 18px;
    box-shadow: 0 10px 32px rgba(15, 48, 87, 0.30);
    border-top: 3px solid var(--nl-color-primary);
    color: var(--nl-color-text-primary);
}

.nl-hero-kpi-card.nl-kpi-warnung  { border-top-color: var(--nl-color-warn); }
.nl-hero-kpi-card.nl-kpi-kritisch { border-top-color: var(--nl-color-nio); }

.nl-hero-kpi-card .nl-kpi-titel {
    font-size: var(--nl-font-size-xs);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--nl-color-text-secondary);
    margin-bottom: 4px;
}

.nl-hero-kpi-card .nl-kpi-wert {
    font-size: 1.75rem;
    font-weight: 700;
    line-height: 1.1;
    color: var(--nl-color-text-primary);
}

.nl-hero-kpi-card .nl-kpi-trend {
    font-size: var(--nl-font-size-xs);
    margin-top: 2px;
    color: var(--nl-color-text-secondary);
}

.nl-hero-kpi-card .nl-kpi-trend.nl-trend-up   { color: var(--nl-color-io); }
.nl-hero-kpi-card .nl-kpi-trend.nl-trend-down { color: var(--nl-color-nio); }

.nl-hero .nl-eyebrow {
    display: inline-block;
    text-transform: uppercase;
    letter-spacing: 0.12em;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    /* Auf dunklem Hero-Hintergrund: helles Mittelblau-Tint mit hellblauem Text fuer
       maximalen Kontrast. */
    color: #B7CBEA;
    background: rgba(86, 120, 181, 0.25);
    padding: 6px 12px;
    border-radius: 9999px;
    margin-bottom: 1.25rem;
}

.nl-btn-cta {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    /* Mittelblau-CTA (SaaS-Stil) — Gold bleibt sparsam fuer Logo + Status-Highlights. */
    background: var(--nl-color-brand-mid, #5678b5);
    color: #fff;
    border: none;
    padding: 14px 28px;
    font-weight: 600;
    font-size: var(--nl-font-size-base);
    border-radius: var(--nl-radius-md);
    text-decoration: none;
    transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
    box-shadow: 0 6px 16px rgba(86, 120, 181, 0.35);
}

.nl-btn-cta:hover {
    /* Hover: Navy (dunkler) — Brand-Stack visuell durch (Mid -> Navy). */
    background: var(--nl-color-brand-navy, #262766);
    color: #fff;
    transform: translateY(-1px);
    box-shadow: 0 10px 22px rgba(38, 39, 102, 0.40);
}

.nl-btn-secondary {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: transparent;
    color: #fff;
    border: 1px solid rgba(255, 255, 255, 0.4);
    padding: 14px 24px;
    font-weight: 500;
    border-radius: var(--nl-radius-md);
    text-decoration: none;
    transition: background 0.15s ease, border-color 0.15s ease;
}

.nl-btn-secondary:hover {
    background: rgba(255, 255, 255, 0.10);
    border-color: rgba(255, 255, 255, 0.7);
    color: #fff;
}

.nl-section {
    padding: 64px 0;
}

.nl-section-title {
    font-size: var(--nl-font-size-2xl);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin-bottom: 0.5rem;
    letter-spacing: -0.01em;
}

.nl-section-lead {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-base);
    max-width: 640px;
    margin-bottom: 2.5rem;
}

.nl-feature-card {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    padding: 28px 24px;
    box-shadow: var(--nl-shadow-sm);
    height: 100%;
    transition: transform 0.15s ease, box-shadow 0.15s ease;
    border: 1px solid rgba(15, 48, 87, 0.06);
}

.nl-feature-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--nl-shadow-md);
}

.nl-feature-icon {
    width: 44px;
    height: 44px;
    border-radius: var(--nl-radius-md);
    background: rgba(38, 39, 102, 0.10);
    color: var(--nl-color-primary);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.25rem;
    font-weight: 700;
    margin-bottom: 1rem;
}

.nl-feature-card h3 {
    font-size: var(--nl-font-size-lg);
    font-weight: 600;
    color: var(--nl-color-text-primary);
    margin-bottom: 0.5rem;
}

.nl-feature-card p {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
    line-height: 1.55;
    margin-bottom: 0;
}

.nl-footer {
    background: var(--nl-color-bg-footer, #262766);
    color: rgba(255, 255, 255, 0.78);
    padding: 32px 0;
    margin-top: auto;
    font-size: var(--nl-font-size-sm);
}

.nl-footer a {
    color: rgba(255, 255, 255, 0.78);
    text-decoration: none;
    margin-left: 1.25rem;
}

.nl-footer a:hover {
    color: #fff;
    text-decoration: underline;
}

/* Wortmarke im Footer — auf dunklem Brand-Navy invertiert wie in der Sidebar
   (Proba Mittelblau bleibt sichtbar, Lab Weiss statt Navy, das auf Navy-BG verschwinden wuerde). */
.nl-footer .nl-brand {
    font-weight: 700;
    font-size: var(--nl-font-size-xl);
    color: var(--nl-color-brand-mid, #5678b5);
    letter-spacing: -0.01em;
}

.nl-footer .nl-brand-dot {
    color: #fff;
}

@media (max-width: 768px) {
    .nl-hero { padding: 56px 0 48px; }
    .nl-section { padding: 48px 0; }
    .nl-footer { text-align: center; }
    .nl-footer a { display: inline-block; margin: 4px 8px; }
    .nl-footer .nl-footer-links { margin-top: 8px; }
}

/* ---------------------------------------------------------------------
   Pricing-Teaser (auf Landing) und volle Pricing-Seite (/abo)
   --------------------------------------------------------------------- */
.nl-pricing-teaser {
    background: var(--nl-color-bg-card);
    border: 1px solid rgba(15, 48, 87, 0.08);
    border-radius: var(--nl-radius-lg);
    padding: 24px;
    height: 100%;
    transition: transform 0.15s ease, box-shadow 0.15s ease;
    box-shadow: var(--nl-shadow-sm);
}

.nl-pricing-teaser:hover {
    transform: translateY(-2px);
    box-shadow: var(--nl-shadow-md);
}

.nl-pricing-teaser .nl-pricing-name {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--nl-color-text-secondary);
}

.nl-pricing-teaser .nl-pricing-preis {
    font-size: var(--nl-font-size-2xl);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin: 6px 0 12px;
}

.nl-pricing-teaser .nl-pricing-preis span {
    font-size: var(--nl-font-size-sm);
    font-weight: 500;
    color: var(--nl-color-text-secondary);
    margin-left: 4px;
}

.nl-pricing-teaser p {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
    line-height: 1.55;
    margin-bottom: 0;
}

.nl-pricing-teaser.nl-pricing-featured {
    border: 2px solid var(--nl-color-brand-mid, #5678b5);
    box-shadow: 0 8px 24px rgba(86, 120, 181, 0.18);
    position: relative;
}

.nl-pricing-teaser.nl-pricing-featured::after {
    content: "Beliebt";
    position: absolute;
    top: -12px;
    right: 16px;
    background: var(--nl-color-brand-mid, #5678b5);
    color: #fff;
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    padding: 4px 10px;
    border-radius: 9999px;
}

/* Pricing-Seite (volle Karten mit Feature-Liste & CTA) */
.nl-pricing-card {
    background: var(--nl-color-bg-card);
    border: 1px solid rgba(15, 48, 87, 0.08);
    border-radius: var(--nl-radius-lg);
    padding: 32px 28px;
    height: 100%;
    display: flex;
    flex-direction: column;
    box-shadow: var(--nl-shadow-sm);
    transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.nl-pricing-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--nl-shadow-md);
}

.nl-pricing-card.nl-pricing-card-featured {
    border: 2px solid var(--nl-color-brand-mid, #5678b5);
    box-shadow: 0 12px 32px rgba(86, 120, 181, 0.20);
    position: relative;
}

.nl-pricing-card.nl-pricing-card-featured::after {
    content: "Beliebt";
    position: absolute;
    top: -14px;
    left: 50%;
    transform: translateX(-50%);
    background: var(--nl-color-brand-mid, #5678b5);
    color: #fff;
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    padding: 5px 14px;
    border-radius: 9999px;
}

.nl-pricing-card .nl-pricing-name {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--nl-color-text-secondary);
}

.nl-pricing-card .nl-pricing-preis {
    font-size: 2.25rem;
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin: 8px 0 4px;
    line-height: 1.1;
}

.nl-pricing-card .nl-pricing-preis span {
    font-size: var(--nl-font-size-base);
    font-weight: 500;
    color: var(--nl-color-text-secondary);
    margin-left: 4px;
}

.nl-pricing-card .nl-pricing-pitch {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
    margin: 4px 0 20px;
    min-height: 42px;
}

.nl-pricing-card ul.nl-pricing-features {
    list-style: none;
    padding: 0;
    margin: 0 0 24px;
    flex: 1;
}

.nl-pricing-card ul.nl-pricing-features li {
    padding: 8px 0 8px 26px;
    position: relative;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
    border-bottom: 1px solid rgba(15, 48, 87, 0.05);
}

.nl-pricing-card ul.nl-pricing-features li:last-child {
    border-bottom: none;
}

.nl-pricing-card ul.nl-pricing-features li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 12px;
    width: 16px;
    height: 16px;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2316A34A' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>");
    background-repeat: no-repeat;
    background-size: 16px 16px;
}

.nl-pricing-card .nl-pricing-cta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    width: 100%;
    background: var(--nl-color-bg);
    color: var(--nl-color-primary);
    border: 1px solid var(--nl-color-primary);
    padding: 12px 20px;
    font-weight: 600;
    font-size: var(--nl-font-size-base);
    border-radius: var(--nl-radius-md);
    text-decoration: none;
    transition: background 0.15s ease, color 0.15s ease;
}

.nl-pricing-card .nl-pricing-cta:hover {
    background: var(--nl-color-primary);
    color: #fff;
}

.nl-pricing-card.nl-pricing-card-featured .nl-pricing-cta {
    background: var(--nl-color-brand-mid, #5678b5);
    color: #fff;
    border-color: var(--nl-color-brand-mid, #5678b5);
}

.nl-pricing-card.nl-pricing-card-featured .nl-pricing-cta:hover {
    background: var(--nl-color-brand-navy, #262766);
    border-color: var(--nl-color-brand-navy, #262766);
}

/* ---------------------------------------------------------------------
   Footer (erweitert mit mehreren Spalten)
   --------------------------------------------------------------------- */
.nl-footer-spalte-titel {
    font-weight: 600;
    color: #fff;
    margin-bottom: 10px;
    font-size: var(--nl-font-size-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

.nl-footer-liste {
    list-style: none;
    padding: 0;
    margin: 0;
}

.nl-footer-liste li {
    margin-bottom: 6px;
}

.nl-footer-liste li a {
    margin-left: 0;
    opacity: 0.78;
}

/* ---------------------------------------------------------------------
   Sekundär-Button als helle Variante (auf weißem/hellem Hintergrund)
   --------------------------------------------------------------------- */
.nl-btn-secondary.nl-btn-secondary-light {
    color: var(--nl-color-primary);
    border: 1px solid var(--nl-color-primary);
}

.nl-btn-secondary.nl-btn-secondary-light:hover {
    background: var(--nl-color-primary);
    color: #fff;
    border-color: var(--nl-color-primary);
}

/* ---------------------------------------------------------------------
   Auth-Formular (Login, Registrierung) – zentriertes Card-Layout
   --------------------------------------------------------------------- */
.nl-auth-wrapper {
    min-height: calc(100vh - 0px);
    background: linear-gradient(135deg, var(--nl-color-primary-dark, #1a1b4b) 0%, var(--nl-color-primary, #262766) 100%);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 40px 16px;
}

.nl-auth-card {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    box-shadow: 0 20px 60px rgba(15, 48, 87, 0.30);
    padding: 36px 36px 32px;
    width: 100%;
    max-width: 520px;
}

.nl-auth-card.nl-auth-card-wide {
    max-width: 640px;
}

.nl-auth-card .nl-auth-brand {
    display: block;
    text-align: center;
    color: var(--nl-color-primary);
    font-weight: 700;
    font-size: var(--nl-font-size-xl);
    text-decoration: none;
    margin-bottom: 8px;
}

.nl-auth-card .nl-auth-brand .nl-brand-dot { color: var(--nl-color-accent); }

.nl-auth-card h1 {
    font-size: var(--nl-font-size-2xl);
    font-weight: 700;
    margin-bottom: 4px;
    text-align: center;
    color: var(--nl-color-text-primary);
}

.nl-auth-card .nl-auth-sub {
    text-align: center;
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
    margin-bottom: 24px;
}

.nl-auth-card label.form-label {
    font-weight: 500;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
    margin-bottom: 4px;
}

.nl-auth-card .form-control {
    font-size: var(--nl-font-size-base);
    padding: 10px 12px;
}

.nl-auth-card .nl-subdomain-zeile {
    display: flex;
    align-items: stretch;
}

.nl-auth-card .nl-subdomain-zeile .form-control {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}

.nl-auth-card .nl-subdomain-suffix {
    background: var(--nl-color-bg);
    color: var(--nl-color-text-secondary);
    border: 1px solid #ced4da;
    border-left: 0;
    border-top-right-radius: var(--nl-radius-md);
    border-bottom-right-radius: var(--nl-radius-md);
    padding: 10px 14px;
    font-size: var(--nl-font-size-sm);
    display: flex;
    align-items: center;
}

.nl-auth-card .nl-subdomain-hinweis {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    margin-top: 4px;
}

.nl-auth-card .nl-subdomain-hinweis.nl-status-frei { color: var(--nl-color-io); }
.nl-auth-card .nl-subdomain-hinweis.nl-status-belegt { color: var(--nl-color-nio); }

.nl-auth-card .nl-auth-submit {
    width: 100%;
    background: var(--nl-color-accent);
    color: #fff;
    border: none;
    padding: 12px 18px;
    font-weight: 600;
    border-radius: var(--nl-radius-md);
    font-size: var(--nl-font-size-base);
    transition: background 0.15s ease;
    margin-top: 8px;
}

.nl-auth-card .nl-auth-submit:hover { background: #00BFA9; }
.nl-auth-card .nl-auth-submit:disabled { opacity: 0.6; cursor: not-allowed; }

.nl-auth-card .nl-auth-foot {
    text-align: center;
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
    margin-top: 18px;
}

.nl-auth-card .nl-auth-foot a {
    color: var(--nl-color-primary);
    text-decoration: none;
    font-weight: 500;
}

.nl-auth-card .nl-auth-foot a:hover { text-decoration: underline; }

/* =====================================================================
   Dashboard (Tenant-Startseite /dashboard)
   ===================================================================== */
.nl-dashboard {
    display: flex;
    flex-direction: column;
    gap: 24px;
}

.nl-dashboard-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 24px;
    flex-wrap: wrap;
}

.nl-eyebrow-mini {
    display: inline-block;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    /* Auf hellem Section-Hintergrund: Mittelblau-Text auf Mittelblau-Tint. */
    color: var(--nl-color-brand-mid, #5678b5);
    background: rgba(86, 120, 181, 0.12);
    padding: 4px 10px;
    border-radius: 9999px;
    margin-bottom: 0.5rem;
}

.nl-dashboard-title {
    font-size: var(--nl-font-size-2xl);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin: 0 0 0.5rem 0;
    letter-spacing: -0.01em;
}

.nl-text-primary { color: var(--nl-color-primary); }
.nl-text-secondary { color: var(--nl-color-text-secondary); }

/* [E-15] Status-Text-Utilities — Ersatz für Bootstrap text-danger/-warning/-success.
   Alle auf --nl-*-Token gemappt; kompatibel mit Dark-Mode und Theme-Wechsel.
   Ergänzend zu den Bewertungs-Badges für fließenden Text und Inline-Hinweise. */
.nl-text-nio  { color: var(--nl-color-nio); }   /* n.i.O.  — Ersatz für text-danger  */
.nl-text-warn { color: var(--nl-color-warn); }  /* Warnung — Ersatz für text-warning */
.nl-text-ok   { color: var(--nl-color-io); }    /* i.O.    — Ersatz für text-success */

.nl-dashboard-sub {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-base);
    max-width: 720px;
    margin: 0;
}

.nl-btn-cta-compact {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--nl-color-brand-mid, #5678b5);
    color: #fff;
    border: none;
    padding: 10px 20px;
    font-weight: 600;
    font-size: var(--nl-font-size-sm);
    border-radius: var(--nl-radius-md);
    text-decoration: none;
    transition: background 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
    box-shadow: 0 4px 10px rgba(86, 120, 181, 0.30);
}

.nl-btn-cta-compact:hover {
    background: var(--nl-color-brand-navy, #262766);
    color: #fff;
    transform: translateY(-1px);
}

.nl-dashboard-login-hint {
    background: rgba(217, 119, 6, 0.08);
    border: 1px solid rgba(217, 119, 6, 0.30);
    border-radius: var(--nl-radius-md);
    padding: 14px 18px;
    color: var(--nl-color-text-primary);
    font-size: var(--nl-font-size-sm);
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}

.nl-dashboard-login-hint strong {
    color: var(--nl-color-warn);
}

.nl-link-strong {
    color: var(--nl-color-primary);
    font-weight: 600;
    text-decoration: none;
    margin-left: auto;
}

.nl-link-strong:hover {
    text-decoration: underline;
}

.nl-dashboard-kpis {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 16px;
}

.nl-dashboard-hint {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    padding: 24px;
    box-shadow: var(--nl-shadow-sm);
    border: 1px solid rgba(15, 48, 87, 0.06);
}

.nl-section-title-sm {
    font-size: var(--nl-font-size-lg);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin: 0 0 0.5rem 0;
    letter-spacing: -0.01em;
}

.nl-quick-actions {
    margin-top: 16px;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 12px;
}

.nl-quick-action {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 14px;
    border-radius: var(--nl-radius-md);
    border: 1px solid rgba(15, 48, 87, 0.10);
    background: var(--nl-color-bg);
    text-decoration: none;
    color: var(--nl-color-text-primary);
    transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}

.nl-quick-action:hover {
    border-color: var(--nl-color-primary-light);
    transform: translateY(-1px);
    box-shadow: var(--nl-shadow-sm);
    color: var(--nl-color-text-primary);
}

.nl-quick-action-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 8px;
    background: rgba(38, 39, 102, 0.10);
    color: var(--nl-color-primary);
    flex-shrink: 0;
}

.nl-quick-action-titel {
    display: block;
    font-weight: 600;
    font-size: var(--nl-font-size-base);
    color: var(--nl-color-text-primary);
}

.nl-quick-action-text {
    display: block;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
}

/* =====================================================================
   Aufträge - Master-Detail-Seite
   ===================================================================== */
/* AuftragListe: füllt den Viewport (Topbar 56 + Content-Padding 24+24 abziehen).
   Dadurch teilen sich Master/Detail (oben) und Probenbaum (unten) gleichmäßig
   den verbleibenden Platz – konkret 50/50 dank flex:1 auf beiden Reihen. */
.nl-auftraege-page {
    font-family: var(--nl-font-family);
    color: var(--nl-color-text-primary);
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-height: calc(100vh - 56px - 48px);
}

.nl-auftraege-page > .nl-page-head {
    flex: 0 0 auto;
}

/* Master-Detail-Row und Probenbaum-Row teilen sich die Page 50/50. */
.nl-auftraege-page > .nl-master-detail,
.nl-auftraege-page > .nl-probenbaum-row {
    flex: 1 1 0;
    min-height: 0;
    margin: 0;
    /* [LAY-FIX-ITER2-2026-05-27] overflow:hidden damit Grid-Cards nicht in die
       nl-context-bar hineinragen (Bootstrap-Col margin-top laesst .nl-master
       um gutter-y ueberlaufen). */
    overflow: hidden;
}

/* Detail-Card kann mehr Inhalt haben als die Master-Detail-Row hoch ist (Action-Bar
   + Summary + Meta-Liste + Zusatzfelder). Statt überlaufen scrollt sie intern. */
.nl-master-detail .nl-detail > .nl-card {
    overflow-y: auto;
}

.nl-master-detail {
    align-items: stretch;
}

/* [LAY-FIX-2026-05-27] col-12 von Bootstrap setzt flex:0 0 auto — damit bleibt height:auto.
   Explizit height:100% + align-self:stretch stellt sicher, dass .nl-master die
   volle Hoehe der Bootstrap-Row (.nl-master-detail) annimmt und .nl-card darin 100% bekommt. */
.nl-master-detail .nl-master,
.nl-master-detail .nl-detail {
    display: flex;
    flex-direction: column;
    min-height: 0;
    height: 100%;
    align-self: stretch;
    overflow: hidden;
}

/* [LAY-FIX-ITER2-2026-05-27] Bootstrap g-3 setzt margin-top: var(--bs-gutter-y) = 16px
   auf Col-Kinder. Diese Row hat bereits margin:0 gesetzt (kein negativer Row-Offset),
   der Col-margin-top erzeugt aber trotzdem einen 16px Whitespace zwischen
   nl-toolbar-flat und der Grid-Card. Neutralisieren. */
.nl-auftraege-page > .nl-master-detail > [class*="col-"],
.nl-auftraege-page > .nl-probenbaum-row > [class*="col-"] {
    margin-top: 0;
}

/* Karten innerhalb der 50/50-Reihen sollen die volle Höhe ausfüllen. */
.nl-master-detail .nl-master > .nl-card,
.nl-master-detail .nl-detail > .nl-card,
.nl-probenbaum-row > [class*="col-"] > .nl-card {
    height: 100%;
    display: flex;
    flex-direction: column;
    min-height: 0;
}

/* DxGrid in der Master-Spalte den Restplatz füllen lassen. */
.nl-master-detail .nl-master .nl-auftrag-grid {
    flex: 1 1 0;
    min-height: 0;
}

.nl-card {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    padding: 16px;
    box-shadow: var(--nl-shadow-sm);
    border: 1px solid rgba(15, 48, 87, 0.06);
    height: 100%;
    display: flex;
    flex-direction: column;
}

.nl-empty-hint {
    align-items: center;
    justify-content: center;
    text-align: center;
    min-height: 240px;
}

/* Dashboards-Hub-Karten — anklickbare Vorschau-Karte mit subtilem Hover. */
.nl-dashboard-card {
    cursor: pointer;
    transition: box-shadow 0.15s ease, transform 0.15s ease;
}

.nl-dashboard-card:hover {
    box-shadow: var(--nl-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.08));
    transform: translateY(-1px);
}

.nl-fav-star {
    color: #f1b900;
    margin-right: 4px;
}

/* DxDashboard ist ein DIV ohne intrinsische Hoehe — Host-Container muss seine
   Hoehe + Breite vollstaendig auf den DxDashboard-Wrapper durchreichen. */
.nl-dashboard-host > div {
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
    height: 100%;
}

/* DevExpress-Dashboard-Hintergrund an die Seitenfarbe angleichen.
   Echte DevExpress-Klasse via Playwright-DOM-Inspect ermittelt:
   .dx-dashboard-widget-container hat default rgb(239,239,239). Der Selector
   liegt innerhalb von .nl-dashboard-host, damit andere DevExpress-Komponenten
   (Reporting, Grid) nicht beeinflusst werden.
   Die Item-eigenen Card-Hintergruende (Charts, Grid) bleiben weiss — das ist
   das DevExpress-Item-Styling und sieht visuell wie nl-card aus. */
.nl-dashboard-host .dx-dashboard-widget-container {
    background-color: var(--nl-color-bg) !important;
}

.nl-empty-icon {
    width: 48px;
    height: 48px;
    margin: 0 auto 12px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 9999px;
    background: rgba(91, 141, 184, 0.12);
    color: var(--nl-color-secondary);
}

.nl-empty-icon svg {
    width: 24px;
    height: 24px;
}

.nl-detail-card {
    gap: 8px;
}

.nl-detail-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}

.nl-detail-eyebrow {
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    color: var(--nl-color-text-secondary);
}

.nl-detail-title {
    font-size: var(--nl-font-size-xl);
    font-weight: 700;
    color: var(--nl-color-text-primary);
}

.nl-detail-meta {
    display: grid;
    grid-template-columns: auto 1fr auto 1fr;
    row-gap: 4px;
    column-gap: 16px;
    margin: 8px 0 4px 0;
    font-size: var(--nl-font-size-sm);
}

/* Lange Werte (Notizen, Mehrzeilen-Zusatzfelder) über die volle Zeile spannen. */
.nl-detail-meta dt.nl-detail-meta-wide-label { grid-column: 1; }
.nl-detail-meta dd.nl-detail-meta-wide-value { grid-column: 2 / -1; }

.nl-detail-meta dt {
    color: var(--nl-color-text-secondary);
    font-weight: 500;
}

.nl-detail-meta dd {
    margin: 0;
    color: var(--nl-color-text-primary);
}

.nl-detail-actions {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 4px;
}

/* Mini-Fortschrittsbalken in der Auftragsliste — kompakt, zeigt
   abgeschlossen/gesamt auf einen Blick. */
.nl-fortschritt {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 80px;
}

.nl-fortschritt-bar {
    height: 6px;
    border-radius: 9999px;
    background: rgba(15, 48, 87, 0.08);
    overflow: hidden;
}

.nl-fortschritt-fill {
    display: block;
    height: 100%;
    background: var(--nl-color-primary);
    border-radius: 9999px;
    transition: width 0.2s ease;
}

.nl-fortschritt-label {
    color: var(--nl-color-text-secondary);
    font-size: 0.7rem;
    line-height: 1;
}

/* Bewertungs-Summary in der Auftrag-Detail-Card — vier Kacheln nebeneinander
   mit Befund-Zählern (i.O./Warnung/n.i.O./offen). */
.nl-bewertungs-summary {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 6px;
    margin: 6px 0 4px 0;
}

.nl-bewertungs-summary-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 6px 4px;
    border-radius: var(--nl-radius-md);
    background: var(--nl-color-bg);
    border: 1px solid rgba(15, 48, 87, 0.06);
    line-height: 1.1;
}

.nl-bewertungs-summary-item strong {
    font-size: 1.15rem;
    color: var(--nl-color-text-primary);
}

.nl-bewertungs-summary-item span {
    font-size: 0.7rem;
    color: var(--nl-color-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.nl-bewertungs-summary-io     { border-top: 3px solid var(--nl-color-io, #16A34A); }
.nl-bewertungs-summary-warn   { border-top: 3px solid var(--nl-color-warn, #fbbc3a); }
.nl-bewertungs-summary-nio    { border-top: 3px solid var(--nl-color-nio, #DC2626); }
.nl-bewertungs-summary-offen  { border-top: 3px solid rgba(15, 48, 87, 0.20); }

/* Prominente Action-Bar direkt unter dem Detail-Head — Primär-Aktion sticht heraus,
   Sekundäres (Permalink/Stornieren) dezent. Trennt visuell von den Meta-Daten unten. */
.nl-detail-action-bar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 10px;
    padding: 10px 0;
    margin: 4px 0 10px 0;
    border-top: 1px solid rgba(15, 48, 87, 0.06);
    border-bottom: 1px solid rgba(15, 48, 87, 0.06);
}

/* DxGrid leichte Abstimmung an Card */
.nl-auftrag-grid {
    --nl-grid-radius: var(--nl-radius-md);
}

/* Klickbarer Karten-Header für zuklappbare Sektionen (z. B. Übersicht auf der Probe-Detailseite). */
.nl-collapse-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    background: transparent;
    border: 0;
    padding: 0;
    text-align: left;
    cursor: pointer;
}

.nl-collapse-head:hover .nl-collapse-caret {
    color: var(--nl-color-primary);
}

.nl-collapse-caret {
    display: inline-block;
    width: 14px;
    color: var(--nl-color-text-secondary);
    transition: color 0.15s ease;
}

/* Modifier für DxGrids/DxTreeLists, die den verbleibenden Vertikalraum ihrer
   Card füllen sollen — Voraussetzung: Card ist `display: flex; flex-direction:
   column; min-height: 0`. Die Komponente streckt sich dann auf 100% Höhe der
   Card. Damit bleibt die Spaltenüberschrift sticky und nur der Tabellenkörper
   scrollt. DevExpress gibt die CssClass aufs Component-Root weiter — bei DxGrid
   ist das `.dxbl-grid`, bei DxTreeList eigentlich `.dxbl-grid` (intern Grid-
   basiert), aber zusätzliche Wrapper können den Layout-Fluss brechen. Daher
   forcen wir per Universal-Child, dass alles im nl-grid-fill flext. */
.nl-grid-fill {
    flex: 1 1 auto;
    min-height: 0;
    height: 100%;
    display: flex;
    flex-direction: column;
}

/* DxGrid intern: bei wenigen Datensätzen würde der horizontale Scrollbar mittig im
   Grid hängen (direkt unter den paar Datenreihen), weil der Scroll-Viewer nur so
   hoch ist wie sein Inhalt. Wir lassen NUR den Scroll-Viewer wachsen — Header und
   Pager behalten ihre Content-Höhe (flex-shrink: 0 von DevExpress greift dann). */
.nl-grid-fill > .dxbl-scroll-viewer {
    flex: 1 1 auto;
    min-height: 0;
}

/* Defensive Tweaks: Filter-Row kompakt halten und Aria-only-Texte
   sicher verstecken, falls das DevExpress-Theme einmal nicht greifen sollte.
   Greift NUR im Geltungsbereich der Auftrags-Seite, damit andere Grids
   (Stammdaten) nicht beeinflusst werden. */
.nl-auftrag-grid .dxbl-grid-filter-row .dxbl-edit input,
.nl-auftrag-grid .dxbl-grid-filter-row .dxbl-text-edit-input {
    height: 28px;
    font-size: var(--nl-font-size-sm);
    padding: 2px 8px;
}

.nl-auftrag-grid .dxbl-grid-filter-row {
    line-height: 1.2;
}

.nl-auftrag-grid .dxbl-sr-only,
.nl-auftrag-grid [aria-hidden="false"].dxbl-grid-aria-description {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

/* SVG-Icons in DxGrid (Suche, Filter-Operator) auf vernünftige Größe
   begrenzen, falls das DevExpress-Theme spät/gar nicht lädt. */
.nl-auftrag-grid svg {
    max-width: 1.25rem;
    max-height: 1.25rem;
}

/* =====================================================================
   [LAY-18] Kompakte Probenliste — Chromium-inspizierte CSS-Korrekturen 2026-05-26
   Quelle: DesignInspection.cs / docs/design-listen-2026-05-26/01-chromium-inspection.md

   Befund: Die Reihen-Höhe (Ziel 28–32 px) wurde getrieben von:
   - nl-proben-treelist-typ: text-transform uppercase → Badge wirkt grösser, bricht
     Text unnötig in Versalien (user: "zu gross geschrieben")
   - DevExpress-Standard-TD-Padding 3px 4px (bleibt unverändert — ist korrekt)
   - Alle Badge-line-height 1.4 → komprimierbar auf 1.2 (bleibt lesbar, WCAG-konform)

   Scope: NUR .nl-auftrag-grid (Probenliste + Auftragsliste teilen die Klasse).
   Stammdaten-Grids bleiben unberührt.
   ===================================================================== */

/* 1. Typ-Badge: text-transform + padding + line-height werden im Ursprungsblock
      bei .nl-proben-treelist-typ (~Zeile 1984) gesetzt — dort ist die single source
      of truth. Hier kein Duplikat nötig.

   2. Status- und Bewertungs-Badges im Grid-Kontext kompakter.
      line-height 1.2 statt 1.4 — spart ca. 2 px Höhe pro Badge, bleibt gut lesbar.
      Gilt NUR innerhalb des .nl-auftrag-grid, damit andere Stellen unberührt bleiben. */
.nl-auftrag-grid .nl-status,
.nl-auftrag-grid .nl-bewertungs-badge {
    line-height: 1.2;
    padding-top: 1px;
    padding-bottom: 1px;
}

/* 3. Prüfumfang-Chip im Grid-Kontext: line-height angleichen. */
.nl-auftrag-grid .nl-probe-umfang-chip {
    line-height: 1.2;
}

/* 4. Matrix-Spalte: code-Element als kompakte Pille — gezielter Selektor auf
      die `nl-matrix-pill`-Klasse, damit Probennummer- und Auftragsnummer-Codes
      (selbe `<code>`-Elemente, andere Spalte) plain bleiben. */
.nl-auftrag-grid .dxbl-grid-table td code.nl-matrix-pill {
    display: inline-block;
    padding: 1px 7px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs, 0.75rem);
    font-weight: 600;
    font-family: inherit;
    background: var(--nl-color-surface, #f1f5f9);
    color: var(--nl-color-text-primary, #1a1a2e);
    border: 1px solid rgba(15, 48, 87, 0.12);
    white-space: nowrap;
    line-height: 1.2;
}

/* 5. Text-Overflow für lange Bezeichnungen — verhindert Multi-Line in Zellen.
      Ansatz: overflow:hidden + white-space:nowrap ohne max-width:0, weil DevExpress
      table-layout über col-Elemente steuert und max-width:0 dort das Layout bricht.
      Greift auf ALLE TD-Inhalte; Badge-Cells werden mit :has()-Ausnahme zurück-gestellt. */
.nl-auftrag-grid .dxbl-grid-table td {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* 5b. Badge/Chip-Zellen: TD darf nicht truncaten.
      :has() ist in Chromium 105+ / Edge 105+ unterstützt (Lab-Desktop-Szenario: kein IE).
      Für ältere Browser-Fallback: die Badges haben eigenes nowrap, kein visueller Schaden. */
.nl-auftrag-grid .dxbl-grid-table td:has(.nl-status),
.nl-auftrag-grid .dxbl-grid-table td:has(.nl-bewertungs-badge),
.nl-auftrag-grid .dxbl-grid-table td:has(.nl-proben-treelist-typ),
.nl-auftrag-grid .dxbl-grid-table td:has(.nl-probe-umfang-chip),
.nl-auftrag-grid .dxbl-grid-table td:has(.nl-probe-umfang-chips),
.nl-auftrag-grid .dxbl-grid-table td:has(a.nl-grid-rowaction) {
    overflow: visible;
    white-space: normal;
    text-overflow: clip;
}

/* =====================================================================
   Probenbaum (DxTreeView Variante)
   ===================================================================== */
.nl-proben-treeview {
    margin-top: 4px;
}

.nl-proben-tree-node {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 4px 8px 4px 10px;
    border-left: 3px solid transparent;
    border-radius: var(--nl-radius-sm);
}

/* Wiederverwendung der Probentyp-Kantenfarben (nl-probe-typ-* sind oben definiert) */
.nl-proben-tree-node.nl-probe-typ-original         { border-left-color: var(--nl-color-probe-original); }
.nl-proben-tree-node.nl-probe-typ-teilung          { border-left-color: var(--nl-color-probe-teilung); }
.nl-proben-tree-node.nl-probe-typ-nachuntersuchung { border-left-color: var(--nl-color-probe-nachuntersuchung); }
.nl-proben-tree-node.nl-probe-typ-rueckstellprobe  { border-left-color: var(--nl-color-probe-rueckstellprobe); }
.nl-proben-tree-node.nl-probe-typ-blindwert        { border-left-color: var(--nl-color-probe-blindwert); }
.nl-proben-tree-node.nl-probe-typ-duplikat         { border-left-color: var(--nl-color-probe-duplikat); }

.nl-proben-tree-node-head {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}

.nl-proben-tree-nummer {
    font-weight: 600;
}

.nl-proben-tree-typ {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.nl-proben-tree-status {
    margin-left: auto;
}

.nl-proben-tree-bezeichnung {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
    line-height: 1.3;
}

@media (max-width: 1199.98px) {
    .nl-detail-meta { grid-template-columns: 110px 1fr; }
}

/* =====================================================================
   Probenbaum-Card (DxTreeList Variante, volle Breite unter Liste/Detail)
   ===================================================================== */
.nl-probenbaum-card {
    gap: 6px;
    padding: 10px;
    overflow: hidden;
}

.nl-probenbaum-head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    margin-bottom: 4px;
}

/* Scroll-Container für Tab-Inhalte (Anhänge, Audit). Sitzt im
   .nl-probenbaum-treewrap (position: relative) und füllt ihn via position: absolute
   komplett aus — umgeht die Flex-Höhenkette und scrollt intern bei Überlauf. */
.nl-tab-scrollarea {
    position: absolute;
    inset: 0;
    overflow-y: auto;
}

/* Schlanke Toolbar im Probenbaum-Tab — Tab-Beschriftung sagt schon „Probenbaum",
   daher kein redundanter Titel. Nur Counter-Info links, Aktion rechts. */
.nl-probenbaum-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    padding: 0 0 4px;
    flex: 0 0 auto;
}

.nl-probenbaum-title {
    font-size: var(--nl-font-size-lg);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin: 0;
    letter-spacing: -0.01em;
}

.nl-probenbaum-empty {
    padding: 24px 8px;
    text-align: center;
    border: 1px dashed rgba(15, 48, 87, 0.15);
    border-radius: var(--nl-radius-md);
    background: var(--nl-color-bg);
}

/* ---------------------------------------------------------------------
   Probenbaum-TreeList Spalten-Styling
   --------------------------------------------------------------------- */
.nl-proben-treelist {
    --nl-treelist-radius: var(--nl-radius-md);
}

/* DxTreeList rendert sich als Custom-Element <dxbl-tree-list>, das mit Default
   display:inline keine zuverlässige Flex-Höhenkette mitmacht. Workaround: ein
   position:relative-Wrapper bekommt vom Flex-Parent die Resthöhe, die TreeList
   füllt den Wrapper absolut aus — damit hat sie eine definitive Höhe, der interne
   Virtual-Scroll-Viewer kann darin intern scrollen. */
.nl-probenbaum-treewrap {
    position: relative;
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
}

.nl-probenbaum-treewrap > .nl-proben-treelist {
    position: absolute !important;
    inset: 0 !important;
    display: flex !important;
    flex-direction: column !important;
}

.nl-probenbaum-treewrap > .nl-proben-treelist > .dxbl-scroll-viewer {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    height: auto !important;
}

.nl-proben-treelist svg {
    max-width: 1.25rem;
    max-height: 1.25rem;
}

.nl-proben-treelist .dxbl-grid-filter-row .dxbl-edit input,
.nl-proben-treelist .dxbl-grid-filter-row .dxbl-text-edit-input {
    height: 28px;
    font-size: var(--nl-font-size-sm);
    padding: 2px 8px;
}

/* Linkzelle: Probennummer mit farbiger Kante je Probentyp */
.nl-proben-treelist-link {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 2px 8px;
    border-left: 3px solid transparent;
    border-radius: var(--nl-radius-sm);
    text-decoration: none;
    color: var(--nl-color-primary);
    font-weight: 500;
    transition: background 0.15s ease;
}

.nl-proben-treelist-link:hover {
    background: var(--nl-color-surface-hover);
    color: var(--nl-color-primary-dark);
    text-decoration: none;
}

.nl-proben-treelist-link code {
    color: inherit;
    font-weight: 600;
}

.nl-proben-treelist-typ {
    display: inline-block;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    /* [LAY-18] text-transform: uppercase entfernt — Typ wird Normal-Case angezeigt
       ("Original" statt "ORIGINAL"). User-Feedback 2026-05-26: Badge war "zu gross
       geschrieben". Farbcodierung via nl-probe-typ-* bleibt erhalten (WCAG-konform). */
    text-transform: none;
    letter-spacing: 0.02em;
    padding: 1px 7px;
    border-radius: 9999px;
    border: 1px solid rgba(15, 48, 87, 0.10);
    background: var(--nl-color-bg);
    line-height: 1.2;
}

/* Probentyp-Akzentfarben für Link & Typ-Pille */
.nl-proben-treelist-link.nl-probe-typ-original         { border-left-color: var(--nl-color-probe-original); }
.nl-proben-treelist-link.nl-probe-typ-teilung          { border-left-color: var(--nl-color-probe-teilung); }
.nl-proben-treelist-link.nl-probe-typ-nachuntersuchung { border-left-color: var(--nl-color-probe-nachuntersuchung); }
.nl-proben-treelist-link.nl-probe-typ-rueckstellprobe  { border-left-color: var(--nl-color-probe-rueckstellprobe); }
.nl-proben-treelist-link.nl-probe-typ-blindwert        { border-left-color: var(--nl-color-probe-blindwert); }
.nl-proben-treelist-link.nl-probe-typ-duplikat         { border-left-color: var(--nl-color-probe-duplikat); }

.nl-proben-treelist-typ.nl-probe-typ-original         { color: var(--nl-color-probe-original); border-color: rgba(38, 39, 102, 0.30); }
.nl-proben-treelist-typ.nl-probe-typ-teilung          { color: var(--nl-color-probe-teilung); border-color: rgba(124, 58, 237, 0.30); }
.nl-proben-treelist-typ.nl-probe-typ-nachuntersuchung { color: var(--nl-color-probe-nachuntersuchung); border-color: rgba(8, 145, 178, 0.30); }
.nl-proben-treelist-typ.nl-probe-typ-rueckstellprobe  { color: var(--nl-color-probe-rueckstellprobe); border-color: rgba(146, 64, 14, 0.30); }
.nl-proben-treelist-typ.nl-probe-typ-blindwert        { color: var(--nl-color-probe-blindwert); border-color: rgba(55, 65, 81, 0.30); }
.nl-proben-treelist-typ.nl-probe-typ-duplikat         { color: var(--nl-color-probe-duplikat); border-color: rgba(6, 95, 70, 0.30); }

/* =====================================================================
   Stammdaten-Cockpit (/stammdaten)
   ===================================================================== */
.nl-cockpit {
    padding: 12px 0 32px;
    display: flex;
    flex-direction: column;
    gap: 24px;
}

.nl-cockpit-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 16px;
}

.nl-cockpit-title {
    font-size: var(--nl-font-size-2xl);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin: 4px 0 4px;
    letter-spacing: -0.01em;
}

.nl-cockpit-sub {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-base);
    margin: 0;
    max-width: 720px;
}

/* ----- KPI-Reihe ----- */
.nl-cockpit-kpis .nl-cockpit-kpi-link {
    display: block;
    text-decoration: none;
    color: inherit;
    border-radius: var(--nl-radius-lg);
    transition: transform 0.12s ease, box-shadow 0.12s ease;
}

.nl-cockpit-kpis .nl-cockpit-kpi-link:hover {
    transform: translateY(-1px);
    box-shadow: var(--nl-shadow-md);
}

.nl-cockpit-kpis .nl-cockpit-kpi-link:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
}

.nl-cockpit-kpi-warn {
    color: var(--nl-color-warn);
    font-weight: 600;
}

.nl-cockpit-kpi-sep {
    color: var(--nl-color-text-secondary);
}

/* ----- Sektion-Header ----- */
.nl-cockpit-section-head {
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    flex-wrap: wrap;
    gap: 16px;
    margin-bottom: 12px;
}

.nl-cockpit-legend {
    display: flex;
    gap: 16px;
    flex-wrap: wrap;
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
}

.nl-akk-legend-item {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

/* ----- Cockpit-Filter-Card (aufgeräumt) ----- */
.nl-filter-card {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    box-shadow: var(--nl-shadow-sm);
    border: 1px solid rgba(15, 48, 87, 0.06);
    padding: 14px 16px;
    margin-bottom: 12px;
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.nl-filter-row {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
}

.nl-filter-row-search {
    align-items: flex-end;
    justify-content: space-between;
}

.nl-filter-label {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin: 0;
}

.nl-filter-label-chips {
    flex-shrink: 0;
    min-width: 70px;
    color: var(--nl-color-text-secondary);
}

.nl-filter-search {
    display: flex;
    flex-direction: column;
    gap: 4px;
    flex: 1 1 320px;
    max-width: 520px;
}

.nl-filter-search-input {
    width: 100%;
}

.nl-filter-toggles {
    display: flex;
    align-items: center;
    gap: 18px;
    flex-wrap: wrap;
    padding-bottom: 2px;
}

.nl-filter-toggle {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
}

.nl-filter-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    flex: 1 1 auto;
    align-items: center;
}

/* Schmale, abgerundete Chip-Buttons */
.nl-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 4px 12px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    line-height: 1.4;
    color: var(--nl-color-text-secondary);
    background: var(--nl-color-bg);
    border: 1px solid rgba(15, 48, 87, 0.14);
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease, transform 0.1s ease;
    white-space: nowrap;
}

.nl-chip:hover {
    background: rgba(38, 39, 102, 0.07);
    color: var(--nl-color-primary-dark);
    border-color: rgba(38, 39, 102, 0.30);
}

.nl-chip:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
}

.nl-chip-active {
    background: var(--nl-color-primary);
    color: var(--nl-color-text-inverted);
    border-color: var(--nl-color-primary);
    box-shadow: 0 1px 3px rgba(38, 39, 102, 0.25);
}

.nl-chip-active:hover {
    background: var(--nl-color-primary-light);
    color: var(--nl-color-text-inverted);
    border-color: var(--nl-color-primary-light);
}

.nl-filter-footer {
    border-top: 1px solid rgba(15, 48, 87, 0.06);
    padding-top: 8px;
    display: flex;
    align-items: center;
    justify-content: flex-end;
}

.nl-filter-stats {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    letter-spacing: 0.02em;
}

.nl-filter-stats strong {
    color: var(--nl-color-text-primary);
    font-weight: 700;
}

.nl-filter-stats-sep {
    margin: 0 6px;
    color: rgba(15, 48, 87, 0.20);
}

/* Mobile: Suche und Toggles untereinander stapeln */
@media (max-width: 768px) {
    .nl-filter-row-search {
        flex-direction: column;
        align-items: stretch;
        gap: 10px;
    }

    .nl-filter-search {
        max-width: none;
    }

    .nl-filter-toggles {
        gap: 14px;
    }

    .nl-filter-label-chips {
        min-width: 0;
        width: 100%;
    }
}

/* ----- Akkreditierungs-Matrix ----- */
.nl-cockpit-grid {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    box-shadow: var(--nl-shadow-sm);
    padding: 8px;
    overflow-x: auto;
}

.nl-akk-grid {
    --nl-akk-cell-bg: var(--nl-color-surface-subtle);
}

.nl-akk-param {
    display: flex;
    flex-direction: column;
    gap: 2px;
    line-height: 1.2;
}

.nl-akk-param-kuerzel {
    font-weight: 600;
    color: var(--nl-color-text-primary);
    background: transparent;
    padding: 0;
}

.nl-akk-param-bezeichnung {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    overflow: hidden;
    text-overflow: ellipsis;
}

.nl-akk-cell {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 60px;
    padding: 4px 10px;
    border-radius: var(--nl-radius-sm);
    border: 1px solid transparent;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    line-height: 1.4;
    cursor: pointer;
    transition: transform 0.1s ease, box-shadow 0.1s ease, filter 0.1s ease;
    background: var(--nl-akk-cell-bg, #F3F4F6);
    color: var(--nl-color-text-primary);
}

.nl-akk-cell:hover {
    transform: translateY(-1px);
    box-shadow: var(--nl-shadow-sm);
    filter: brightness(1.03);
}

.nl-akk-cell:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
}

.nl-akk-cell-akkreditiert {
    background: rgba(22, 163, 74, 0.14);
    color: #14532D;
    border-color: rgba(22, 163, 74, 0.35);
}

.nl-akk-cell-nicht {
    background: rgba(217, 119, 6, 0.14);
    color: #7C2D12;
    border-color: rgba(217, 119, 6, 0.35);
}

.nl-akk-cell-leer {
    background: rgba(107, 114, 128, 0.10);
    color: var(--nl-color-text-secondary);
    border: 1px dashed rgba(107, 114, 128, 0.35);
}

/* ----- Workflow-Karten ----- */
.nl-cockpit-workflow-card {
    padding: 16px 18px;
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    box-shadow: var(--nl-shadow-sm);
}

.nl-cockpit-workflow-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 10px;
}

.nl-cockpit-workflow-head h2 {
    margin: 0;
}

.nl-cockpit-table {
    margin-bottom: 0;
}

.nl-cockpit-table th {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    border-bottom: 1px solid rgba(15, 48, 87, 0.10);
}

.nl-cockpit-row {
    cursor: pointer;
    transition: background 0.12s ease;
}

.nl-cockpit-row:hover {
    background: var(--nl-color-surface-hover);
}

.nl-cockpit-typ {
    display: inline-block;
    padding: 1px 8px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    background: rgba(38, 39, 102, 0.10);
    color: var(--nl-color-primary);
}

.nl-cockpit-bezeichnung {
    color: var(--nl-color-text-primary);
    font-weight: 500;
}

/* =====================================================================
   Editor-Forms in Card-Sektionen (FormCard)
   Wird von allen Anlage-/Editor-Pages genutzt: MatrixEditor, MethodeEditor,
   ParameterEditor, PruefpositionEditor, AuftragsartEditor, KundenEditor,
   PruefumfangDetail, GrenzwertsetDetail, AuftragNeu.
   ===================================================================== */

/* Aeusserer Container begrenzt die Formularbreite auf grossen Monitoren. */
.nl-form-container {
    max-width: 960px;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
    gap: 18px;
}

.nl-form-container.nl-form-container-wide {
    max-width: 1200px;
}

.nl-form-container.nl-form-container-xwide {
    max-width: 1500px;
}

/* ProbeDetail: Page nutzt die volle verfügbare Breite — wie der Probenbaum auf Auftragsliste. */
.nl-form-container.nl-form-container-full {
    max-width: none;
}

/* =====================================================================
   Einheitlicher Seitenkopf (.nl-page-head, plus Aliasse für Bestand).
   Kompakt: h1 1.5rem; Trennung rein über Margin – kein Hairline-Rule,
   damit der Header nicht „freischwebend" über dem Card-Layout wirkt.
   ===================================================================== */
.nl-page-head,
.nl-form-page-head,
.nl-hub-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    margin: 0 0 14px 0;
}

.nl-page-head h1,
.nl-form-page-head h1,
.nl-hub-head h1 {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--nl-color-text-primary);
    letter-spacing: -0.01em;
    line-height: 1.2;
    margin: 0;
}

.nl-page-head p,
.nl-page-head small,
.nl-hub-head p,
.nl-hub-head small,
.nl-form-page-head p,
.nl-form-page-head small {
    color: var(--nl-color-text-secondary);
    font-size: 0.8125rem;
    margin: 2px 0 0 0;
    display: block;
    line-height: 1.4;
}

.nl-page-head-actions {
    display: flex;
    gap: 8px;
    align-items: center;
    flex-shrink: 0;
}

.nl-form-page-eyebrow {
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    margin-bottom: 2px;
}

.nl-form-page-status {
    display: inline-flex;
    align-items: center;
    gap: 8px;
}

/* Schmale Info-Card oberhalb der Formular-Cards: Erstellt/Freigegeben-Meta. */
.nl-form-status-card {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    padding: 12px 18px;
    box-shadow: var(--nl-shadow-sm);
    border: 1px solid rgba(15, 48, 87, 0.06);
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 4px 24px;
    font-size: var(--nl-font-size-sm);
}

.nl-form-status-card dt {
    color: var(--nl-color-text-secondary);
    font-weight: 500;
    font-size: var(--nl-font-size-xs);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-top: 2px;
}

.nl-form-status-card dd {
    margin: 0 0 6px 0;
    color: var(--nl-color-text-primary);
}

/* Card-Sektion (FormCard.razor) */
.nl-card-form {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-lg);
    box-shadow: var(--nl-shadow-sm);
    border: 1px solid rgba(15, 48, 87, 0.06);
    padding: 20px 22px;
}

.nl-card-form + .nl-card-form {
    margin-top: 18px;
}

/* Innerhalb eines EditForm: Cards ebenfalls mit Abstand zueinander */
.nl-form-container form > .nl-card-form + .nl-card-form,
.nl-form-container form > .nl-card-form + .nl-form-actions,
.nl-form-container form > .nl-form-actions {
    margin-top: 18px;
}

/* Mehrspaltiges Card-Layout (Bootstrap-row mit FormCards): gleiche Höhe + Abstand
   zu Geschwister-Cards/Action-Bar. */
.nl-form-container form > .nl-card-form + .nl-form-row,
.nl-form-container form > .nl-form-row + .nl-card-form,
.nl-form-container form > .nl-form-row + .nl-form-actions,
.nl-form-container form > .nl-form-row {
    margin-top: 18px;
}

.nl-form-row > [class*="col-"] { display: flex; }
.nl-form-row > [class*="col-"] > .nl-card-form { width: 100%; }

/* Probe-Detail-Toolbar: Status-Aktionen links, Anlegen/Sperren rechts.
   Sticky-Verhalten: bleibt unter dem Header (56px) sichtbar beim Scrollen. */
.nl-probe-toolbar {
    position: sticky;
    top: 56px;
    z-index: 20;
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 8px;
    padding: 10px 14px;
    background: var(--nl-color-bg-card);
    border: 1px solid rgba(15, 48, 87, 0.06);
    border-radius: var(--nl-radius-md);
    box-shadow: var(--nl-shadow-sm);
    backdrop-filter: saturate(140%) blur(2px);
}

/* 2-Spalten-Row Übersicht (groß) + Prüfumfang-Hint (schmal). */
.nl-probe-overview-row > [class*="col-"] {
    display: flex;
}

.nl-probe-overview-row > [class*="col-"] > .nl-detail-card {
    width: 100%;
}

.nl-probe-toolbar-left,
.nl-probe-toolbar-right {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
}

.nl-probe-toolbar-left:empty {
    /* Wenn keine Status-Übergänge möglich (Gesperrt/Archiviert),
       trotzdem nicht kollabieren — Layout-Stabilität. */
    min-width: 1px;
}

/* Action-Bar im ProbeDetail — eine einheitliche horizontale Reihe mit
   logischer Button-Gruppierung. Ersetzt das alte left/right-Split-Pattern. */
.nl-probe-actionbar {
    justify-content: flex-start;
    flex-wrap: wrap;
    gap: 6px;
    padding: 8px 12px;
}

.nl-probe-actionbar-spacer { flex: 1 1 auto; }

.nl-probe-actionbar-divider {
    display: inline-block;
    width: 1px;
    height: 18px;
    background: var(--nl-color-border-default);
    margin: 0 4px;
}

/* In der Action-Bar sollen native Buttons + DxButton-Wrapper die
   gleiche Linie haben — unsere nl-btn-*-Klassen reichen. */
.nl-probe-actionbar .nl-btn-primary-sm,
.nl-probe-actionbar .nl-btn-link-sm {
    line-height: 1.2;
}

/* Inline-Editor in der Wert-Spalte des Ergebnis-Grids: kompakter ohne Border-Hover */
.nl-ergebnis-grid .nl-ergebnis-input {
    max-width: 180px;
}

/* Operator-Auswahl + Zahleneingabe + Einheit nebeneinander */
.nl-numeric-edit {
    display: flex;
    gap: 4px;
    align-items: center;
}
.nl-operator-select {
    width: 64px;
    flex-shrink: 0;
}
.nl-ergebnis-einheit {
    flex-shrink: 0;
    white-space: nowrap;
}

/* Ergebnis-Grid soll seine volle Höhe einnehmen — kein internes Scrolling.
   DevExpress setzt Default-Höhen am Wrapper, die wir hier auflösen. */
.nl-ergebnis-grid,
.nl-ergebnis-grid .dxbl-grid,
.nl-ergebnis-grid .dxbl-grid-table-content-area {
    height: auto !important;
    max-height: none !important;
}

.nl-ergebnis-grid .dxbl-scroll-viewer,
.nl-ergebnis-grid .dxbl-grid-table-scroll-container {
    overflow: visible !important;
    max-height: none !important;
}

.nl-ergebnis-actions {
    display: flex;
    gap: 4px;
    align-items: center;
    justify-content: flex-end;
}

/* Inline-Icon-Button für Aktionen in Grid-Zellen (Sonderwert, Kommentar). */
.nl-cell-icon-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    padding: 0;
    border: 1px solid var(--nl-color-border-default);
    background: var(--nl-color-bg-card);
    border-radius: 6px;
    color: var(--nl-color-text-secondary, #6b7280);
    cursor: pointer;
    transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.nl-cell-icon-btn:hover:not(:disabled) {
    background: rgba(38, 39, 102, 0.06);
    color: var(--nl-color-primary, #262766);
    border-color: var(--nl-color-primary, #262766);
}
.nl-cell-icon-btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}
.nl-cell-icon-btn.nl-cell-icon-btn-active {
    background: rgba(251, 188, 58, 0.12);
    color: var(--nl-color-accent, #fbbc3a);
    border-color: rgba(251, 188, 58, 0.4);
}
.nl-cell-icon-btn svg { width: 14px; height: 14px; }

/* Kleines Badge im Icon-Button (z. B. Anzahl verknüpfter Chargen). */
.nl-cell-icon-badge {
    margin-left: 3px;
    font-size: 10px;
    font-weight: 700;
    line-height: 1;
}

/* Aktions-Liste innerhalb des „Weitere Aktionen"-Popups (DxPopup). */
.nl-overflow-actions {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.nl-overflow-action {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    width: 100%;
    padding: 10px 12px;
    border: 1px solid #e5e7eb;
    background: #fff;
    border-radius: 8px;
    cursor: pointer;
    text-align: left;
    transition: background 0.15s, border-color 0.15s;
}
.nl-overflow-action:hover:not(:disabled) {
    background: rgba(38, 39, 102, 0.05);
    border-color: rgba(38, 39, 102, 0.25);
}
.nl-overflow-action:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}
.nl-overflow-action-icon {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 8px;
    background: rgba(38, 39, 102, 0.08);
    color: var(--nl-color-primary, #262766);
}
.nl-overflow-action-body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}
.nl-overflow-action-title {
    font-weight: 600;
    color: var(--nl-color-text-primary, #1a1a2e);
    font-size: 14px;
    line-height: 1.3;
}
.nl-overflow-action-desc {
    color: var(--nl-color-text-secondary, #6b7280);
    font-size: 12px;
    line-height: 1.35;
}
.nl-overflow-action-warn .nl-overflow-action-icon {
    background: rgba(217, 119, 6, 0.12);
    color: #b45309;
}
.nl-overflow-action-warn .nl-overflow-action-title {
    color: #b45309;
}

.nl-aenderungs-counter {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    padding: 1px 6px;
    border-radius: 9999px;
    font-size: 11px;
    font-weight: 600;
    background: rgba(91, 141, 184, 0.15);
    color: var(--nl-color-secondary);
    border: 1px solid rgba(91, 141, 184, 0.3);
    cursor: help;
}

.nl-grenzwert-hint {
    font-size: 11px;
    color: var(--nl-color-text-secondary);
    margin-top: 2px;
    line-height: 1.3;
}

.nl-grenzwert-cell {
    font-size: 12px;
    color: var(--nl-color-text-primary);
    line-height: 1.3;
}


.nl-dirty-dot {
    color: var(--nl-color-warn);
    font-weight: 700;
    font-size: 14px;
    line-height: 1;
}

/* Handbuch-Link in der unteren NavMenu-Sektion (über Account). */
.nl-nav-foot {
    padding: 4px 8px 8px 8px;
}

.nl-nav-link-foot {
    font-size: var(--nl-font-size-sm);
    opacity: 0.85;
}

.nl-nav-link-foot:hover { opacity: 1; }

/* ---------------------------------------------------------------------
   Handbuch / Hilfe-Page
   --------------------------------------------------------------------- */
.nl-hilfe-layout {
    display: grid;
    grid-template-columns: 260px 1fr;
    gap: 24px;
    align-items: start;
}

.nl-hilfe-sidebar {
    position: sticky;
    top: 16px;
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-md);
    box-shadow: var(--nl-shadow-sm);
    border: 1px solid var(--nl-color-border-default);
    /* Marken-"Buchrücken"-Leiste oben — dezenter Navy-Akzent, Gold bleibt den
       aktiven/hervorgehobenen Elementen (Eyebrow-Balken, aktiver Link) vorbehalten. */
    border-top: 3px solid var(--nl-color-primary);
    padding: 16px 14px;
    max-height: calc(100vh - 80px);
    overflow-y: auto;
}

.nl-hilfe-eyebrow {
    display: flex;
    align-items: center;
    gap: 8px;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    color: var(--nl-color-primary);
    margin-bottom: 10px;
}
.nl-hilfe-eyebrow::before {
    content: "";
    flex: none;
    width: 4px;
    height: 14px;
    background: var(--nl-color-accent);
    border-radius: 2px;
}

.nl-hilfe-liste {
    list-style: none;
    padding: 0;
    margin: 0;
}

.nl-hilfe-link {
    display: block;
    padding: 6px 10px;
    border-radius: var(--nl-radius-sm);
    color: var(--nl-color-text-primary);
    text-decoration: none;
    font-size: var(--nl-font-size-sm);
    transition: background-color 120ms ease-out, color 120ms ease-out;
}

.nl-hilfe-link:hover { background: var(--nl-color-surface-hover); }

.nl-hilfe-link.active {
    background: var(--nl-color-primary);
    color: var(--nl-color-text-inverted);
    font-weight: 600;
    /* Gold-Akzent als Inset statt border-left, damit sich Padding/Breite nicht
       gegenüber dem inaktiven Zustand verschieben. */
    box-shadow: inset 3px 0 0 var(--nl-color-accent);
}

/* Hierarchische Sidebar — Top-Level + ausklappbarer Subordner */
.nl-hilfe-tree-item { margin-bottom: 2px; }

.nl-hilfe-tree-summary {
    list-style: none;
    display: flex;
    align-items: center;
    cursor: pointer;
    padding: 0;
    border-radius: 4px;
}
.nl-hilfe-tree-summary::marker,
.nl-hilfe-tree-summary::-webkit-details-marker { display: none; }
.nl-hilfe-tree-summary::before {
    content: "›";
    display: inline-block;
    width: 14px;
    margin-right: 2px;
    text-align: center;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    transition: transform 120ms ease-out;
}
details[open] > .nl-hilfe-tree-summary::before {
    transform: rotate(90deg);
}

.nl-hilfe-link-top {
    flex: 1 1 auto;
    font-weight: 500;
}

.nl-hilfe-sublist {
    border-left: 1px solid var(--nl-color-border-default);
    margin: 2px 0 6px 10px;
    padding-left: 6px;
}

.nl-hilfe-link-sub {
    font-size: 0.86rem;
    padding-left: 14px;
    color: var(--nl-color-text-secondary);
}
.nl-hilfe-link-sub:hover { color: var(--nl-color-text-primary); }
.nl-hilfe-link-sub.active { color: var(--nl-color-text-inverted); }

.nl-hilfe-content {
    background: var(--nl-color-bg-card);
    border-radius: var(--nl-radius-md);
    box-shadow: var(--nl-shadow-sm);
    border: 1px solid var(--nl-color-border-default);
    padding: 24px 32px;
    min-height: 320px;
}

/* Prose-Dokulayout: zentrierte Lesespalte mit Buchsatz-Typografie, angelehnt an
   gepflegte Doku-Tools (z. B. GitBook/Notion). Alle Werte über --nl-*-Tokens. */
.nl-hilfe-article {
    max-width: 760px;
    margin: 0 auto;
    font-size: var(--nl-font-size-base);
    line-height: 1.65;
    color: var(--nl-color-text-primary);
}
.nl-hilfe-article > *:first-child { margin-top: 0; }

.nl-hilfe-article p { margin: 0 0 14px; }
.nl-hilfe-article ul,
.nl-hilfe-article ol {
    margin: 0 0 14px;
    padding-left: 1.4em;
}
.nl-hilfe-article li + li { margin-top: 4px; }
.nl-hilfe-article li > ul,
.nl-hilfe-article li > ol { margin: 4px 0 0; }
.nl-hilfe-article strong { font-weight: 600; }
.nl-hilfe-article hr {
    border: none;
    border-top: 1px solid var(--nl-color-border-default);
    margin: 32px 0;
}

.nl-hilfe-article a {
    color: var(--nl-color-primary);
    text-decoration: underline;
    text-decoration-color: color-mix(in srgb, var(--nl-color-primary) 35%, transparent);
    text-underline-offset: 2px;
}
.nl-hilfe-article a:hover {
    text-decoration-color: var(--nl-color-primary);
}
.nl-hilfe-article a:focus-visible,
.nl-hilfe-link:focus-visible,
.nl-hilfe-tree-summary:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
}

.nl-hilfe-article h1,
.nl-hilfe-article h2,
.nl-hilfe-article h3 {
    color: var(--nl-color-text-primary);
}

/* Kapitel-Kopf im Anfänger-Guide-Look (docs/anfaenger-guide/guide.css .step__head):
   Navy-Markenband mit Gold-Leiste links + "Handbuch"-Eyebrow. Der Marken-Verlauf ist
   bewusst themeunabhängig (Hell/Dunkel) — identischer Verlauf wie .nl-hero auf der
   Landing-Page, daher fest über die Brand-/Primary-Tokens statt Fläche/Text-Tokens. */
.nl-hilfe-article h1 {
    position: relative;
    margin: 0 0 28px;
    padding: 22px 28px 20px 32px;
    background: linear-gradient(135deg, var(--nl-color-primary-dark, #1a1b4b) 0%, var(--nl-color-primary, #262766) 60%, var(--nl-color-primary-light, #5678b5) 100%);
    color: var(--nl-color-text-inverted);
    font-size: var(--nl-font-size-2xl);
    font-weight: 700;
    letter-spacing: -0.01em;
    line-height: 1.3;
    border-radius: var(--nl-radius-md);
    box-shadow: var(--nl-shadow-md);
}
.nl-hilfe-article h1::before {
    content: "Handbuch";
    display: block;
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--nl-color-accent);
    margin-bottom: 8px;
}
.nl-hilfe-article h1::after {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 6px;
    background: var(--nl-color-accent);
    border-radius: var(--nl-radius-md) 0 0 var(--nl-radius-md);
}

/* Sektionskopf: Gold-Bar-Akzent links (wie .step__head/.fs-section__h im Guide). */
.nl-hilfe-article h2 {
    font-size: var(--nl-font-size-xl);
    font-weight: 700;
    color: var(--nl-color-primary);
    letter-spacing: -0.005em;
    margin: 40px 0 16px;
    padding-left: 14px;
    border-left: 4px solid var(--nl-color-accent);
}
/* h3 bewusst dezenter als h2 — nur Marken-Farbakzent, kein Balken. */
.nl-hilfe-article h3 {
    font-size: var(--nl-font-size-lg);
    font-weight: 600;
    color: var(--nl-color-primary);
    margin: 26px 0 8px;
}
.nl-hilfe-article h2:first-child,
.nl-hilfe-article h3:first-child { margin-top: 0; }

/* Handbuch-Bilder: als gerahmte "Figure" wie im Anfänger-Guide (Rahmen + weicher
   Marken-Schatten + Radius über Tokens), kompakt dargestellt. Lightbox-Verhalten
   (cursor:zoom-in, JS-Overlay unten) bleibt unverändert. */
.nl-hilfe-article img {
    display: block;
    max-width: 480px;
    max-height: 320px;
    width: auto;
    height: auto;
    margin: 16px 0;
    cursor: zoom-in;
    background: var(--nl-color-bg-card);
    border: 1px solid var(--nl-color-border-card);
    border-radius: var(--nl-radius-sm);
    box-shadow: var(--nl-shadow-sm);
    transition: box-shadow 120ms ease-out, transform 120ms ease-out;
}
.nl-hilfe-article img:hover {
    box-shadow: var(--nl-shadow-md);
    transform: translateY(-1px);
}

/* Lightbox-Overlay (dynamisch per JS angehängt). */
.nl-lightbox {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.85);
    z-index: 10500;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: zoom-out;
    animation: nl-lightbox-fade 120ms ease-out;
}
@keyframes nl-lightbox-fade {
    from { opacity: 0; }
    to { opacity: 1; }
}
.nl-lightbox img {
    max-width: 95vw;
    max-height: 95vh;
    box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
    border-radius: 4px;
    cursor: default;
}
.nl-lightbox-close {
    position: absolute;
    top: 16px;
    right: 24px;
    width: 36px;
    height: 36px;
    background: rgba(255, 255, 255, 0.1);
    border: 1px solid rgba(255, 255, 255, 0.4);
    color: #fff;
    border-radius: 50%;
    font-size: 22px;
    line-height: 1;
    cursor: pointer;
}
.nl-lightbox-close:hover {
    background: rgba(255, 255, 255, 0.2);
}

/* Farb-Eingabe: Picker-Swatch + Text-Feld + Reset-Button. Wird z. B. im
   Probentyp-Editor verwendet. Text-Feld erlaubt auch CSS-Farbnamen, der
   Swatch ist nur ein Schnellwähler. */
.nl-color-edit {
    display: flex;
    align-items: center;
    gap: 8px;
}
.nl-color-swatch {
    width: 36px;
    height: 36px;
    padding: 0;
    border: 1px solid rgba(15, 48, 87, 0.18);
    border-radius: 6px;
    background: transparent;
    cursor: pointer;
    flex-shrink: 0;
}
.nl-color-swatch:hover {
    border-color: var(--nl-color-primary);
}
.nl-color-swatch::-webkit-color-swatch {
    border: none;
    border-radius: 4px;
}
.nl-color-swatch::-moz-color-swatch {
    border: none;
    border-radius: 4px;
}
.nl-color-text {
    flex: 1 1 auto;
}
.nl-color-clear {
    width: 28px;
    height: 28px;
    border: 1px solid rgba(15, 48, 87, 0.12);
    background: transparent;
    color: var(--nl-color-text-secondary);
    border-radius: 4px;
    cursor: pointer;
    line-height: 1;
    font-size: 18px;
    flex-shrink: 0;
}
.nl-color-clear:hover {
    background: rgba(15, 48, 87, 0.05);
    color: var(--nl-color-text-primary);
}

.nl-hilfe-article code {
    background: var(--nl-color-surface-subtle);
    color: var(--nl-color-text-primary);
    font-family: var(--nl-font-family-mono);
    padding: 2px 6px;
    border: 1px solid var(--nl-color-border-default);
    border-radius: var(--nl-radius-sm);
    font-size: 0.875em;
}

.nl-hilfe-article pre {
    background: var(--nl-color-surface-subtle);
    border: 1px solid var(--nl-color-border-default);
    border-radius: var(--nl-radius-sm);
    padding: 14px 16px;
    overflow-x: auto;
    line-height: 1.5;
}

.nl-hilfe-article pre code { background: none; border: none; padding: 0; font-size: 0.85em; }

/* Mermaid-Diagramme im Handbuch: mermaid.js ersetzt <pre class="mermaid"> durch
   <div class="nl-mermaid"><svg ...>. Vor dem Rendering Container mittig anzeigen
   und subtilen Rahmen darum legen, damit der Lade-Status erkennbar bleibt. */
.nl-hilfe-article pre.mermaid {
    background: #f8fafc;
    border: 1px dashed rgba(15, 48, 87, 0.18);
    color: rgba(15, 48, 87, 0.5);
    font-size: 0.85em;
    text-align: center;
    padding: 24px;
    min-height: 80px;
}

.nl-hilfe-article .nl-mermaid {
    margin: 16px auto;
    text-align: center;
    overflow-x: auto;
}

.nl-hilfe-article .nl-mermaid svg {
    max-width: 100%;
    height: auto;
}

/* Tabellen im Doku-Stil — horizontal scrollbar statt umgebrochen, damit breite
   Referenztabellen (z. B. Stammdaten-Übersichten) auf Mobile nicht zerlaufen. */
.nl-hilfe-article table {
    display: block;
    max-width: 100%;
    overflow-x: auto;
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    margin: 22px 0;
    font-size: var(--nl-font-size-sm);
    border: 1px solid var(--nl-color-border-card);
    border-radius: var(--nl-radius-sm);
}

/* Marken-Kopf: Navy-Fläche + inverser Text, wie im Anfänger-Guide-Tabellenkopf.
   Eckenradius auf den Randzellen nachgezogen, da display:block + overflow-x:auto
   auf <table> selbst keinen sauberen Clip der Kopf-Fläche erzeugt. */
.nl-hilfe-article thead th {
    background: var(--nl-color-primary);
    color: var(--nl-color-text-inverted);
    font-weight: 600;
    text-align: left;
    white-space: nowrap;
    padding: 10px 14px;
    border-bottom: none;
}
.nl-hilfe-article thead th:first-child { border-top-left-radius: var(--nl-radius-sm); }
.nl-hilfe-article thead th:last-child { border-top-right-radius: var(--nl-radius-sm); }

.nl-hilfe-article td {
    padding: 9px 14px;
    vertical-align: top;
    border-bottom: 1px solid var(--nl-color-border-default);
}
.nl-hilfe-article tbody tr:last-child td { border-bottom: none; }
.nl-hilfe-article tbody tr:last-child td:first-child { border-bottom-left-radius: var(--nl-radius-sm); }
.nl-hilfe-article tbody tr:last-child td:last-child { border-bottom-right-radius: var(--nl-radius-sm); }

.nl-hilfe-article tbody tr:hover { background: var(--nl-color-surface-hover); }

/* Callouts — ersetzt die frühere undifferenzierte blockquote-Regel. Variante wird
   serverseitig durch den CalloutAwareQuoteBlockRenderer (HandbuchService.cs) anhand
   des Fett-Labels vergeben (nl-callout-danger/-emphasis/-info/-tip/-note). Aufgewertet
   auf den Anfänger-Guide-Look (docs/anfaenger-guide/guide.css .tip/.example-box):
   getönte Fläche + Rahmen ringsum + dickerer linker Akzentbalken + rundes Icon-Badge.
   Das Icon-Badge ist ein reines ::before (kein zusätzliches HTML nötig) — der
   CalloutAwareQuoteBlockRenderer reichert nur Klassen an, die Markup-Struktur
   (blockquote > p > strong) bleibt unverändert. */
.nl-hilfe-article blockquote.nl-callout {
    position: relative;
    border: 1px solid color-mix(in srgb, var(--callout-color, var(--nl-color-nb)) 35%, var(--nl-color-border-default));
    border-left: 4px solid var(--callout-color, var(--nl-color-nb));
    background: color-mix(in srgb, var(--callout-color, var(--nl-color-nb)) 9%, var(--nl-color-bg-card));
    border-radius: var(--nl-radius-md);
    padding: 14px 18px 14px 46px;
    margin: 20px 0;
    color: var(--nl-color-text-primary);
}
.nl-hilfe-article blockquote.nl-callout::before {
    content: "\2013";
    position: absolute;
    left: 14px;
    top: 14px;
    width: 22px;
    height: 22px;
    line-height: 22px;
    text-align: center;
    border-radius: 50%;
    background: var(--callout-color, var(--nl-color-nb));
    color: var(--nl-color-text-inverted);
    font-weight: 800;
    font-size: 0.75rem;
}
.nl-hilfe-article blockquote.nl-callout > *:first-child { margin-top: 0; }
.nl-hilfe-article blockquote.nl-callout > *:last-child { margin-bottom: 0; }
.nl-hilfe-article blockquote.nl-callout > p:first-child > strong:first-child {
    color: var(--callout-color, var(--nl-color-nb));
}
.nl-callout-danger   { --callout-color: var(--nl-color-callout-danger); }
.nl-callout-emphasis { --callout-color: var(--nl-color-callout-emphasis); }
.nl-callout-info     { --callout-color: var(--nl-color-callout-info); }
.nl-callout-tip      { --callout-color: var(--nl-color-callout-tip); }
.nl-callout-note     { --callout-color: var(--nl-color-nb); }

/* Icon-Glyphen je Variante — bewusst schlichte Zeichen statt Emoji, konsistent zur
   bestehenden Symbolik in BewertungsBadge (✓/⚠/✗/–). Selektoren bündeln alle drei
   Klassen (nl-hilfe-article + nl-callout + Variante), damit die Spezifität sicher
   über der Basisregel liegt, unabhängig von der Deklarationsreihenfolge. */
.nl-hilfe-article blockquote.nl-callout.nl-callout-danger::before   { content: "\2717"; }
.nl-hilfe-article blockquote.nl-callout.nl-callout-emphasis::before { content: "\2605"; }
.nl-hilfe-article blockquote.nl-callout.nl-callout-info::before     { content: "i"; font-style: italic; font-family: Georgia, 'Times New Roman', serif; }
.nl-hilfe-article blockquote.nl-callout.nl-callout-tip::before      { content: "\2713"; }
.nl-hilfe-article blockquote.nl-callout.nl-callout-note::before     { content: "\2013"; }

.nl-hilfe-leer {
    color: var(--nl-color-text-secondary);
}

@media (max-width: 768px) {
    .nl-hilfe-layout { grid-template-columns: 1fr; }
    .nl-hilfe-sidebar { position: static; max-height: 260px; overflow-y: auto; }
}

.nl-bemerkung-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 9999px;
    font-size: 12px;
    font-weight: 600;
    background: rgba(251, 188, 58, 0.15);
    color: var(--nl-color-accent);
    border: 1px solid rgba(251, 188, 58, 0.35);
    cursor: help;
}

.nl-card-form-header {
    margin-bottom: 14px;
    border-bottom: 1px solid rgba(15, 48, 87, 0.06);
    padding-bottom: 10px;
}

.nl-card-form-title {
    font-size: var(--nl-font-size-lg);
    font-weight: 600;
    color: var(--nl-color-text-primary);
    margin: 0;
    letter-spacing: -0.01em;
}

.nl-card-form-sub {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
    margin: 4px 0 0 0;
}

.nl-card-form-body {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

/* Mehrspaltiges Grid fuer Formularfelder.
   Nutzt CSS-Grid statt Bootstrap-Rows fuer feinere Kontrolle. */
.nl-form-grid {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    column-gap: 16px;
    row-gap: 14px;
}

.nl-form-col-12 { grid-column: span 12; }
.nl-form-col-8  { grid-column: span 8; }
.nl-form-col-6  { grid-column: span 6; }
.nl-form-col-4  { grid-column: span 4; }
.nl-form-col-3  { grid-column: span 3; }

@media (max-width: 768px) {
    .nl-form-col-8,
    .nl-form-col-6,
    .nl-form-col-4,
    .nl-form-col-3 { grid-column: span 12; }
}

/* Einzelnes Feld: Label + Input + Validation untereinander */
.nl-form-field {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.nl-form-field > label,
.nl-form-field .form-label {
    font-size: var(--nl-font-size-sm);
    font-weight: 500;
    color: var(--nl-color-text-primary);
    margin-bottom: 0;
}

.nl-form-hint {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    margin-top: 2px;
}

.nl-form-hint-link {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-primary);
    margin-left: 6px;
    text-decoration: none;
}
.nl-form-hint-link:hover { text-decoration: underline; }

/* ----- Tripel-Composer für Pruefposition (Parameter × Methode × Matrix) -----
   Drei nebeneinander stehende Karten mit kleinen Verknüpfungs-Glyphen dazwischen.
   Macht die fachliche Relation lesbar — nicht „drei abstrakte Dropdowns".          */
.nl-tripel-grid {
    display: grid;
    grid-template-columns: 1fr auto 1fr auto 1fr;
    align-items: stretch;
    gap: 10px;
}

.nl-tripel-card {
    background: var(--nl-color-bg);
    border: 1px solid var(--nl-color-border-card);
    border-radius: 8px;
    padding: 12px 14px;
    display: flex;
    flex-direction: column;
    gap: 6px;
    transition: border-color 0.15s, background 0.15s;
}

.nl-tripel-card:focus-within {
    border-color: var(--nl-color-primary-light);
    background: #FFFFFF;
}

.nl-tripel-card-label {
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--nl-color-text-secondary);
}

.nl-tripel-card-meta {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    min-height: 14px;
    line-height: 1.3;
}

.nl-tripel-card.is-archiviert {
    border-left: 3px solid var(--nl-color-warn);
    background: rgba(217, 119, 6, 0.05);
}

.nl-tripel-card.is-archiviert .nl-tripel-card-label::after {
    content: " ⚠ archivierte Version";
    color: var(--nl-color-warn);
    font-weight: 500;
}

.nl-tripel-sep {
    align-self: center;
    font-size: 16px;
    font-weight: 500;
    color: var(--nl-color-text-secondary);
    user-select: none;
    padding-top: 16px;
}

@media (max-width: 900px) {
    .nl-tripel-grid {
        grid-template-columns: 1fr;
    }
    .nl-tripel-sep {
        display: none;
    }
}

/* Vorschau-Pille für das Pruefposition-Tripel — reproduziert das Listen-Format. */
.nl-preview-pill {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    background: rgba(38, 39, 102, 0.08);
    border: 1px solid rgba(38, 39, 102, 0.15);
    border-radius: 999px;
    font-family: ui-monospace, "Cascadia Mono", "Segoe UI Mono", monospace;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-primary-dark);
}

.nl-preview-pill-label {
    font-family: var(--nl-font-family);
    font-size: var(--nl-font-size-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--nl-color-text-secondary);
}

.nl-preview-pill .badge-akkr {
    background: var(--nl-color-io);
    color: white;
    font-size: 10px;
    padding: 2px 6px;
    border-radius: 4px;
    font-family: var(--nl-font-family);
}

/* ----- KPI-Strip: horizontale Mini-Aggregate unter einem Entity-Header ----- */
.nl-kpi-strip {
    display: flex;
    flex-wrap: wrap;
    gap: 18px;
    padding: 10px 0 6px 0;
    border-bottom: 1px solid #ECEEF1;
    margin-bottom: 16px;
}

.nl-kpi {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.nl-kpi-label {
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--nl-color-text-secondary);
}

.nl-kpi-value {
    font-size: var(--nl-font-size-base);
    font-weight: 600;
    color: var(--nl-color-text-primary);
    line-height: 1.2;
}

.nl-kpi-value.is-warn { color: var(--nl-color-warn); }
.nl-kpi-value.is-nio  { color: var(--nl-color-nio); }
.nl-kpi-value.is-io   { color: var(--nl-color-io); }

/* ----- Pruefumfang: Gruppierte Liste der enthaltenen Prüfverfahren ----- */
.nl-pos-gruppe {
    border: 1px solid #ECEEF1;
    border-radius: 8px;
    margin-bottom: 10px;
    overflow: hidden;
    background: var(--nl-color-bg-card);
}

.nl-pos-gruppe[open] {
    background: #FFFFFF;
}

.nl-pos-gruppe summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px 14px;
    background: #F7F8FA;
    cursor: pointer;
    list-style: none;
    user-select: none;
    border-bottom: 1px solid transparent;
    transition: background 0.15s;
}

.nl-pos-gruppe[open] summary {
    border-bottom-color: #ECEEF1;
}

.nl-pos-gruppe summary::-webkit-details-marker { display: none; }
.nl-pos-gruppe summary::marker { content: ''; }

.nl-pos-gruppe summary::before {
    content: '▸';
    color: var(--nl-color-text-secondary);
    font-size: 10px;
    margin-right: 8px;
    transition: transform 0.15s;
    display: inline-block;
}

.nl-pos-gruppe[open] summary::before {
    transform: rotate(90deg);
}

.nl-pos-gruppe summary:hover {
    background: #EFF2F6;
}

.nl-pos-gruppe-titel {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-primary);
    flex: 1;
}

.nl-pos-gruppe-count {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    font-variant-numeric: tabular-nums;
}

.nl-pos-table {
    width: 100%;
    border-collapse: collapse;
}

.nl-pos-table thead th {
    font-size: 10px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--nl-color-text-secondary);
    padding: 8px 14px;
    border-bottom: 1px solid #ECEEF1;
    text-align: left;
}

.nl-pos-table tbody td {
    padding: 8px 14px;
    border-bottom: 1px solid #F4F5F7;
    font-size: var(--nl-font-size-sm);
    vertical-align: middle;
}

.nl-pos-table tbody tr:last-child td {
    border-bottom: none;
}

.nl-pos-table tbody tr:hover {
    background: rgba(38, 39, 102, 0.025);
}

.nl-pos-tripel {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-family: ui-monospace, "Cascadia Mono", "Segoe UI Mono", monospace;
    font-size: var(--nl-font-size-sm);
}

.nl-pos-tripel strong {
    color: var(--nl-color-primary-dark);
}

.nl-pos-sep {
    color: var(--nl-color-text-secondary);
}

/* ----- Vorlagen-Picker im Pruefumfang-Dialog ----- */
.nl-vorlage-liste {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 12px;
}

.nl-vorlage-card {
    text-align: left;
    background: var(--nl-color-bg-card);
    border: 1px solid #E2E6EC;
    border-radius: 8px;
    padding: 12px 14px;
    cursor: pointer;
    transition: border-color 0.15s, box-shadow 0.15s;
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.nl-vorlage-card:hover {
    border-color: var(--nl-color-primary-light);
    box-shadow: 0 2px 8px rgba(38, 39, 102, 0.06);
}

.nl-vorlage-card.is-selected {
    border-color: var(--nl-color-primary);
    background: rgba(38, 39, 102, 0.04);
    box-shadow: 0 0 0 2px rgba(38, 39, 102, 0.12);
}

.nl-vorlage-card-title {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 8px;
}

.nl-vorlage-card-title strong {
    font-size: var(--nl-font-size-base);
    color: var(--nl-color-text-primary);
}

.nl-vorlage-card-quelle {
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--nl-color-text-secondary);
}

.nl-vorlage-card-desc {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    line-height: 1.4;
}

.nl-vorlage-card-meta {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
}

.nl-vorlage-vorschau-titel {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    margin: 0 0 8px 0;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--nl-color-text-secondary);
}

/* ----- Up/Down-Sortier-Buttons im Pruefumfang ----- */
.nl-pos-move {
    background: transparent;
    border: 1px solid #D5DAE0;
    color: var(--nl-color-text-secondary);
    width: 24px;
    height: 24px;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 10px;
    cursor: pointer;
    transition: background 0.15s, border-color 0.15s, color 0.15s;
    padding: 0;
}

.nl-pos-move:hover:not(:disabled) {
    background: rgba(38, 39, 102, 0.06);
    border-color: var(--nl-color-primary-light);
    color: var(--nl-color-primary);
}

.nl-pos-move:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

/* ----- Positionsliste mit mehreren Editierfeldern pro Zeile (Probenahmeplan-Editor) -----
   Anders als .nl-pos-table (reine Anzeige-Tabelle) braucht eine Zeile mit 5-7 editierbaren
   Feldern eine Card statt einer Tabellenzeile. */
.nl-pos-liste {
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.nl-pos-item {
    border: 1px solid var(--nl-color-border-card);
    border-radius: var(--nl-radius-md);
    background: var(--nl-color-surface-subtle);
    padding: 12px 14px;
}

.nl-pos-item-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-bottom: 10px;
}

.nl-pos-item-title {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-primary);
}

.nl-pos-item-actions {
    display: flex;
    align-items: center;
    gap: 6px;
}

/* ----- Akkreditierungs-Report: Quote-Bar ----- */
.nl-quote-bar {
    display: inline-block;
    width: 140px;
    height: 8px;
    background: #ECEEF1;
    border-radius: 4px;
    overflow: hidden;
    vertical-align: middle;
    margin-right: 8px;
}

.nl-quote-bar-fill {
    height: 100%;
    background: var(--nl-color-io);
    transition: width 0.3s;
}

.nl-quote-bar-fill.is-warn    { background: var(--nl-color-warn); }
.nl-quote-bar-fill.is-nio     { background: var(--nl-color-nio); }
.nl-quote-bar-fill.is-io      { background: var(--nl-color-io); }
/* Neutral: zu wenig Faelle fuer eine belastbare Quote (Mindest-Nenner-Guard). */
.nl-quote-bar-fill.is-neutral { background: var(--nl-color-nb); }

.nl-quote-bar-label {
    font-variant-numeric: tabular-nums;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
}

/* ----- Methoden-Vorschlags-Chips im PruefpositionEditor ----- */
.nl-methoden-vorschlaege {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
}

.nl-methoden-vorschlaege-label {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    margin-right: 4px;
}

.nl-methoden-chip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 3px 10px;
    background: transparent;
    border: 1px solid #D5DAE0;
    border-radius: 999px;
    color: var(--nl-color-text-primary);
    font-size: var(--nl-font-size-xs);
    font-family: ui-monospace, "Cascadia Mono", "Segoe UI Mono", monospace;
    cursor: pointer;
    transition: background 0.15s, border-color 0.15s, color 0.15s;
}

.nl-methoden-chip:hover {
    background: rgba(38, 39, 102, 0.06);
    border-color: var(--nl-color-primary-light);
    color: var(--nl-color-primary);
}

.nl-methoden-chip.is-active {
    background: var(--nl-color-primary);
    border-color: var(--nl-color-primary);
    color: var(--nl-color-text-inverted);
}

.nl-methoden-chip.is-active .nl-methoden-chip-count {
    color: rgba(255, 255, 255, 0.8);
}

.nl-methoden-chip-count {
    font-size: 10px;
    color: var(--nl-color-text-secondary);
    font-variant-numeric: tabular-nums;
}

/* ----- Plausibilitäts-Hinweis für das gewählte Tripel ----- */
.nl-tripel-hint {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    padding: 6px 10px;
    border-radius: 6px;
    font-size: var(--nl-font-size-xs);
    line-height: 1.4;
}

.nl-tripel-hint-icon {
    font-size: 12px;
    line-height: 1.2;
    flex-shrink: 0;
}

.nl-tripel-hint.is-ok {
    background: rgba(22, 163, 74, 0.08);
    color: #14532D;
}

.nl-tripel-hint.is-info {
    background: rgba(37, 99, 235, 0.06);
    color: #1E3A8A;
}

/* ----- Multi-Umfang Chips an der Probe ----- */
.nl-umfang-list {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    padding: 10px 16px;
    background: rgba(38, 39, 102, 0.04);
    border: 1px solid #E2E6EC;
    border-radius: 8px;
    margin-bottom: 14px;
}

.nl-umfang-list-label {
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--nl-color-text-secondary);
    margin-right: 4px;
}

.nl-umfang-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    background: var(--nl-color-bg-card);
    border: 1px solid #D5DAE0;
    border-radius: 999px;
    font-size: var(--nl-font-size-sm);
}

.nl-umfang-chip a {
    color: var(--nl-color-primary-dark);
    text-decoration: none;
    font-weight: 500;
}

.nl-umfang-chip a:hover {
    text-decoration: underline;
}

.nl-umfang-chip-remove {
    background: transparent;
    border: none;
    color: var(--nl-color-text-secondary);
    cursor: pointer;
    font-size: 14px;
    padding: 0;
    line-height: 1;
    margin-left: 2px;
}

.nl-umfang-chip-remove:hover:not(:disabled) {
    color: var(--nl-color-nio);
}

.nl-umfang-chip-remove:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

.nl-umfang-chip--add {
    background: transparent;
    border: 1px dashed var(--nl-color-primary-light);
    color: var(--nl-color-primary);
    cursor: pointer;
    font-size: var(--nl-font-size-sm);
    font-weight: 500;
}

.nl-umfang-chip--add:hover:not(:disabled) {
    background: rgba(38, 39, 102, 0.08);
}

/* ----- Checkliste für Prüfumfänge im Probendialog ----- */
.nl-checklist {
    display: flex;
    flex-direction: column;
    gap: 2px;
    max-height: 220px;
    overflow-y: auto;
    border: 1px solid #E2E6EC;
    border-radius: 6px;
    background: var(--nl-color-bg-card);
    padding: 4px;
}

.nl-checklist-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 7px 10px;
    border-radius: 4px;
    cursor: pointer;
    transition: background 0.12s;
    user-select: none;
    margin-bottom: 0;
}

.nl-checklist-item:hover {
    background: rgba(38, 39, 102, 0.05);
}

.nl-checklist-item.is-checked {
    background: rgba(38, 39, 102, 0.08);
}

.nl-checklist-item input[type="checkbox"] {
    margin: 0;
    flex-shrink: 0;
    accent-color: var(--nl-color-primary);
    width: 15px;
    height: 15px;
}

.nl-checklist-item-label {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
    line-height: 1.3;
}

.nl-checklist-item.is-checked .nl-checklist-item-label {
    font-weight: 500;
}

.nl-checklist-empty {
    padding: 12px 14px;
    border: 1px dashed #D5DAE0;
    border-radius: 6px;
    background: var(--nl-color-bg);
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
    font-style: italic;
}

.nl-checklist-counter {
    font-size: 10px;
    font-weight: 600;
    color: var(--nl-color-primary);
    background: rgba(38, 39, 102, 0.1);
    padding: 2px 7px;
    border-radius: 999px;
    margin-left: 8px;
    letter-spacing: 0.03em;
}

/* Action-Bar am Formular-Ende */
.nl-form-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    padding-top: 4px;
}

.nl-form-actions .nl-form-actions-end {
    margin-left: auto;
}

/* =====================================================================
   Zuordnungs-Chip-Picker (n:m-Zuordnungen in Stammdaten-Editoren)
   Verwendet in: ProbennahmestellenEditor, ArtikelEditor
   ===================================================================== */

/* Container fuer alle zugeordneten Chips. */
.nl-zuordnung-liste {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    padding: 0;
    list-style: none;
    margin: 0;
    align-items: flex-start;
}

/* Einzelner Chip — ein zugeordnetes Element. */
.nl-zuordnung-chip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    border: 1px solid var(--nl-color-border-card);
    border-radius: var(--nl-radius-sm);
    padding: 3px 6px 3px 8px;
    background: var(--nl-color-bg-card);
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
    transition: border-color 0.12s ease;
}

/* Hervorhebung wenn dieser Chip der Default ist — Border-Akzent, kein Hintergrund. */
.nl-zuordnung-chip[data-default="True"] {
    border-color: var(--nl-color-primary-light);
    box-shadow: inset 0 0 0 1px rgba(38, 39, 102, 0.12);
}

/* Stern-Button (Default-Toggle). */
.nl-chip-default {
    background: transparent;
    border: none;
    cursor: pointer;
    color: var(--nl-color-text-secondary);
    font-size: 14px;
    line-height: 1;
    padding: 0 2px;
    display: inline-flex;
    align-items: center;
    transition: color 0.12s ease;
    flex-shrink: 0;
}

.nl-chip-default:hover {
    color: var(--nl-color-primary);
}

.nl-chip-default:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    border-radius: 2px;
}

/* Wenn Default aktiv: Stern faerbt sich primary. */
.nl-zuordnung-chip[data-default="True"] .nl-chip-default {
    color: var(--nl-color-primary);
}

/* Label-Bereich: Kuerzel + Bezeichnung. */
.nl-chip-label {
    flex-grow: 1;
    min-width: 0;
    line-height: 1.3;
}

/* Entfernen-X. */
.nl-chip-remove {
    background: transparent;
    border: none;
    cursor: pointer;
    color: var(--nl-color-text-secondary);
    font-size: 14px;
    line-height: 1;
    padding: 0 2px;
    display: inline-flex;
    align-items: center;
    border-radius: 2px;
    transition: color 0.12s ease;
    flex-shrink: 0;
}

.nl-chip-remove:hover {
    color: var(--nl-color-nio);
}

.nl-chip-remove:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
}

/* Leer-State unterhalb der Chip-Liste. */
.nl-zuordnung-leer {
    font-style: italic;
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
}

/* Hinzufuegen-Button am Ende der Liste. */
.nl-zuordnung-hinzufuegen {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    background: transparent;
    border: 1px dashed var(--nl-color-primary-light);
    border-radius: var(--nl-radius-sm);
    color: var(--nl-color-primary);
    font-size: var(--nl-font-size-sm);
    font-weight: 500;
    padding: 3px 10px;
    cursor: pointer;
    transition: background 0.12s ease, border-color 0.12s ease;
}

.nl-zuordnung-hinzufuegen:hover {
    background: rgba(38, 39, 102, 0.06);
    border-color: var(--nl-color-primary);
}

.nl-zuordnung-hinzufuegen:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
}

/* Innerhalb DxTabs: Cards-Spacing beibehalten ohne extra Margin-Collaps. */
.nl-tab-formcards {
    display: flex;
    flex-direction: column;
    gap: 18px;
    padding: 12px 0 0 0;
}

/* Inline-Form (z.B. "Position hinzufuegen" innerhalb einer Card) */
.nl-inline-form {
    background: rgba(38, 39, 102, 0.04);
    border-radius: var(--nl-radius-md);
    border: 1px dashed rgba(15, 48, 87, 0.18);
    padding: 14px 16px;
    margin-top: 12px;
}

.nl-inline-form-title {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-primary);
    margin: 0 0 10px 0;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

/* =====================================================================
   DxPopup-Editor-Layout — 4th Pass (2026-05-27)
   ---------------------------------------------------------------------
   Aesthetic: Linear / Notion / Stripe-Dashboard. Editorial dense
   productivity. KEINE Cards mehr — Meta-Bar, Sections und Mapping-Listen
   sind flach, getrennt durch Hairlines. Hierarchie aus TYPOGRAFIE statt
   Containern: 10 px uppercase caption, 11 px label, 13 px body. Eine
   einzige Akzentfarbe (--nl-color-primary) fuer Primary-CTA und Focus.

   Pattern (auf einen Blick):
   - `nl-popup-body`           — flat wrapper, 14/20 padding, 12 px gap
   - `nl-popup-meta`           — inline pill-pipeline, KEIN Container
   - `nl-popup-meta-hint`      — amber-accent strip fuer Read-Only-Hinweis
   - `nl-popup-section`        — Hairline-Top, KEINE Box, KEIN Background
   - `nl-popup-section-title`  — Grid: caption + hint (untereinander) + action
   - `nl-popup-actions`        — Sticky-Footer, Hairline-Top, transparent BG
   - `nl-mapping-list`         — flach, NO outer border, only Hairlines

   Konventionen:
   - Inputs 28 px high, Labels 11 px, body 13 px, caption 10 px uppercase.
   - Section-Hint immer UNTER der Caption (nicht inline rechts daneben).
   - Helper-Text als `<small class="nl-form-hint">` direkt unter Input.
   - Primary-CTA = einzige Akzentfarbe; "Abbrechen" als ruhiger Text-Link.
   ===================================================================== */

/* Body — flacher Wrapper. 14 px Top, 20 px Sides, 0 Bottom (Sticky-Footer). */
.nl-popup-body {
    padding: 14px 20px 0 20px;
    display: flex;
    flex-direction: column;
    gap: 12px;
    color: var(--nl-color-text-primary);
    font-size: 13px;
    line-height: 1.5;
}

/* ---- INPUTS ----------------------------------------------------------
   28 px hoch, 1-px-Border in Card-Grey, transparenter Default-BG (kein
   "buttoned"-Look). Hover dunkelt nur die Border, Focus bringt Primary-
   Border + 1-px-Shadow — kein dicker Glow. */
.nl-popup-body .form-control,
.nl-popup-body .form-select {
    height: 28px;
    min-height: 28px;
    padding: 4px 10px;
    font-size: 13px;
    line-height: 1.4;
    background-color: #FFFFFF;
    border: 1px solid var(--nl-color-border-card);
    border-radius: 4px;
    color: var(--nl-color-text-primary);
    transition: border-color 0.12s ease, box-shadow 0.12s ease;
    box-shadow: none;
}

.nl-popup-body select.form-select {
    background-position: right 8px center;
    background-size: 14px;
    padding-right: 26px;
}

.nl-popup-body .form-control:hover:not(:focus):not(:disabled),
.nl-popup-body .form-select:hover:not(:focus):not(:disabled) {
    border-color: #B6BDC7;
}

.nl-popup-body .form-control:focus,
.nl-popup-body .form-select:focus {
    border-color: var(--nl-color-primary);
    box-shadow: 0 0 0 1px var(--nl-color-primary);
    outline: none;
}

.nl-popup-body .form-control::placeholder {
    color: #A4AAB3;
    font-weight: 400;
}

.nl-popup-body .form-control:disabled,
.nl-popup-body .form-select:disabled,
.nl-popup-body fieldset:disabled .form-control,
.nl-popup-body fieldset:disabled .form-select {
    background-color: #F6F7F9;
    color: var(--nl-color-text-secondary);
    cursor: not-allowed;
    border-color: #E5E8ED;
}

.nl-popup-body textarea.form-control { height: auto; min-height: 56px; padding: 6px 10px; }

/* Labels: 11 px, semibold, neutralgrau — klar UNTER Input-Text in der Hierarchie. */
.nl-popup-body .form-label {
    font-size: 11px;
    font-weight: 500;
    margin-bottom: 3px;
    color: #5A6270;
    letter-spacing: 0.005em;
    line-height: 1.3;
}

.nl-popup-body .form-label .text-muted {
    color: #9AA0A8;
    font-weight: 400;
}

/* Checkboxes — auf 28-px-Hoehe abgestimmt, damit Reihen ausalignen. */
.nl-popup-body .form-check {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding-left: 0;
    margin: 0;
    min-height: 28px;
}

.nl-popup-body .form-check-input {
    margin: 0;
    width: 14px;
    height: 14px;
    cursor: pointer;
    border-color: #C7CDD5;
}

.nl-popup-body .form-check-input:checked {
    background-color: var(--nl-color-primary);
    border-color: var(--nl-color-primary);
}

.nl-popup-body .form-check-label {
    font-size: 13px;
    color: var(--nl-color-text-primary);
    cursor: pointer;
}

/* Helper-Text direkt unter Input — 11 px, neutralgrau. */
.nl-popup-body .nl-form-hint {
    margin-top: 3px;
    font-size: 11px;
    color: #6B7280;
    line-height: 1.45;
}

.nl-popup-body .nl-form-hint code {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-size: 11px;
    padding: 1px 5px;
    background: var(--nl-color-surface-subtle);
    border: 1px solid var(--nl-color-border-card);
    border-radius: 3px;
    color: #2A3340;
}

/* DevExpress Inputs auf dieselbe Hoehe und Border-Sprache bringen. */
.nl-popup-body .dxbs-editor .dxbs-input,
.nl-popup-body .dxbs-edit-input {
    padding: 3px 10px;
    font-size: 13px;
    height: 28px;
    min-height: 28px;
    background-color: #FFFFFF;
}

.nl-popup-body .dxbs-spin-edit,
.nl-popup-body .dxbs-combobox {
    height: 28px;
    min-height: 28px;
    border-radius: 4px;
    border-color: var(--nl-color-border-card);
    background-color: #FFFFFF;
}

.nl-popup-body .dxbs-combobox:hover { border-color: #B6BDC7; }
.nl-popup-body .dxbs-combobox:focus-within {
    border-color: var(--nl-color-primary);
    box-shadow: 0 0 0 1px var(--nl-color-primary);
}

/* Form-Grid: enge gaps fuer dichten Vertical-Rhythm. */
.nl-popup-body .nl-form-grid {
    row-gap: 10px;
    column-gap: 14px;
}

/* ---- META-LEISTE (Subheader unter Popup-Title) -----------------------
   KEIN Container, KEIN Background, KEIN Border. Inline-Pipeline:
   Status-Pill | Bullet | Version | Bullet | Erstellt | Bullet | Freigegeben.
   Sitzt visuell tight zum DxPopup-Header — wie eine zweite Title-Zeile.
   Read-Only-Hinweis kommt als eigene amber-accent strip darunter. */
.nl-popup-meta {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0;
    margin: -2px 0 -4px 0;
    padding: 0;
    background: transparent;
    border: none;
    border-radius: 0;
    font-size: 12px;
    line-height: 1.4;
    color: #4A5160;
}

.nl-popup-meta-status {
    margin-right: 12px;
    display: inline-flex;
    align-items: center;
}

.nl-popup-meta-item {
    display: inline-flex;
    align-items: baseline;
    gap: 5px;
    padding-right: 14px;
    position: relative;
}

.nl-popup-meta-item + .nl-popup-meta-item::before {
    content: "·";
    position: absolute;
    left: -7px;
    top: -1px;
    color: #C7CDD5;
    font-weight: 700;
}

.nl-popup-meta-label {
    font-size: 10px;
    color: #8A8F99;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
}

.nl-popup-meta-value {
    font-size: 12px;
    font-weight: 500;
    color: #2A3340;
    font-variant-numeric: tabular-nums;
}

/* Read-Only-Hinweis: eigene Zeile mit amber-accent — visuell unaufdringlich
   aber klar als "Achtung" lesbar. */
.nl-popup-meta-hint {
    flex: 1 1 100%;
    margin: 8px 0 0 0;
    padding: 6px 10px;
    background: #FFFBEB;
    border-left: 2px solid #F59E0B;
    border-radius: 0 3px 3px 0;
    font-size: 11px;
    color: #78350F;
    line-height: 1.45;
}

.nl-popup-meta .badge {
    font-size: 10px;
    font-weight: 600;
    padding: 3px 7px;
    border-radius: 3px;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    line-height: 1.4;
}

/* ---- SECTION = Caption-Block + Felder --------------------------------
   KEIN Container, KEIN Background, KEINE Box. Sections trennen sich
   AUSSCHLIESSLICH ueber Hairline-Top + 12 px padding. */
.nl-popup-section {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding-top: 12px;
    border-top: 1px solid var(--nl-color-border-default);
}

.nl-popup-section:first-child {
    padding-top: 2px;
    border-top: none;
}

/* Section-Title als Grid: Caption (10 px uppercase) + Hint (11 px regular,
   UNTER der Caption) + optional Action-Slot rechts vertikal zentriert.
   Markup-kompatibel mit bestehenden Editoren: Caption, Hint und Action
   sind direkte Kinder von .nl-popup-section-title. */
.nl-popup-section-title {
    display: grid;
    grid-template-columns: 1fr auto;
    grid-template-areas:
        "text   action"
        "hint   action";
    gap: 2px 16px;
    align-items: start;
    margin: 0;
    padding: 0;
    border: none;
    background: transparent;
    line-height: 1.3;
}

.nl-popup-section-title-text {
    grid-area: text;
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: #6B7280;
    line-height: 1.2;
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

/* Hint sitzt UNTER der Caption — Notion-Style "subtitle". */
.nl-popup-section-hint {
    grid-area: hint;
    margin: 0;
    font-size: 11px;
    font-weight: 400;
    color: #8A8F99;
    line-height: 1.4;
    text-transform: none;
    letter-spacing: 0;
    text-align: left;
    max-width: 100%;
}

/* Legacy: section-number wird nie mehr gerendert. */
.nl-popup-section-number { display: none; }
.nl-popup-section-body { padding: 0; }
.nl-popup-section > .nl-form-grid { padding: 0; }

/* Action-Slot rechts (z.B. "+ Mapping hinzufuegen"). Vertikal zentriert
   ueber beide Caption-Zeilen. */
.nl-popup-section-action {
    grid-area: action;
    align-self: center;
}

.nl-popup-section-action .btn-link,
.nl-popup-section-action .dxbs-link,
.nl-popup-section-action .dxbs-button {
    padding: 3px 8px;
    font-size: 11px;
    text-decoration: none;
    color: var(--nl-color-primary);
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 4px;
    line-height: 1.3;
    transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}

.nl-popup-section-action .btn-link:hover,
.nl-popup-section-action .dxbs-link:hover {
    text-decoration: none;
    color: var(--nl-color-primary-dark);
    background: rgba(38, 39, 102, 0.06);
    border-color: rgba(38, 39, 102, 0.16);
}

/* ---- STICKY ACTION-BAR ----------------------------------------------
   Sitzt unten, bricht aus dem nl-popup-body-Padding aus. NUR Hairline-Top
   als Trenner — KEIN Background-Tint, KEIN Bottom-Radius. Primary-CTA
   ist die einzige Akzentfarbe, "Abbrechen" als ruhiger Text-Link. */
.nl-popup-actions {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: 6px;
    padding: 10px 20px;
    margin: 8px -20px 0 -20px;
    background: transparent;
    border-top: 1px solid var(--nl-color-border-default);
    border-radius: 0;
}

.nl-popup-actions .nl-popup-actions-left {
    margin-right: auto;
    color: #6B7280;
    font-size: 11px;
}

/* Buttons in der Action-Bar: kompakte 28 px, 12 px font, klare Hierarchie. */
.nl-popup-actions .btn,
.nl-popup-actions .dxbs-button {
    height: 28px;
    min-height: 28px;
    padding: 3px 12px;
    font-size: 12px;
    font-weight: 500;
    border-radius: 4px;
    line-height: 1.3;
    letter-spacing: 0;
    box-shadow: none;
}

/* "Abbrechen" als ruhiger Text-Link — wirkt nicht wie ein 2. CTA. */
.nl-popup-actions .btn-link {
    color: #6B7280;
    text-decoration: none;
    padding: 3px 10px;
    font-weight: 500;
    background: transparent;
    border: 1px solid transparent;
}

.nl-popup-actions .btn-link:hover {
    color: #2A3340;
    text-decoration: none;
    background: var(--nl-color-surface-subtle);
}

/* Primary-CTA = einzige Akzentfarbe — kein Shadow-Tiefen-Effekt. */
.nl-popup-actions .btn-primary,
.nl-popup-actions .dxbs-button.dxbs-primary {
    background: var(--nl-color-primary);
    border-color: var(--nl-color-primary);
    color: #FFFFFF;
}

.nl-popup-actions .btn-primary:hover,
.nl-popup-actions .dxbs-button.dxbs-primary:hover {
    background: var(--nl-color-primary-dark, #1a1b4b);
    border-color: var(--nl-color-primary-dark, #1a1b4b);
}

.nl-popup-actions .btn-secondary,
.nl-popup-actions .btn-outline-secondary,
.nl-popup-actions .dxbs-button.dxbs-secondary {
    background: #FFFFFF;
    border-color: var(--nl-color-border-card);
    color: #2A3340;
    box-shadow: none;
}

.nl-popup-actions .btn-secondary:hover,
.nl-popup-actions .btn-outline-secondary:hover,
.nl-popup-actions .dxbs-button.dxbs-secondary:hover {
    background: var(--nl-color-surface-subtle);
    border-color: #B6BDC7;
    color: #1A2030;
}

/* DevExpress text-Mode-Button: noch ruhiger gehalten. */
.nl-popup-actions .dxbs-button-text {
    background: transparent;
    border-color: transparent;
    color: #6B7280;
    box-shadow: none;
}
.nl-popup-actions .dxbs-button-text:hover {
    background: var(--nl-color-surface-subtle);
    color: #2A3340;
}

/* Loesch-Button (links in der Action-Bar) als ruhiger danger-link. */
.nl-popup-actions .dxbs-button.dxbs-danger {
    background: transparent;
    border-color: transparent;
    color: #B91C1C;
    margin-right: auto;
}
.nl-popup-actions .dxbs-button.dxbs-danger:hover {
    background: rgba(220, 38, 38, 0.06);
    color: #991B1B;
}

/* ---- MAPPING-LISTE (flach, ohne Card-Look) --------------------------
   KEIN outer Border, KEINE Rounded-Corners. Caption-Row + Daten-Rows,
   getrennt durch Hairlines. Inputs in den Rows starten "ghost" (transparente
   Border) und kommen erst bei Hover/Focus zum Vorschein — Linear-Style. */
.nl-mapping-list {
    display: flex;
    flex-direction: column;
    margin: 2px 0 0 0;
    background: transparent;
    border: none;
    border-radius: 0;
    overflow: visible;
}

.nl-mapping-caption {
    display: grid;
    grid-template-columns: minmax(0, 38%) 18px minmax(0, 1fr) 64px 26px;
    gap: 10px;
    align-items: center;
    padding: 5px 4px;
    background: transparent;
    border-bottom: 1px solid var(--nl-color-border-default);
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: 0.09em;
    color: #8A8F99;
    font-weight: 600;
}

.nl-mapping-caption-quell,
.nl-mapping-caption-param { line-height: 1; }
.nl-mapping-caption-arrow,
.nl-mapping-caption-act   { font-size: 0; }
.nl-mapping-caption-flag  { text-align: center; line-height: 1; }

.nl-mapping-row {
    display: grid;
    grid-template-columns: minmax(0, 38%) 18px minmax(0, 1fr) 64px 26px;
    gap: 10px;
    align-items: center;
    padding: 4px 4px;
    background: transparent;
    border: none;
    border-bottom: 1px solid var(--nl-color-border-default);
    border-radius: 0;
    transition: background-color 0.12s ease;
}

.nl-mapping-row:last-child { border-bottom: none; }

.nl-mapping-row:hover {
    background: var(--nl-color-surface-subtle);
}

.nl-mapping-row:focus-within {
    background: var(--nl-color-surface-hover);
}

.nl-mapping-cell-quell { min-width: 0; }
.nl-mapping-cell-param { min-width: 0; }

.nl-mapping-cell-arrow {
    display: flex;
    align-items: center;
    justify-content: center;
    color: #C7CDD5;
}

.nl-mapping-cell-flag {
    display: flex;
    align-items: center;
    justify-content: center;
}

.nl-mapping-cell-flag .form-check { margin: 0; min-height: 0; }
.nl-mapping-cell-flag .form-check-input { margin: 0; }

.nl-mapping-cell-actions {
    display: flex;
    align-items: center;
    justify-content: center;
}

.nl-mapping-cell-actions .dxbs-button,
.nl-mapping-cell-actions .btn {
    width: 24px;
    height: 24px;
    padding: 0;
    color: #9AA0A8;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 4px;
    transition: color 0.12s ease, background 0.12s ease, border-color 0.12s ease;
}

.nl-mapping-cell-actions .dxbs-button:hover,
.nl-mapping-cell-actions .btn:hover {
    color: #B91C1C;
    background: rgba(220, 38, 38, 0.08);
    border-color: rgba(220, 38, 38, 0.18);
}

/* Inputs in den Mapping-Rows: GHOST-Style — transparente Border im
   Default, sichtbar bei Hover/Focus. Bewusst klein (26 px) fuer dichte
   Liste. */
.nl-mapping-row .form-control,
.nl-mapping-row .form-select,
.nl-mapping-row .dxbs-editor .dxbs-input,
.nl-mapping-row .dxbs-edit-input {
    height: 26px;
    min-height: 26px;
    padding: 3px 8px;
    font-size: 12px;
    border: 1px solid transparent;
    background: transparent;
    box-shadow: none;
    border-radius: 3px;
}

.nl-mapping-row:hover .form-control,
.nl-mapping-row:hover .form-select,
.nl-mapping-row:hover .dxbs-combobox {
    border-color: var(--nl-color-border-card);
    background: #FFFFFF;
}

.nl-mapping-row .form-control:focus,
.nl-mapping-row .form-select:focus,
.nl-mapping-row .dxbs-combobox:focus-within {
    border-color: var(--nl-color-primary);
    box-shadow: 0 0 0 1px var(--nl-color-primary);
    background: #FFFFFF;
}

.nl-mapping-row .dxbs-combobox {
    height: 26px;
    min-height: 26px;
    border-radius: 3px;
    border: 1px solid transparent;
    background: transparent;
}

/* Empty-State: ruhig, klein. */
.nl-mapping-empty {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    gap: 3px;
    padding: 14px 12px;
    text-align: center;
    color: var(--nl-color-text-secondary);
    font-size: 12px;
    background: transparent;
    border: 1px dashed var(--nl-color-border-card);
    border-radius: 4px;
}

.nl-mapping-empty-hint {
    font-size: 11px;
    color: #8A8F99;
    line-height: 1.4;
    max-width: 360px;
}

/* ---- DxPopup-Chrome (Header + Footer von DevExpress) ----------------
   Manche Editoren (z. B. PruefumfangDefaultsListe) nutzen Dxs eigene
   FooterContentTemplate-Slot statt inline .nl-popup-actions. Damit
   beide Patterns visuell identisch sind, kriegt die DevExpress-Footer-
   Chrome dieselbe Behandlung: transparent BG, Hairline-Top, 28-px-Buttons,
   Primary-CTA als einzige Akzentfarbe. Defensive Selektor-Liste fuer
   moegliche DevExpress-Klassen (dxbl-* in 25.x, dxbs-* in aelteren
   Bootstrap-Themes). */
.nl-popup-sm .dxbl-popup-footer,
.nl-popup-md .dxbl-popup-footer,
.nl-popup-lg .dxbl-popup-footer,
.nl-popup-xl .dxbl-popup-footer,
.nl-popup-sm .dxbs-popup-footer,
.nl-popup-md .dxbs-popup-footer,
.nl-popup-lg .dxbs-popup-footer,
.nl-popup-xl .dxbs-popup-footer,
.nl-popup-sm .modal-footer,
.nl-popup-md .modal-footer,
.nl-popup-lg .modal-footer,
.nl-popup-xl .modal-footer {
    padding: 10px 20px;
    background: transparent;
    border-top: 1px solid var(--nl-color-border-default);
    border-radius: 0;
    gap: 6px;
    justify-content: flex-end;
    align-items: center;
}

.nl-popup-sm .dxbl-popup-footer .dxbl-button,
.nl-popup-md .dxbl-popup-footer .dxbl-button,
.nl-popup-lg .dxbl-popup-footer .dxbl-button,
.nl-popup-xl .dxbl-popup-footer .dxbl-button,
.nl-popup-sm .dxbs-popup-footer .dxbs-button,
.nl-popup-md .dxbs-popup-footer .dxbs-button,
.nl-popup-lg .dxbs-popup-footer .dxbs-button,
.nl-popup-xl .dxbs-popup-footer .dxbs-button,
.nl-popup-sm .modal-footer .dxbs-button,
.nl-popup-md .modal-footer .dxbs-button,
.nl-popup-lg .modal-footer .dxbs-button,
.nl-popup-xl .modal-footer .dxbs-button {
    height: 28px;
    min-height: 28px;
    padding: 3px 12px;
    font-size: 12px;
    font-weight: 500;
    border-radius: 4px;
    line-height: 1.3;
    letter-spacing: 0;
    box-shadow: none;
}

/* Primary-CTA — Akzentfarbe nur hier. */
.nl-popup-sm .dxbl-popup-footer .dxbl-button.dxbl-button-primary,
.nl-popup-md .dxbl-popup-footer .dxbl-button.dxbl-button-primary,
.nl-popup-lg .dxbl-popup-footer .dxbl-button.dxbl-button-primary,
.nl-popup-xl .dxbl-popup-footer .dxbl-button.dxbl-button-primary,
.nl-popup-sm .dxbs-popup-footer .dxbs-button-primary,
.nl-popup-md .dxbs-popup-footer .dxbs-button-primary,
.nl-popup-lg .dxbs-popup-footer .dxbs-button-primary,
.nl-popup-xl .dxbs-popup-footer .dxbs-button-primary {
    background: var(--nl-color-primary);
    border-color: var(--nl-color-primary);
    color: #FFFFFF;
}

/* Danger-Button (Loeschen) als ruhiger Link, NICHT als 2. CTA. */
.nl-popup-sm .dxbl-popup-footer .dxbl-button.dxbl-button-danger,
.nl-popup-md .dxbl-popup-footer .dxbl-button.dxbl-button-danger,
.nl-popup-lg .dxbl-popup-footer .dxbl-button.dxbl-button-danger,
.nl-popup-xl .dxbl-popup-footer .dxbl-button.dxbl-button-danger,
.nl-popup-sm .dxbs-popup-footer .dxbs-button-danger,
.nl-popup-md .dxbs-popup-footer .dxbs-button-danger,
.nl-popup-lg .dxbs-popup-footer .dxbs-button-danger,
.nl-popup-xl .dxbs-popup-footer .dxbs-button-danger {
    background: transparent;
    border-color: transparent;
    color: #B91C1C;
    margin-right: auto;
}
.nl-popup-sm .dxbl-popup-footer .dxbl-button.dxbl-button-danger:hover,
.nl-popup-md .dxbl-popup-footer .dxbl-button.dxbl-button-danger:hover,
.nl-popup-lg .dxbl-popup-footer .dxbl-button.dxbl-button-danger:hover,
.nl-popup-xl .dxbl-popup-footer .dxbl-button.dxbl-button-danger:hover,
.nl-popup-sm .dxbs-popup-footer .dxbs-button-danger:hover,
.nl-popup-md .dxbs-popup-footer .dxbs-button-danger:hover,
.nl-popup-lg .dxbs-popup-footer .dxbs-button-danger:hover,
.nl-popup-xl .dxbs-popup-footer .dxbs-button-danger:hover {
    background: rgba(220, 38, 38, 0.06);
    color: #991B1B;
}

/* Header-Chrome — etwas straffer und neutraler im Look (DevExpress-Default
   ist zu "dialog-y"). */
.nl-popup-sm .dxbl-popup-header,
.nl-popup-md .dxbl-popup-header,
.nl-popup-lg .dxbl-popup-header,
.nl-popup-xl .dxbl-popup-header,
.nl-popup-sm .dxbs-popup-header,
.nl-popup-md .dxbs-popup-header,
.nl-popup-lg .dxbs-popup-header,
.nl-popup-xl .dxbs-popup-header {
    padding: 14px 20px 10px 20px;
    border-bottom: none;
    background: transparent;
}

.nl-popup-sm .dxbl-popup-header-title,
.nl-popup-md .dxbl-popup-header-title,
.nl-popup-lg .dxbl-popup-header-title,
.nl-popup-xl .dxbl-popup-header-title {
    font-size: 15px;
    font-weight: 600;
    color: #1A2030;
    letter-spacing: -0.005em;
}

/* ---- Legacy: nl-mapping-table (alte Editoren, die noch nicht migriert
   sind, brauchen ein Mindest-Styling). ---------------------------- */
.nl-mapping-table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    font-size: var(--nl-font-size-sm);
    background: var(--nl-color-bg-card);
    border: 1px solid rgba(38, 39, 102, 0.14);
    border-radius: var(--nl-radius-sm);
    overflow: hidden;
}

.nl-mapping-table thead th {
    background: rgba(38, 39, 102, 0.05);
    color: var(--nl-color-text-secondary);
    font-weight: 600;
    font-size: var(--nl-font-size-xs);
    padding: 7px 10px;
    text-align: left;
    border-bottom: 1px solid rgba(38, 39, 102, 0.12);
    white-space: nowrap;
}

.nl-mapping-table tbody td {
    padding: 7px 10px;
    border-bottom: 1px solid rgba(38, 39, 102, 0.07);
    vertical-align: middle;
}

.nl-mapping-table tbody tr:last-child td {
    border-bottom: none;
}

.nl-mapping-table tbody tr:hover {
    background: rgba(38, 39, 102, 0.03);
}

.nl-mapping-table .form-control,
.nl-mapping-table .form-select {
    font-size: var(--nl-font-size-sm);
    padding: 3px 8px;
    min-height: 28px;
    line-height: 1.4;
}

.nl-mapping-table-checkbox {
    text-align: center;
    width: 80px;
}

.nl-mapping-table-actions {
    text-align: right;
    width: 56px;
}

/* ---- [E-24] DxPopup-Width-Skala (einheitliche Grössen-Hierarchie)
   --------------------------------------------------------------------
   Größen-Skala (blazor setzt Width/MinWidth direkt an DxPopup):
     nl-popup-sm  — 480px  — einfache Dialoge (1-3 Felder, Bestätigungen)
     nl-popup-md  — 640px  — Standard-Editoren (4-8 Felder): ImportProfilEditor,
                             EtikettDesigner, DruckerKonfig, PruefumfangDefaults,
                             ProbenartEditor, ZusatzfeldEditor
     nl-popup-lg  — 860px  — Komplexe Editoren (Tabs/Grids): GrenzwertEditor,
                             PruefpositionTripel, SollwertEditor mit Mapping-Liste
     nl-popup-xl  — 1100px — Sehr breite Editoren (nur bei explizitem Bedarf)

   DxPopup-Width-Prop hat Vorrang vor CSS-Width — die Klasse sichert
   nur die max-width-Begrenzung auf kleinen Bildschirmen.
   Im Popup-Kontext: nl-form-container hat kein max-width-Limit
   (kein horizontales Einquetschen durch den form-container-Stil). */

.nl-popup-sm .dxbs-popup  { min-width: 480px; max-width: min(480px,  calc(100vw - 32px)); }
.nl-popup-md .dxbs-popup  { min-width: 480px; max-width: min(640px,  calc(100vw - 32px)); }
.nl-popup-lg .dxbs-popup  { min-width: 480px; max-width: min(860px,  calc(100vw - 32px)); }
.nl-popup-xl .dxbs-popup  { min-width: 480px; max-width: min(1100px, calc(100vw - 32px)); }

/* nl-form-container innerhalb eines Popups darf NICHT die 960px-Begrenzung
   oder das auto-Margin anwenden — der Popup-Rahmen definiert die Breite.
   blazor setzt nl-popup-body direkt; dieses Targeting stellt sicher,
   dass jeder nl-form-container unter einem nl-popup-body ebenfalls
   voll ausschöpft. */
.nl-popup-body .nl-form-container,
.nl-popup-body .nl-form-container.nl-form-container-wide,
.nl-popup-body .nl-form-container.nl-form-container-xwide {
    max-width: none;
    margin-left: 0;
    margin-right: 0;
}

@media (max-width: 768px) {
    /* Auf schmalen Viewports: Action-Slot wandert UNTER Caption+Hint,
       Grid kollabiert auf eine Spalte. */
    .nl-popup-section-title {
        grid-template-columns: 1fr;
        grid-template-areas:
            "text"
            "hint"
            "action";
        gap: 2px 0;
    }
    .nl-popup-section-action {
        align-self: start;
        margin-top: 4px;
    }
    /* Auf schmalen Viewports alle Popups auf Vollbreite minus Ränder */
    .nl-popup-sm .dxbs-popup,
    .nl-popup-md .dxbs-popup,
    .nl-popup-lg .dxbs-popup,
    .nl-popup-xl .dxbs-popup {
        min-width: 0;
        max-width: calc(100vw - 16px);
    }
}

/* ---- [E-23] Freigabe-Diff-Ansicht -----------------------------------
   Kompakte Alt→Neu-Tabelle in der Freigabe-Queue. Nur CSS-Tokens —
   kein hardcodiertes Hex. Wird als klappbares Panel pro Antrag
   dargestellt (Toggle via blazor-devexpress ToggleDiffAsync).
   --------------------------------------------------------------------- */
.nl-freigabe-diff {
    margin-top: 8px;
    border-top: 1px solid var(--nl-color-border-default);
    padding-top: 8px;
    font-size: var(--nl-font-size-xs);
}

.nl-freigabe-diff-loading,
.nl-freigabe-diff-leer,
.nl-freigabe-diff-fehler {
    color: var(--nl-color-text-secondary);
    font-style: italic;
}

.nl-freigabe-diff-neu {
    color: var(--nl-color-primary);
    font-weight: 500;
}

.nl-freigabe-diff-table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 4px;
}

.nl-freigabe-diff-table th {
    text-align: left;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--nl-color-text-secondary);
    border-bottom: 1px solid var(--nl-color-border-default);
    padding: 2px 8px 4px 0;
}

.nl-freigabe-diff-table td {
    padding: 3px 8px 3px 0;
    vertical-align: top;
    border-bottom: 1px solid var(--nl-color-border-default);
}

.nl-freigabe-diff-table tr:last-child td {
    border-bottom: none;
}

.nl-freigabe-diff-feld {
    font-weight: 500;
    color: var(--nl-color-text-primary);
    white-space: nowrap;
    min-width: 120px;
}

.nl-freigabe-diff-alt {
    color: var(--nl-color-nio);
    text-decoration: line-through;
    word-break: break-word;
}

.nl-freigabe-diff-neu {
    color: var(--nl-color-io);
    word-break: break-word;
}

/* =====================================================================
   Berichts-Viewer / -Designer — definite Höhe, sonst kollabiert die
   Komponente auf 0px (DxDocumentViewer hat keinen Auto-Höhen-Modus).
   ===================================================================== */
.nl-bericht-viewer-host {
    /* Toolbar oben ist ~40px hoch; Rest auf Viewport-Höhe ziehen. */
    height: calc(100vh - 40px);
    width: 100%;
}

.nl-bericht-designer-host {
    height: calc(100vh - 40px);
    width: 100%;
}

/* =====================================================================
   Bericht-Verwaltung — TreeView links + Detail-Card rechts
   ===================================================================== */
.nl-bericht-tree {
    list-style: none;
    padding: 0;
    margin: 0;
    font-size: var(--nl-font-size-sm);
}
.nl-bericht-tree ul {
    list-style: none;
    padding-left: 14px;
    margin: 0;
}
.nl-bericht-tree-item {
    display: block;
    width: 100%;
    text-align: left;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 6px;
    padding: 4px 8px;
    color: var(--nl-color-text-primary);
    cursor: pointer;
    transition: background 0.12s, border-color 0.12s;
}
.nl-bericht-tree-item:hover {
    background: var(--nl-color-surface-hover);
}
.nl-bericht-tree-item.active {
    background: #dbeafe;
    border-color: var(--nl-color-primary, #262766);
    font-weight: 600;
}
.nl-bericht-tree-icon {
    margin-right: 4px;
    opacity: 0.85;
}
.nl-bericht-tree-system {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 8px;
    color: var(--nl-color-text-secondary, #6b7280);
    border-bottom: 1px solid #e5e7eb;
    margin-bottom: 4px;
}
.nl-bericht-tree-system-icon {
    opacity: 0.7;
}

/* =====================================================================
   Dashboard — Charts + Aktionsliste
   ===================================================================== */
.nl-dashboard-charts {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
    margin-top: 16px;
}
@media (max-width: 991.98px) {
    .nl-dashboard-charts { grid-template-columns: 1fr; }
}

.nl-dashboard-chart-card {
    min-height: 300px;
}

/* Chart-Platzhalter: reserviert exakt die Chart-Hoehe, verhindert Layout-Shift */
.nl-chart-placeholder {
    background: var(--nl-color-surface-subtle);
    border-radius: var(--nl-radius-md);
    display: flex;
    align-items: center;
    justify-content: center;
    animation: nl-skeleton-pulse 1.8s ease-in-out infinite;
}
.nl-chart-placeholder-text {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
}
@keyframes nl-skeleton-pulse {
    0%, 100% { opacity: 0.55; }
    50%       { opacity: 1; }
}

/* =====================================================================
   Skeleton-UI — ProbeDetail Lade-Platzhalter (N1)
   nl-skeleton-line: schmale Zeile (Text-Platzhalter)
   nl-skeleton-block: breiterer Block (Zeilen-Platzhalter)
   Beide nutzen nl-skeleton-pulse aus dem Chart-Platzhalter-Block oben.
   ===================================================================== */
.nl-skeleton-line,
.nl-skeleton-block {
    background: var(--nl-color-surface-subtle);
    border-radius: var(--nl-radius-sm);
    display: block;
    animation: nl-skeleton-pulse 1.5s ease-in-out infinite;
}
.nl-skeleton-line {
    height: 14px;
}
.nl-skeleton-line--sm {
    height: 11px;
}
.nl-skeleton-line--lg {
    height: 22px;
}
.nl-skeleton-block {
    height: 40px;
    border-radius: var(--nl-radius-md);
}

/* ProbeDetail spezifisches Skeleton-Layout */
.nl-probe-skeleton {
    padding: 0 0 24px;
    display: flex;
    flex-direction: column;
    gap: 12px;
}
.nl-probe-skeleton-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    padding: 16px 0 8px;
    gap: 16px;
}
.nl-probe-skeleton-toolbar {
    display: flex;
    gap: 8px;
    padding: 4px 0;
}
.nl-probe-skeleton-tabs {
    display: flex;
    gap: 4px;
    padding: 6px 0;
    border-bottom: 1px solid var(--nl-color-border);
}
.nl-probe-skeleton-content {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding-top: 8px;
}

.nl-dashboard-aktion {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 8px 0;
    border-bottom: 1px solid #e5e7eb;
}
.nl-dashboard-aktion:last-child { border-bottom: none; }
.nl-dashboard-aktion-icon {
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: #f5f7fa;
    font-size: 14px;
}
.nl-dashboard-aktion-text {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
}
.nl-dashboard-aktion-titel {
    font-weight: 600;
    color: var(--nl-color-text-primary);
    text-decoration: none;
}
.nl-dashboard-aktion-titel:hover {
    color: var(--nl-color-primary);
    text-decoration: underline;
}

/* =====================================================================
   Login-Page
   ===================================================================== */
.nl-login-page {
    min-height: 100vh;
    background: linear-gradient(180deg, #f5f7fa 0%, #e9eef5 100%);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 24px;
}

.nl-login-shell {
    width: 100%;
    max-width: 420px;
    display: flex;
    flex-direction: column;
    align-items: stretch;
}

.nl-login-brand {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    margin-bottom: 32px;
}

.nl-login-brand-mark {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 76px;
    height: 76px;
    border-radius: 18px;
    background: linear-gradient(135deg, rgba(251, 188, 58, 0.22), rgba(38, 39, 102, 0.18));
    color: var(--nl-color-brand-gold, #fbbc3a);
    box-shadow: 0 6px 20px rgba(38, 39, 102, 0.18);
    margin-bottom: 6px;
}

.nl-login-brand-text {
    font-size: 2rem;
    font-weight: 800;
    letter-spacing: -0.02em;
    /* "Proba" in Mittelblau — Brand-Wortmarken-Logik auf hellem Hintergrund. */
    color: var(--nl-color-brand-mid, #5678b5);
    line-height: 1;
}

.nl-login-brand-dot {
    /* "Lab" in Navy — Brand-Wortmarken-Logik (Lab dominant gegenueber Proba-Akzent). */
    color: var(--nl-color-brand-navy, #262766);
}

.nl-login-brand-tenant {
    font-size: 0.95rem;
    font-weight: 500;
    color: var(--nl-color-text-secondary, #6B7280);
    letter-spacing: 0.02em;
}

.nl-login-brand-tenant-warn {
    color: #b45309;
}

.nl-login-card {
    background: #fff;
    border-radius: 12px;
    padding: 28px 32px;
    box-shadow: 0 4px 16px rgba(15, 48, 87, 0.08);
    border: 1px solid rgba(15, 48, 87, 0.06);
}

.nl-login-title {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--nl-color-text-primary, #1A1A2E);
    margin: 0 0 4px 0;
}

.nl-login-sub {
    color: var(--nl-color-text-secondary, #6B7280);
    font-size: 0.9rem;
    margin-bottom: 20px;
}

.nl-login-form .nl-form-field { margin-bottom: 16px; }

.nl-login-remember { margin: 4px 0 18px 0; }

.nl-login-submit {
    width: 100%;
    padding: 10px 16px;
    font-weight: 600;
}

.nl-login-foot {
    text-align: center;
    color: var(--nl-color-text-secondary, #6B7280);
    font-size: 0.85rem;
    margin-top: 18px;
}
.nl-login-foot a {
    color: var(--nl-color-primary, #262766);
    text-decoration: none;
    font-weight: 500;
}
.nl-login-foot a:hover { text-decoration: underline; }
.nl-login-foot-sep {
    margin: 0 6px;
    opacity: 0.4;
}

/* =====================================================================
   Sidebar: Hub-Link mit Chevron-Suffix (Stammdaten, Verwaltung)
   ===================================================================== */
.nl-nav-link-hub {
    /* Chevron rechts neben dem Text — visueller Hint, dass es zu einer
       Hub-Page führt statt zur sofortigen Aktion. */
}
.nl-nav-chevron {
    margin-left: auto;
    color: var(--nl-color-text-secondary, #6B7280);
    font-size: 18px;
    line-height: 1;
    transform: translateY(-1px);
}
.nl-nav-link-hub:hover .nl-nav-chevron,
.nl-nav-link-hub.active .nl-nav-chevron {
    color: var(--nl-color-brand-navy, #262766);
}

/* =====================================================================
   Hub-Page (Stammdaten, Verwaltung) — Card-Grid in 3 Spalten
   ===================================================================== */
.nl-hub {
    max-width: 1200px;
    margin: 0 auto;
    padding: 24px 28px;
}

/* nl-hub-head Layout/Typografie kommt aus dem konsolidierten Block oben
   (Aliasse zu .nl-page-head). Hier nur evtl. Hub-spezifische Tweaks. */

.nl-hub-cluster {
    margin-bottom: 36px;
}
.nl-hub-cluster:last-child { margin-bottom: 0; }

.nl-hub-cluster-title {
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--nl-color-primary-dark, #1a1b4b);
    margin: 0 0 4px 0;
    letter-spacing: -0.01em;
}
.nl-hub-cluster-desc {
    font-size: 0.875rem;
    color: var(--nl-color-text-secondary, #6b7280);
    margin: 0 0 14px 0;
}

.nl-hub-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 14px;
}
@media (max-width: 1199.98px) {
    .nl-hub-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 767.98px) {
    .nl-hub-grid { grid-template-columns: 1fr; }
}

.nl-hub-card {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    padding: 16px 18px;
    background: #fff;
    border: 1px solid #e5e7eb;
    border-radius: 10px;
    text-decoration: none;
    color: inherit;
    transition: border-color 0.12s, box-shadow 0.12s, transform 0.12s;
    position: relative;
}
.nl-hub-card:hover {
    border-color: var(--nl-color-primary, #262766);
    box-shadow: 0 4px 14px rgba(15, 48, 87, 0.08);
    transform: translateY(-1px);
}

/* Cockpit-Hinweis-Banner über den Hub-Kacheln eines Clusters — auf den ersten Blick erkennbar. */
.nl-cockpit-banner {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 14px 18px;
    margin-bottom: 14px;
    background: linear-gradient(135deg, rgba(38, 39, 102, 0.08), rgba(38, 39, 102, 0.03));
    border: 1px solid rgba(38, 39, 102, 0.25);
    border-radius: 10px;
    text-decoration: none;
    color: inherit;
    transition: border-color 0.12s, box-shadow 0.12s;
}
.nl-cockpit-banner:hover {
    border-color: var(--nl-color-primary, #262766);
    box-shadow: 0 4px 14px rgba(15, 48, 87, 0.10);
    color: inherit;
}
.nl-cockpit-banner-icon {
    flex: 0 0 auto;
    width: 36px;
    height: 36px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
    background: var(--nl-color-primary, #262766);
    color: #fff;
}
.nl-cockpit-banner-body { flex: 1 1 auto; min-width: 0; }
.nl-cockpit-banner-titel { font-weight: 600; font-size: 1rem; margin-bottom: 2px; }
.nl-cockpit-banner-desc { font-size: 0.85rem; color: var(--bs-secondary-color, #6c757d); }

.nl-hub-card-icon {
    flex: 0 0 auto;
    width: 44px;
    height: 44px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 10px;
    background: rgba(38, 39, 102, 0.08);
    color: var(--nl-color-primary, #262766);
}

.nl-hub-card-body {
    flex: 1 1 auto;
    min-width: 0;
}
.nl-hub-card-titel {
    font-size: 1rem;
    font-weight: 600;
    color: var(--nl-color-text-primary, #1a1a2e);
    margin-bottom: 2px;
}
.nl-hub-card-desc {
    font-size: 0.85rem;
    color: var(--nl-color-text-secondary, #6b7280);
    line-height: 1.4;
}

.nl-hub-card-chevron {
    color: rgba(15, 48, 87, 0.25);
    font-size: 22px;
    line-height: 1;
    align-self: center;
    transition: color 0.12s, transform 0.12s;
}
.nl-hub-card:hover .nl-hub-card-chevron {
    color: var(--nl-color-primary, #262766);
    transform: translateX(2px);
}

/* =====================================================================
   Anhänge — Liste + Upload für Auftrag/Probe
   ===================================================================== */
.nl-anhang-list {
    list-style: none;
    padding: 0;
    margin: 0 0 6px 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.nl-anhang-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 3px 8px;
    border: 1px solid #e5e7eb;
    border-radius: 5px;
    background: #fff;
    transition: background 0.12s, border-color 0.12s;
}
.nl-anhang-item:hover {
    background: rgba(38, 39, 102, 0.03);
    border-color: rgba(38, 39, 102, 0.2);
}
.nl-anhang-icon {
    flex-shrink: 0;
    font-size: 15px;
    line-height: 1.2;
    width: 20px;
    text-align: center;
}
.nl-anhang-body {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 1px;
}
.nl-anhang-name {
    font-size: 13px;
    font-weight: 600;
    color: var(--nl-color-primary, #262766);
    text-decoration: none;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nl-anhang-name:hover { text-decoration: underline; }
.nl-anhang-meta {
    color: var(--nl-color-text-secondary, #6b7280);
    font-size: 11px;
}
.nl-anhang-desc {
    color: var(--nl-color-text-secondary, #6b7280);
    font-size: 11px;
    font-style: italic;
}
.nl-anhang-delete {
    flex-shrink: 0;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 4px;
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--nl-color-text-secondary, #6b7280);
    cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.nl-anhang-delete:hover:not(:disabled) {
    background: rgba(220, 38, 38, 0.08);
    color: #b91c1c;
    border-color: rgba(220, 38, 38, 0.3);
}
.nl-anhang-delete:disabled { opacity: 0.5; cursor: not-allowed; }

.nl-anhang-upload {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 6px;
}
/* Native InputFile verstecken — sichtbarer Trigger ist die umgebende .nl-dropzone (NlDropZone.razor). */
.nl-anhang-file {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
}

/* ===================== Drag-&-Drop-Dropzone (NlDropZone.razor) =====================
   Wrapper um bestehende <InputFile>-Uploads — nur Token-Farben, kein Hex, damit die
   Zone automatisch mit einem kuenftigen Dark-Theme mitzieht (Redefinition der
   --nl-color-*-Tokens genuegt, kein CSS-Update hier noetig). */
.nl-dropzone {
    position: relative;
    width: 100%;
    box-sizing: border-box;
    border: 2px dashed var(--nl-color-border-card);
    border-radius: var(--nl-radius-md);
    background: var(--nl-color-surface-subtle);
    padding: 18px 16px;
    cursor: pointer;
    transition: border-color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
}
.nl-dropzone:hover {
    border-color: var(--nl-color-primary-light);
    background: var(--nl-color-surface-hover);
}
/* Fokus-Ring auf der Zone, wenn die (ggf. visuell versteckte) InputFile darin Fokus hat —
   ersetzt den Bootstrap-Button-Fokusring, den die frueheren <label>-Trigger hatten. */
.nl-dropzone:focus-within {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: 2px;
    border-color: var(--nl-color-primary-light);
}
/* Waehrend eines aktiven Drags ueber der Zone (von nl-dropzone.js gesetzt). */
.nl-dropzone-active {
    border-color: var(--nl-color-primary);
    background: var(--nl-color-surface-hover);
    box-shadow: var(--nl-shadow-sm);
}
/* Kurzzeitiges Feedback, wenn eine gedroppte Datei nicht zum accept-Filter passte. */
.nl-dropzone-abgelehnt {
    border-color: var(--nl-color-nio);
}
.nl-dropzone-inhalt {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    text-align: center;
    width: 100%;
}
.nl-dropzone-icon {
    color: var(--nl-color-text-secondary);
}
.nl-dropzone-hinweis {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
}

/* Kompakt: einzeilig fuer Grid-/Listen-Zeilen und kleine Formulare. */
.nl-dropzone-kompakt {
    padding: 4px 8px;
    border-radius: var(--nl-radius-sm);
}
.nl-dropzone-kompakt .nl-dropzone-inhalt {
    flex-direction: row;
    justify-content: flex-start;
    flex-wrap: wrap;
    gap: 6px;
}
.nl-dropzone-kompakt .nl-dropzone-hinweis {
    font-size: var(--nl-font-size-xs);
}
.nl-dropzone-kompakt .nl-dropzone-icon {
    width: 14px;
    height: 14px;
}

/* Anhang-Baum (AuftragListe → Tab Anhänge). */
.nl-anhang-baum {
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.nl-anhang-folder {
    border: 1px solid #e5e7eb;
    border-radius: 6px;
    background: #fff;
}
.nl-anhang-folder > summary {
    list-style: none;
    cursor: pointer;
    user-select: none;
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 5px 10px;
    font-size: 13px;
    color: var(--nl-color-text-primary);
}
.nl-anhang-folder > summary::-webkit-details-marker { display: none; }
.nl-anhang-folder > summary::marker { content: ""; }
.nl-anhang-folder > summary::before {
    content: "›";
    display: inline-block;
    font-size: 18px;
    color: var(--nl-color-text-secondary);
    width: 14px;
    transition: transform 0.15s;
}
.nl-anhang-folder[open] > summary::before { transform: rotate(90deg); }
.nl-anhang-folder > summary:hover {
    background: rgba(38, 39, 102, 0.04);
    border-radius: 8px 8px 0 0;
}
.nl-anhang-folder-icon { font-size: 16px; }
.nl-anhang-folder-count {
    margin-left: auto;
    font-size: 11px;
    font-weight: 600;
    padding: 2px 8px;
    border-radius: 9999px;
    background: rgba(38, 39, 102, 0.08);
    color: var(--nl-color-primary, #262766);
}
.nl-anhang-folder-body {
    padding: 4px 10px 6px 10px;
    border-top: 1px solid #f3f4f6;
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.nl-anhang-folder-sub {
    margin-bottom: 0;
    border-color: #f3f4f6;
}
.nl-anhang-folder-sub > summary { padding: 4px 10px; font-size: 12.5px; }

/* AuftragListe — Tabs über der unteren Reihe (Probenbaum / Anhänge). */
.nl-tabbar {
    display: flex;
    gap: 4px;
    border-bottom: 1px solid #e5e7eb;
    margin-bottom: 4px;
}
.nl-tab {
    background: transparent;
    border: none;
    border-bottom: 2px solid transparent;
    padding: 6px 12px;
    font-size: 13px;
    font-weight: 600;
    color: var(--nl-color-text-secondary, #6b7280);
    cursor: pointer;
    transition: color 0.12s, border-color 0.12s;
}
.nl-tab:hover { color: var(--nl-color-primary, #262766); }
.nl-tab.active {
    color: var(--nl-color-primary, #262766);
    border-bottom-color: var(--nl-color-primary, #262766);
}
.nl-tab .nl-tab-count {
    margin-left: 6px;
    font-size: 11px;
    font-weight: 600;
    padding: 1px 7px;
    border-radius: 9999px;
    background: rgba(38, 39, 102, 0.08);
    color: var(--nl-color-primary, #262766);
}

/* =====================================================================
   Steckbrief-Tabs in versionierten Editoren (z. B. MethodeEditor).
   Sticky unter dem VersionedEntityHeader, dezenter als die Auftrag-Tabs.
   ===================================================================== */
.nl-steckbrief-tabs {
    position: sticky;
    top: 56px;
    z-index: 5;
    background: var(--nl-color-bg, #F5F7FA);
    margin-bottom: 12px;
    padding-top: 4px;
}

/* =====================================================================
   2-Spalten-Layout für versionierte Editoren mit „Wird verwendet in"-Panel.
   ===================================================================== */
.nl-editor-with-panel {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 280px;
    gap: 20px;
    align-items: start;
}
.nl-editor-with-panel > .nl-editor-main { min-width: 0; }

@media (max-width: 1100px) {
    .nl-editor-with-panel { grid-template-columns: 1fr; }
    .nl-used-in { position: static !important; max-height: none !important; }
}

.nl-used-in {
    position: sticky;
    top: 72px;
    background: #fff;
    border: 1px solid rgba(15, 48, 87, 0.08);
    border-radius: var(--nl-radius-md, 8px);
    padding: 14px 16px;
    box-shadow: var(--nl-shadow-sm);
    max-height: calc(100vh - 100px);
    overflow: auto;
}
.nl-used-in-head { margin-bottom: 8px; }
.nl-used-in-eyebrow {
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-size: 11px;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
}
.nl-used-in-group {
    padding: 10px 0;
    border-bottom: 1px solid #f3f4f6;
}
.nl-used-in-group:last-child { border-bottom: none; }
.nl-used-in-group-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 8px;
}
.nl-used-in-group-title {
    font-weight: 600;
    color: var(--nl-color-text-primary);
    text-decoration: none;
    font-size: 13px;
}
.nl-used-in-group-title:hover {
    color: var(--nl-color-primary);
    text-decoration: underline;
}
.nl-used-in-count {
    display: inline-block;
    padding: 1px 8px;
    border-radius: 9999px;
    background: rgba(38, 39, 102, 0.08);
    color: var(--nl-color-primary);
    font-size: 11px;
    font-weight: 700;
}
.nl-used-in-links {
    list-style: none;
    padding: 0;
    margin: 4px 0 0 0;
}
.nl-used-in-links li {
    font-size: 12px;
    padding: 2px 0;
}
.nl-used-in-links a {
    color: var(--nl-color-text-secondary);
    text-decoration: none;
}
.nl-used-in-links a:hover {
    color: var(--nl-color-primary);
    text-decoration: underline;
}

/* Kompetenzmatrix — Mitarbeiter × Methode. Tabellen-Layout mit klickbaren Zellen. */
.nl-kompetenz-card { padding: 0; }
.nl-kompetenz-scroll {
    max-height: 70vh;
    overflow: auto;
}
.nl-kompetenz-matrix {
    border-collapse: collapse;
    width: max-content;
    min-width: 100%;
    font-size: 13px;
}
.nl-kompetenz-matrix th,
.nl-kompetenz-matrix td {
    border: 1px solid #e5e7eb;
    padding: 8px 10px;
    text-align: left;
    vertical-align: middle;
    background: #fff;
}
.nl-kompetenz-matrix thead th {
    position: sticky;
    top: 0;
    background: #f8fafc;
    z-index: 2;
    font-weight: 600;
    color: var(--nl-color-text-secondary, #6b7280);
}
.nl-kompetenz-matrix th.nl-kompetenz-name,
.nl-kompetenz-matrix td.nl-kompetenz-name {
    position: sticky;
    left: 0;
    background: #f8fafc;
    z-index: 1;
    min-width: 200px;
    max-width: 240px;
}
.nl-kompetenz-matrix th.nl-kompetenz-name { z-index: 3; }
.nl-kompetenz-methode {
    text-align: center !important;
    min-width: 130px;
}
.nl-kompetenz-norm {
    font-weight: 400;
    font-size: 10px;
    line-height: 1.2;
    margin-top: 2px;
}
.nl-kompetenz-gruppe-tag {
    display: inline-block;
    margin-top: 3px;
    padding: 1px 6px;
    border-radius: 9999px;
    background: rgba(38, 39, 102, 0.10);
    color: var(--nl-color-primary, #262766);
    font-size: 10px;
    font-weight: 600;
}
.nl-kompetenz-gruppefilter {
    max-width: 260px;
}
.nl-kompetenz-zelle {
    text-align: center;
    cursor: pointer;
    transition: background 0.12s;
}
.nl-kompetenz-zelle:hover {
    background: rgba(38, 39, 102, 0.06) !important;
}

/* Status-Tokens innerhalb der Zellen — kompakt, Farb-codiert. */
.nl-kompetenz-leer,
.nl-kompetenz-einarb,
.nl-kompetenz-qual,
.nl-kompetenz-bald,
.nl-kompetenz-overdue,
.nl-kompetenz-gesperrt {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 9999px;
    font-size: 11px;
    font-weight: 600;
    line-height: 1.4;
}
.nl-kompetenz-leer { color: #9ca3af; background: transparent; font-weight: 400; }
.nl-kompetenz-einarb { background: rgba(38, 39, 102, 0.10); color: var(--nl-color-primary, #262766); }
.nl-kompetenz-qual { background: rgba(22, 163, 74, 0.12); color: #15803d; }
.nl-kompetenz-bald { background: rgba(217, 119, 6, 0.14); color: #b45309; }
.nl-kompetenz-overdue { background: rgba(220, 38, 38, 0.14); color: #b91c1c; }
.nl-kompetenz-gesperrt { background: rgba(107, 114, 128, 0.18); color: #4b5563; text-decoration: line-through; }

/* Soft-Warning im Ergebnis-Grid: User nicht für die Methode qualifiziert. */
.nl-kompetenz-warn {
    color: #b45309;
    font-weight: 700;
    cursor: help;
}

/* QM-Dokument-Vorschau via PDF.js (Canvas-basiert).
   Bypasst die Browser-PDF-Einstellung — das PDF wird Pixel für Pixel auf Canvas gemalt. */
.nl-pdf-viewer {
    max-height: 720px;
    overflow: auto;
    background: #525659; /* dunkler Rahmen wie native PDF-Viewer */
    padding: 12px;
    border-radius: 6px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
}
.nl-pdf-page {
    max-width: 100%;
    height: auto;
    background: #fff;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}
.nl-pdf-loading {
    color: #fff;
    padding: 24px;
    font-style: italic;
}
.nl-pdf-error {
    color: #fff;
    background: rgba(220, 38, 38, 0.6);
    padding: 12px 16px;
    border-radius: 4px;
}

/* Stammdaten-Page Eingang-Checks: Akkordeon je Probentyp + Tabelle pro Sektion. */
.nl-eingang-folder {
    background: var(--nl-color-bg-card, #fff);
    border: 1px solid #e5e7eb;
    border-radius: 8px;
    margin-bottom: 8px;
}
.nl-eingang-folder > summary {
    list-style: none;
    cursor: pointer;
    user-select: none;
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 14px;
    font-weight: 600;
}
.nl-eingang-folder > summary::-webkit-details-marker { display: none; }
.nl-eingang-folder > summary::marker { content: ""; }
.nl-eingang-folder > summary::before {
    content: "›";
    display: inline-block;
    font-size: 18px;
    color: var(--nl-color-text-secondary);
    width: 14px;
    transition: transform 0.15s;
}
.nl-eingang-folder[open] > summary::before { transform: rotate(90deg); }
.nl-eingang-folder-title { flex: 1; }
.nl-eingang-folder-count {
    font-size: 11px;
    font-weight: 600;
    padding: 2px 9px;
    border-radius: 9999px;
    background: rgba(38, 39, 102, 0.08);
    color: var(--nl-color-primary, #262766);
}
.nl-eingang-folder-body {
    padding: 4px 14px 12px 14px;
    border-top: 1px solid #f3f4f6;
}
.nl-eingang-table {
    margin: 0;
}
.nl-eingang-table th {
    font-weight: 600;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--nl-color-text-secondary);
    background: rgba(38, 39, 102, 0.03);
}
.nl-eingang-table td { vertical-align: top; }
.nl-eingang-cell-any {
    color: var(--nl-color-text-secondary, #6b7280);
    font-style: italic;
}

.nl-eingang-vorschau-liste {
    list-style: none;
    padding: 0;
    margin: 6px 0 0 0;
}
.nl-eingang-vorschau-liste li {
    padding: 4px 0;
    border-bottom: 1px dashed #e5e7eb;
}
.nl-eingang-vorschau-liste li:last-child { border-bottom: none; }

/* Eingang-Popup: pro Check eine Zeile mit optionalem Notiz-Memo bei nicht erfüllt. */
.nl-eingang-check-row {
    margin-bottom: 8px;
}

/* Eingang-Annahme-Checkliste (Popup): klickbare Karten-Reihen. */
.nl-eingang-checks {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.nl-eingang-check {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    padding: 10px 12px;
    border: 1px solid #e5e7eb;
    border-radius: 8px;
    cursor: pointer;
    transition: background 0.15s, border-color 0.15s;
    margin: 0;
}
.nl-eingang-check:hover {
    background: rgba(38, 39, 102, 0.04);
    border-color: rgba(38, 39, 102, 0.25);
}
.nl-eingang-check input[type="checkbox"] {
    margin-top: 3px;
    width: 16px;
    height: 16px;
    accent-color: var(--nl-color-primary, #262766);
    flex-shrink: 0;
}
.nl-eingang-check span strong {
    font-weight: 600;
    color: var(--nl-color-text-primary);
}

/* Eingang-Check-Zusammenfassung im Detail-Meta. */
.nl-eingang-summary {
    list-style: none;
    padding: 0;
    margin: 6px 0 0 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
    font-size: 12px;
}
.nl-eingang-summary li {
    padding-left: 18px;
    position: relative;
    color: var(--nl-color-text-secondary);
}
.nl-eingang-summary li::before {
    position: absolute;
    left: 0;
    top: 0;
    font-weight: 700;
}
.nl-eingang-summary li.ok::before { content: "✓"; color: #15803d; }
.nl-eingang-summary li.fail::before { content: "✗"; color: #b91c1c; }
.nl-eingang-summary li.fail { color: #b91c1c; }
.nl-eingang-notiz {
    margin-top: 6px;
    padding: 6px 10px;
    background: rgba(217, 119, 6, 0.08);
    border-left: 3px solid var(--nl-color-warn, #fbbc3a);
    border-radius: 4px;
    font-size: 12px;
    color: #92400e;
    white-space: pre-wrap;
}

/* Audit-Trail: Detail-Row & JSON-Vorschau. */
.nl-audit-detail {
    padding: 12px 18px;
    background: var(--nl-color-bg, #f5f7fa);
    border-radius: 8px;
}
.nl-audit-json {
    margin: 0;
    padding: 10px 12px;
    background: #fff;
    border: 1px solid #e5e7eb;
    border-radius: 6px;
    font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
    font-size: 12px;
    line-height: 1.45;
    white-space: pre-wrap;
    word-break: break-all;
    max-height: 220px;
    overflow: auto;
}

/* Frist-Ampel für Aufträge: rot = überfällig, gelb = ≤2 Tage, grün = >2 Tage. */
.nl-frist {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: 0.75rem;
    font-weight: 600;
    line-height: 1.4;
    white-space: nowrap;
}
.nl-frist::before {
    content: "";
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: currentColor;
}
.nl-frist-rot {
    background: rgba(220, 38, 38, 0.10);
    color: #b91c1c;
}
.nl-frist-gelb {
    background: rgba(217, 119, 6, 0.12);
    color: #b45309;
}
.nl-frist-gruen {
    background: rgba(22, 163, 74, 0.10);
    color: #15803d;
}
.nl-frist-neutral {
    background: transparent;
    color: var(--nl-color-text-secondary, #6b7280);
    font-weight: 400;
}
.nl-frist-neutral::before { display: none; }

/* =====================================================================
   Auftrag-Status-Tokens — eigene Farb-Slots, NICHT mit n.i.O. (rot) verwechseln.
   --color-nio bleibt der Bewertungs-Stufe vorbehalten.
   ===================================================================== */
.nl-status {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs, 0.75rem);
    font-weight: 600;
    letter-spacing: 0.03em;
    line-height: 1.4;
}
.nl-status-offen {
    background: rgba(38, 39, 102, 0.12);
    color: var(--nl-color-primary, #262766);
}
.nl-status-bearbeitung {
    background: rgba(217, 119, 6, 0.15);
    color: #b45309;
}
.nl-status-abgeschlossen {
    background: rgba(22, 163, 74, 0.14);
    color: #15803d;
}
.nl-status-storniert {
    background: rgba(107, 114, 128, 0.18);
    color: #4b5563;
    text-decoration: line-through;
}
.nl-status-archiviert {
    background: rgba(229, 231, 235, 0.6);
    color: #6b7280;
}

/* Zusätzliche Proben-Status-Tokens (geteilte Optik mit Auftrag-Status). */
.nl-status-angemeldet {
    background: rgba(107, 114, 128, 0.16);
    color: #4b5563;
}
.nl-status-eingang {
    background: rgba(8, 145, 178, 0.14);
    color: #0e7490;
}
.nl-status-freigabe-ausstehend {
    background: rgba(217, 119, 6, 0.15);
    color: #b45309;
}
.nl-status-gesperrt {
    background: rgba(220, 38, 38, 0.14);
    color: #b91c1c;
}

/* =====================================================================
   ProbeStatusBadge — dedizierter CSS-Namespace fuer den Proben-Status
   (Welle 4 Batch I, Audit-Fix). Ersetzt die fuenffach kopierten
   Status->CSS-Switches in ProbenListe/ProbeDetail/ProbenTreeView/
   ProbenTreeList/ProbenBaumKnoten (siehe ProbeStatusBadge.razor).

   Bewusst EIGENE Klassen statt Wiederverwendung der obigen
   nl-status-*-Proben-Tokens: die Auftrags-Optik (nl-status-offen ff.)
   und die Proben-Optik teilten sich bisher denselben Namespace — eine
   spaetere Anpassung der einen Farbwelt haette unbemerkt die andere
   mitgezogen (die eigentliche Farb-Kollisions-Wurzel der Duplikation).
   Farbwerte sind an obiger Vorlage orientiert, aber ausschliesslich
   ueber --nl-color-*-Tokens abgeleitet (color-mix() fuer den hellen
   Hintergrund-Tint, Text-Farbe direkt aus dem Token).
   ===================================================================== */
.nl-probe-status-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs, 0.75rem);
    font-weight: 600;
    letter-spacing: 0.03em;
    line-height: 1.4;
}
.nl-probe-status-angemeldet {
    background: color-mix(in srgb, var(--nl-color-nb) 16%, transparent);
    color: var(--nl-color-nb);
}
.nl-probe-status-eingang {
    background: color-mix(in srgb, var(--nl-color-info-strong) 14%, transparent);
    color: var(--nl-color-info-strong);
}
.nl-probe-status-bearbeitung {
    background: color-mix(in srgb, var(--nl-color-warn-strong) 15%, transparent);
    color: var(--nl-color-warn-strong);
}
.nl-probe-status-freigabe-ausstehend {
    background: color-mix(in srgb, var(--nl-color-warn-strong) 15%, transparent);
    color: var(--nl-color-warn-strong);
}
.nl-probe-status-abgeschlossen {
    background: color-mix(in srgb, var(--nl-color-io-strong) 14%, transparent);
    color: var(--nl-color-io-strong);
}
.nl-probe-status-archiviert {
    /* Hintergrund hell aus --nl-color-archiviert, Text bewusst dunkler
       (--nl-color-text-secondary) fuer ausreichend Kontrast. */
    background: color-mix(in srgb, var(--nl-color-archiviert) 24%, transparent);
    color: var(--nl-color-text-secondary);
}
.nl-probe-status-gesperrt {
    background: color-mix(in srgb, var(--nl-color-nio) 14%, transparent);
    color: var(--nl-color-nio);
}

/* =====================================================================
   Umgebungs-/Hygienemonitoring — Zonen-Badges + Zonen-Cockpit-Kacheln
   (Feature 3, docs/umgebungsmonitoring/00-konzept.md). Badge-Optik analog
   .nl-probe-status-badge (color-mix Pill), Kachel-Akzent analog .nl-kpi-card
   (border-top-color je Variante) — hier eine eigene CSS-Custom-Property
   pro Kachel statt vier fixer Modifier-Klassen, weil Kopf UND Rand dieselbe
   Zonen-Farbe brauchen.
   ===================================================================== */
.nl-zone-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs, 0.75rem);
    font-weight: 600;
    letter-spacing: 0.02em;
    line-height: 1.4;
    white-space: nowrap;
}
.nl-zone-badge-zone1 { background: color-mix(in srgb, var(--nl-color-zone1) 16%, transparent); color: var(--nl-color-zone1); }
.nl-zone-badge-zone2 { background: color-mix(in srgb, var(--nl-color-zone2) 16%, transparent); color: var(--nl-color-zone2); }
.nl-zone-badge-zone3 { background: color-mix(in srgb, var(--nl-color-zone3) 16%, transparent); color: var(--nl-color-zone3); }
.nl-zone-badge-zone4 { background: color-mix(in srgb, var(--nl-color-zone4) 18%, transparent); color: var(--nl-color-zone4); }
.nl-zone-badge-keine { background: var(--nl-color-surface-subtle); color: var(--nl-color-text-secondary); }

.nl-zone-kachel-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 12px;
    margin-bottom: 20px;
}
.nl-zone-kachel {
    background: var(--nl-color-bg-card);
    border: 1px solid var(--nl-color-border-card);
    border-top: 3px solid var(--nl-zone-accent, var(--nl-color-border-card));
    border-radius: var(--nl-radius-md);
    padding: 14px 16px;
    box-shadow: var(--nl-shadow-sm);
    cursor: pointer;
    text-align: left;
}
.nl-zone-kachel:hover { box-shadow: var(--nl-shadow-md); }
.nl-zone-kachel:focus-visible { outline: 2px solid var(--nl-zone-accent, var(--nl-color-primary)); outline-offset: 2px; }
.nl-zone-kachel-zone1 { --nl-zone-accent: var(--nl-color-zone1); }
.nl-zone-kachel-zone2 { --nl-zone-accent: var(--nl-color-zone2); }
.nl-zone-kachel-zone3 { --nl-zone-accent: var(--nl-color-zone3); }
.nl-zone-kachel-zone4 { --nl-zone-accent: var(--nl-color-zone4); }
.nl-zone-kachel-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 8px;
    margin-bottom: 10px;
}
.nl-zone-kachel-titel {
    font-weight: 600;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
}
.nl-zone-kachel-kpis {
    display: flex;
    gap: 16px;
    flex-wrap: wrap;
}
.nl-zone-kachel-kpi { display: flex; flex-direction: column; }
.nl-zone-kachel-kpi-wert { font-size: 1.35rem; font-weight: 700; color: var(--nl-color-text-primary); line-height: 1.2; }
.nl-zone-kachel-kpi-label { font-size: var(--nl-font-size-xs, 0.75rem); color: var(--nl-color-text-secondary); }
.nl-zone-kachel-eskalation {
    margin-top: 10px;
    font-size: var(--nl-font-size-xs, 0.75rem);
    font-weight: 600;
    color: var(--nl-color-nio);
}

/* =====================================================================
   Freigabe-Queue (2026-05-13)
   ---------------------------------------------------------------------
   Aesthetic-Linie: gleicher Editorial/Dense-Stil wie die Popup-Editoren
   im 3rd Pass. Gruppiert nach Datentyp, Filter-Toolbar oben, Anträge
   als kompakte Card-Rows mit linker Akzent-Border (Warn-Color für
   eigene Anträge — 4-Augen-Hinweis ist visuell).
   ===================================================================== */

.nl-freigabe-toolbar {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    margin: 4px 0 18px 0;
    padding: 8px 10px;
    background: #F7F8FA;
    border: 1px solid #ECEEF2;
    border-radius: 8px;
}

.nl-freigabe-filter {
    display: inline-flex;
    background: #FFFFFF;
    border: 1px solid #DDE1E6;
    border-radius: 7px;
    padding: 2px;
    gap: 0;
}

.nl-freigabe-filter button {
    background: transparent;
    border: 0;
    padding: 5px 14px;
    font-size: 12px;
    font-weight: 500;
    color: #4A5160;
    border-radius: 5px;
    cursor: pointer;
    transition: background 0.12s ease, color 0.12s ease;
}

.nl-freigabe-filter button:hover:not(:disabled) {
    color: #1A1A2E;
    background: #F4F6F9;
}

.nl-freigabe-filter button.is-active {
    background: var(--nl-color-primary);
    color: #FFFFFF;
}

.nl-freigabe-filter button:disabled {
    color: #B5BAC4;
    cursor: not-allowed;
}

.nl-freigabe-toolbar-spacer { flex: 1; }

.nl-freigabe-toolbar-hint {
    font-size: 12px;
    color: #6B7280;
    font-variant-numeric: tabular-nums;
}

/* Section per Datentyp */
.nl-freigabe-group {
    margin-bottom: 22px;
}

.nl-freigabe-group-head {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 10px;
    padding-bottom: 6px;
    border-bottom: 1px solid #ECEEF2;
}

.nl-freigabe-group-title {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.09em;
    color: #6B7280;
    line-height: 1;
}

.nl-freigabe-group-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    padding: 2px 8px;
    background: #ECEEF2;
    border-radius: 10px;
    font-size: 11px;
    font-weight: 600;
    color: #4A5160;
    line-height: 1.2;
    font-variant-numeric: tabular-nums;
}

.nl-freigabe-list {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.nl-freigabe-row {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 14px;
    align-items: center;
    padding: 10px 12px 10px 14px;
    background: #FFFFFF;
    border: 1px solid #ECEEF2;
    border-left: 3px solid #DDE1E6;
    border-radius: 6px;
    transition: border-color 0.12s ease, box-shadow 0.12s ease;
}

.nl-freigabe-row:hover {
    border-color: #C7CDD5;
    border-left-color: var(--nl-color-primary);
}

/* Eigene Anträge: Warn-Akzent links, leicht getönt — visueller 4-Augen-Hinweis. */
.nl-freigabe-row.is-own {
    border-left-color: var(--nl-color-warn, #fbbc3a);
    background: #FFFBF5;
}

.nl-freigabe-row-main {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

.nl-freigabe-row-line1 {
    display: flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
}

.nl-freigabe-row-name {
    font-size: 13.5px;
    font-weight: 600;
    color: #1A1A2E;
    line-height: 1.3;
}

.nl-freigabe-row-kuerzel {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-size: 11px;
    padding: 1px 6px;
    background: #F1F3F6;
    border: 1px solid #E5E8ED;
    border-radius: 3px;
    color: #2A3340;
    font-weight: 500;
}

.nl-freigabe-row-version {
    font-size: 11px;
    color: #6B7280;
    font-variant-numeric: tabular-nums;
    font-weight: 500;
}

.nl-freigabe-row-line2 {
    font-size: 12px;
    color: #6B7280;
    line-height: 1.4;
    display: flex;
    align-items: baseline;
    gap: 8px;
    flex-wrap: wrap;
}

.nl-freigabe-row-author { font-weight: 500; color: #4A5160; }

.nl-freigabe-row-comment {
    font-style: italic;
    color: #6B7280;
}

.nl-freigabe-row-comment::before {
    content: "›";
    margin-right: 4px;
    color: #C7CDD5;
    font-style: normal;
}

.nl-freigabe-row-actions {
    display: flex;
    gap: 6px;
    align-items: center;
    flex-shrink: 0;
}

.nl-freigabe-row-actions .btn,
.nl-freigabe-row-actions .dxbs-button {
    white-space: nowrap;
    height: 28px;
    min-height: 28px;
    padding: 3px 12px;
    font-size: 12px;
    font-weight: 500;
    border-radius: 5px;
    line-height: 1.3;
}

.nl-freigabe-row-actions .nl-own-hint {
    font-size: 11px;
    color: #92400E;
    font-style: italic;
    padding: 0 4px;
}

.nl-freigabe-empty {
    padding: 28px 18px;
    text-align: center;
    color: #6B7280;
    border: 1px dashed #DDE1E6;
    border-radius: 8px;
    font-size: 13px;
    background: #FAFBFC;
}

.nl-freigabe-empty-title {
    font-size: 14px;
    font-weight: 600;
    color: #4A5160;
    margin-bottom: 4px;
}

/* =====================================================================
   ProbeDetail – Editorial / Dense (Linear/Stripe/Notion Style)
   Konsistent zur AuftragListe / AuftragNeu / ProbenListe Migration:
   Hierarchie über Schriftgröße + Greys, NICHT über Card-Container.
   ===================================================================== */

/* Header-Eyebrow als ruhige Pipeline (Typ-Pill · Auftrags-Link). */
.nl-probe-head-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 11px;
    color: var(--nl-color-text-secondary);
    line-height: 1.4;
}
.nl-probe-head-eyebrow .nl-probe-head-sep {
    color: #C7CDD5;
    font-weight: 600;
}
.nl-probe-head-eyebrow a {
    color: var(--nl-color-text-secondary);
    text-decoration: none;
    font-weight: 500;
}
.nl-probe-head-eyebrow a:hover {
    color: var(--nl-color-primary);
    text-decoration: underline;
}

.nl-probe-head-title {
    display: flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
    margin: 4px 0 0 0;
}
.nl-probe-head-title code {
    font-size: 1.4rem;
    font-weight: 700;
    color: var(--nl-color-text-primary);
    background: transparent;
    padding: 0;
    letter-spacing: -0.01em;
}
.nl-probe-head-title .nl-probe-head-sub {
    font-size: 14px;
    font-weight: 500;
    color: #4A5160;
    line-height: 1.3;
}

/* P4 — Meta-Zeile unter dem Titel: Matrix + Probenahme-Datum.
   Kompakt, sekundär — dauerhaft sichtbar, auch wenn Ergebnisse-Tab aktiv ist.
   Nutzt bestehende Probe-Kopf-Label-Token (uppercase, 10px). */
.nl-probe-head-meta {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 4px;
    flex-wrap: wrap;
}
.nl-probe-head-meta-val {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-primary);
}
.nl-probe-head-meta-sep {
    color: var(--nl-color-border-card);
    font-size: 0.85rem;
    user-select: none;
}

/* Editorial Banner-Variante: flacher, mit ruhigem Border-Left als
   Indikator statt voller Bootstrap-Alert-Tint. Ersetzt alert-warning/
   alert-info/alert-light/alert-danger in der ProbeDetail-Page. */
.nl-probe-banner {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 9px 14px;
    margin: 0 0 10px 0;
    background: #FAFBFC;
    border: 1px solid #ECEEF2;
    border-left: 3px solid #C7CDD5;
    border-radius: 6px;
    font-size: 13px;
    color: #2A3340;
    line-height: 1.45;
}
.nl-probe-banner-icon {
    flex: 0 0 auto;
    width: 16px;
    height: 16px;
    margin-top: 2px;
    color: #6B7280;
}
.nl-probe-banner-body {
    flex: 1 1 auto;
    min-width: 0;
}
.nl-probe-banner-title {
    font-weight: 600;
    color: var(--nl-color-text-primary);
    margin-right: 6px;
}
.nl-probe-banner-meta {
    margin-top: 3px;
    font-size: 11px;
    color: var(--nl-color-text-secondary);
    line-height: 1.4;
}
.nl-probe-banner-actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-shrink: 0;
}

/* Varianten — nur über Border-Left + leichten Hintergrund-Hauch, nie volle Tint. */
.nl-probe-banner--danger  { border-left-color: var(--nl-color-nio);  background: #FEF4F4; }
.nl-probe-banner--warn    { border-left-color: var(--nl-color-warn); background: #FFF9F0; }
.nl-probe-banner--info    { border-left-color: var(--nl-color-primary); background: #F2F6FB; }
.nl-probe-banner--success { border-left-color: var(--nl-color-io);   background: #F1FAF4; }

.nl-probe-banner--danger .nl-probe-banner-icon  { color: var(--nl-color-nio); }
.nl-probe-banner--warn .nl-probe-banner-icon    { color: var(--nl-color-warn); }
.nl-probe-banner--info .nl-probe-banner-icon    { color: var(--nl-color-primary); }
.nl-probe-banner--success .nl-probe-banner-icon { color: var(--nl-color-io); }

/* Section-Caption (10px uppercase) als ruhiger Trenner zwischen Blöcken.
   Identisch zu nl-popup-section, nur ohne den Card-Wrap-Kontext. */
/* Sections als echte Cards — weisser Background, dezente Border,
   eigener Card-Header mit Caption-Bar. Untereinander durch Margin
   getrennt statt durch Hairlines im Flow. */
.nl-probe-section {
    display: flex;
    flex-direction: column;
    gap: 0;
    margin-top: 16px;
    background: #FFFFFF;
    border: 1px solid #E5E8ED;
    border-radius: 8px;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
    overflow: hidden;
}
.nl-probe-section:first-of-type {
    margin-top: 0;
}
.nl-probe-section-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    min-height: 38px;
    padding: 10px 16px;
    background: #F8FAFC;
    border-bottom: 1px solid #E5E8ED;
}
.nl-probe-section-title {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    padding: 0;
    border: none;
    background: transparent;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    color: var(--nl-color-text-primary);
    line-height: 1;
}

/* Direkter Kinder-Inhalt einer Section (Meta-Grid, Sublist, Tabpanel,
   Form-Field) bekommt automatisch das Card-Padding. */
.nl-probe-section > .nl-probe-meta,
.nl-probe-section > .nl-probe-sublist,
.nl-probe-section > .nl-probe-tabpanel-empty,
.nl-probe-section > dl,
.nl-probe-section > .nl-form-grid,
.nl-probe-section > .nl-form-field,
.nl-probe-section > .nl-probe-banner,
.nl-probe-section > p,
.nl-probe-section > div:not(.nl-probe-section-head):not(.nl-probe-banner) {
    padding: 14px 16px;
}

.nl-probe-section > .nl-probe-banner {
    margin: 12px 16px;
}

/* Falls Section explizit als „flat" markiert wird (z. B. Audit, das
   selber schon eine Tabelle mitbringt), Karten-Padding deaktivieren. */
.nl-probe-section.nl-probe-section--flat > * {
    padding: 0;
}
button.nl-probe-section-title {
    cursor: pointer;
}
button.nl-probe-section-title:hover {
    color: var(--nl-color-primary);
}
.nl-probe-section-caret {
    display: inline-block;
    width: 9px;
    font-size: 9px;
    color: #9CA3AF;
}
.nl-probe-section-count {
    margin-left: 6px;
    font-size: 10px;
    font-weight: 600;
    color: #8A8F99;
    letter-spacing: 0.04em;
    text-transform: none;
}
.nl-probe-section-hint {
    font-size: 11px;
    color: #6B7280;
    font-weight: 400;
    line-height: 1.4;
    text-align: right;
    letter-spacing: 0;
    text-transform: none;
}
.nl-probe-section-actions {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    flex-shrink: 0;
}

/* Meta-Liste der Übersicht — Auto-Fit-Grid mit Label-oben/Wert-unten.
   Vorteile gegenüber dem alten 4-spaltigen Label-links/Wert-rechts-Grid:
   - skaliert mit der Anzahl Felder (so viele Spalten wie reinpassen)
   - leere Werte (—) belegen weniger horizontalen Platz visuell
   - Wide-Items (Annahme-Check, Beschreibung, Sperrgrund) brechen sauber
     über die ganze Breite, optisch durch Hairline-Top getrennt. */
.nl-probe-meta {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
    row-gap: 14px;
    column-gap: 20px;
    margin: 0;
    padding: 0;
    font-size: 13px;
    line-height: 1.45;
}
.nl-probe-meta-item {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}
.nl-probe-meta dt {
    margin: 0;
    color: var(--nl-color-text-secondary);
    font-weight: 600;
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    line-height: 1;
}
.nl-probe-meta dd {
    margin: 0;
    color: var(--nl-color-text-primary);
    font-size: 13px;
    line-height: 1.4;
    /* lange Werte (URLs, Strings) sauber umbrechen statt aus dem Grid auszubrechen */
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* Leere/n.a.-Werte dezenter — gleiches Item-Layout, aber weniger visuelle Last */
.nl-probe-meta-empty {
    color: #9AA0A8;
    font-weight: 400;
}
.nl-probe-meta-item--empty dd { color: #9AA0A8; }

/* Sekundärer Sub-Text in einem Wert (z. B. „durch admin", „am 11.05. 17:28") */
.nl-probe-meta-sub {
    display: inline;
    margin-left: 6px;
    color: var(--nl-color-text-secondary);
    font-weight: 400;
    font-size: 11.5px;
}
.nl-probe-meta-sub.d-block {
    display: block;
    margin-left: 0;
    margin-top: 2px;
}

/* Wide-Items: brechen über die ganze Grid-Breite und werden durch eine
   Hairline-Top vom Compact-Bereich optisch abgesetzt. */
.nl-probe-meta-item--wide {
    grid-column: 1 / -1;
    padding-top: 12px;
    border-top: 1px solid #ECEEF2;
}
.nl-probe-meta-item--wide dt {
    margin-bottom: 4px;
}

.nl-probe-meta-item--danger dt {
    color: var(--nl-color-nio);
}

@media (max-width: 560px) {
    .nl-probe-meta {
        grid-template-columns: 1fr;
    }
}

/* Unterproben-Liste als flache Rows mit Hairline, nicht als list-group-Item. */
.nl-probe-sublist {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}
.nl-probe-sublist-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 8px 0;
    border-bottom: 1px solid #ECEEF2;
}
.nl-probe-sublist-row:last-child { border-bottom: none; }
.nl-probe-sublist-main {
    display: inline-flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
    min-width: 0;
}
.nl-probe-sublist-row code {
    font-size: 12px;
    font-weight: 500;
    padding: 1px 6px;
    background: #F1F3F6;
    border: 1px solid #E5E8ED;
    border-radius: 3px;
    color: #2A3340;
}
.nl-probe-sublist-name {
    font-size: 13px;
    font-weight: 500;
    color: var(--nl-color-text-primary);
}
.nl-probe-sublist-typ {
    font-size: 11px;
    color: var(--nl-color-text-secondary);
}

/* Section-Block ohne darüberliegende Card — passt unter den Tab-Bar-Bereich.
   Kein eigener Background, kein Box-Shadow. */
.nl-probe-tabpanel {
    padding: 4px 0 0 0;
}
.nl-probe-tabpanel-empty {
    padding: 28px 18px;
    text-align: center;
    color: #6B7280;
    border: 1px dashed #DDE1E6;
    border-radius: 8px;
    font-size: 13px;
    background: #FAFBFC;
}

/* Inline-Message am Fuß der Page (Speichern-Feedback). Ersetzt alert-* mit
   ruhiger Variante; bricht aus dem Page-Padding nicht aus. */
.nl-probe-flash {
    margin: 12px 0 0 0;
    padding: 8px 12px;
    border-radius: 5px;
    font-size: 12.5px;
    border: 1px solid #ECEEF2;
    background: #F7F8FA;
    color: #2A3340;
}
.nl-probe-flash--error {
    border-color: rgba(220, 38, 38, 0.2);
    background: #FEF4F4;
    color: #7F1D1D;
}
.nl-probe-flash--success {
    border-color: rgba(22, 163, 74, 0.22);
    background: #F1FAF4;
    color: #166534;
}

/* =====================================================================
   List-Pages — Auftraege / Proben (2026-05-13)
   ---------------------------------------------------------------------
   Editorial/Dense-Layout für die operativen Master-Detail-Listen.
   Gleiche Spacing-Skala wie nl-popup-* und nl-freigabe-*.
   ===================================================================== */

/* ---- Page-Frame ----------------------------------------------------- */
.nl-listpage {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 14px 20px 0 20px;
    color: var(--nl-color-text-primary);
}

.nl-listpage-head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    margin-bottom: 2px;
}

.nl-listpage-head-main {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.nl-listpage-head-main h1 {
    font-size: 1.55rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    line-height: 1.2;
    color: var(--nl-color-text-primary);
    margin: 0;
}

.nl-listpage-head-main small {
    color: var(--nl-color-text-secondary);
    font-size: 12.5px;
    line-height: 1.4;
}

.nl-listpage-eyebrow {
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: 10.5px;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
}

.nl-listpage-head-actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-shrink: 0;
}

.nl-listpage-loading {
    color: var(--nl-color-text-secondary);
    font-style: italic;
    font-size: 13px;
    padding: 12px 4px;
}

/* ---- Buttons (kompakte, Linear-Style) ------------------------------- */
.nl-btn-primary-sm {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    height: 28px;
    padding: 0 12px;
    font-size: 12px;
    font-weight: 500;
    line-height: 1;
    color: #FFFFFF;
    background: var(--nl-color-primary);
    border: 1px solid var(--nl-color-primary);
    border-radius: 5px;
    text-decoration: none;
    cursor: pointer;
    box-shadow: 0 1px 0 rgba(15, 48, 87, 0.18);
    transition: background 0.12s ease, border-color 0.12s ease;
    white-space: nowrap;
}

.nl-btn-primary-sm:hover:not(:disabled) {
    background: var(--nl-color-primary-dark, #1a1b4b);
    border-color: var(--nl-color-primary-dark, #1a1b4b);
    color: #FFFFFF;
    text-decoration: none;
}

.nl-btn-primary-sm:disabled,
.nl-btn-primary-sm.disabled {
    background: #B5BAC4;
    border-color: #B5BAC4;
    cursor: not-allowed;
    box-shadow: none;
}

.nl-btn-link-sm {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    height: 28px;
    padding: 0 8px;
    font-size: 12px;
    font-weight: 500;
    line-height: 1;
    color: var(--nl-color-text-secondary);
    background: transparent;
    border: 1px solid transparent;
    border-radius: 5px;
    text-decoration: none;
    cursor: pointer;
    transition: background 0.12s ease, color 0.12s ease;
    white-space: nowrap;
}

.nl-btn-link-sm:hover:not(:disabled) {
    background: #F4F6F9;
    color: var(--nl-color-text-primary);
    text-decoration: none;
}

.nl-btn-link-sm:disabled {
    color: #B5BAC4;
    cursor: not-allowed;
}

/* -----------------------------------------------------------------------
   NlZurueckButton — Zurueck-Navigation auf Detail-/Editor-Seiten
   ----------------------------------------------------------------------- */
.nl-zurueck-btn {
    gap: 3px;
    color: var(--nl-color-text-secondary);
    font-size: 0.8125rem;
}

.nl-zurueck-btn:hover:not(:disabled) {
    color: var(--nl-color-text-primary);
}

.nl-zurueck-icon {
    flex-shrink: 0;
    vertical-align: middle;
    margin-top: -1px;
}

/* -----------------------------------------------------------------------
   Quick-Create Pattern — + Neu Button neben Dropdown-Labels
   ----------------------------------------------------------------------- */
.nl-form-label-row {
    display: flex;
    align-items: baseline;
    gap: 8px;
    margin-bottom: 4px;
}

.nl-quickcreate-trigger {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 1px 7px;
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--nl-color-primary, #2563EB);
    background: none;
    border: 1px solid var(--nl-color-primary, #2563EB);
    border-radius: 4px;
    cursor: pointer;
    line-height: 1.6;
    transition: background 0.1s, color 0.1s;
    white-space: nowrap;
    flex-shrink: 0;
}

.nl-quickcreate-trigger:hover {
    background: var(--nl-color-primary-bg, #EFF6FF);
}

.nl-quickcreate-trigger:focus-visible {
    outline: 2px solid var(--nl-color-primary, #2563EB);
    outline-offset: 2px;
}

/* Quick-Create Popup innenleben */
.nl-quickcreate-body {
    padding: 4px 0 8px;
}

.nl-quickcreate-hint {
    font-size: 0.8125rem;
    margin-bottom: 16px;
}

.nl-quickcreate-footer {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}

.nl-btn-link-danger {
    color: var(--nl-color-nio, #DC2626);
}

.nl-btn-link-danger:hover:not(:disabled) {
    background: #FEF4F4;
    color: #991B1B;
}

/* ---- Banner (Status-Hinweise oben in der Page) ---------------------
   [QT-05] Visuelles Mindest-Niveau: mindestens so auffällig wie
   Bootstrap-alert. Erreicht durch:
     - Padding auf 12px 16px angehoben (BS alert: ~16px)
     - font-size auf 13.5px (war 12.5px)
     - border-left auf 4px verbreitert
     - Hintergrundfarbe leicht gesättigter für warn/danger
   Alle Farbwerte via Token — kein Hardcoded-Hex für semantische Farben.
   --------------------------------------------------------------------- */
.nl-banner {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 12px 16px;
    border: 1px solid #ECEEF2;
    border-left: 4px solid #C7CDD5;
    border-radius: 6px;
    background: #FAFBFC;
    font-size: 13.5px;
    line-height: 1.5;
    color: #2A3340;
}

.nl-banner a { color: var(--nl-color-primary); }
.nl-banner strong { font-weight: 600; }

.nl-banner-warn {
    border-left-color: var(--nl-color-warn, #fbbc3a);
    background: #FFFBF2;
    color: #5C3A0E;
    border-color: rgba(217, 119, 6, 0.20);
}

.nl-banner-danger {
    border-left-color: var(--nl-color-nio, #DC2626);
    background: #FFF5F5;
    color: #7F1D1D;
    border-color: rgba(220, 38, 38, 0.20);
}

.nl-banner-info {
    border-left-color: var(--nl-color-primary, #262766);
    background: #F2F6FB;
    color: #1F3A5F;
}

.nl-banner-success {
    border-left-color: var(--nl-color-io, #16A34A);
    background: #F0FAF4;
    color: #14532D;
}

.nl-banner-tight {
    padding: 8px 12px;
    font-size: 12.5px;
}

/* ---- Aktions-Button-Reihe in der DxGrid-Toolbar (rechtsbuendig, vor SearchBox) ----
   Genutzt z. B. fuer Auftrags-Aktions-Buttons (In Bearbeitung / Abschliessen / Bearbeiten / Stornieren),
   die kontextuell bei selektiertem Auftrag in der Toolbar erscheinen. */
.nl-toolbar-actions {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

/* Gemeinsamer rechtsbuendiger Toolbar-Wrapper: Aktions-Buttons LINKS, SearchBox RECHTS.
   Loest das DevExpress-Verhalten, zwei separate Right-Items uebereinander zu legen. */
.nl-toolbar-right-group {
    display: inline-flex;
    align-items: center;
    gap: 12px;
}

/* ---- Unsichtbarer Anker-Wrapper fuer DxContextMenu-Roots ----------- */
/* DxContextMenu rendert sein Popup in einem Portal (position:absolute).
   Der Root-Div des Components hat aber h=0 und belegt als Page-direktes-Kind
   einen gap-Slot im Flex-Column. Der Wrapper nimmt ALLE Context-Menu-Roots auf
   und schluckt die Gap-Beitraege auf einen einzigen (h=0) Flex-Child. */
.nl-ctx-menu-anchors {
    position: absolute;
    width: 0;
    height: 0;
    overflow: visible;
    pointer-events: none;
}

/* ---- Flache Toolbar (Filter-Chips + Info) -------------------------- */
/* [LAY-FIX-2026-05-27] flex:0 0 auto verhindert, dass die Toolbar Platz
   von den 50/50-Flex-Rows (.nl-master-detail / .nl-probenbaum-row) stiehlt. */
.nl-toolbar-flat {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
    padding: 0;
    margin: 0;
    flex: 0 0 auto;
}

.nl-toolbar-flat-info {
    color: var(--nl-color-text-secondary);
    font-size: 12px;
    font-variant-numeric: tabular-nums;
}

.nl-toolbar-flat-cap {
    color: #9AA0A8;
    margin-left: 6px;
}

/* ---- Filter-Chips (segment-control-style) -------------------------- */
.nl-chiprow {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px;
    background: #F4F6F9;
    border: 1px solid #ECEEF2;
    border-radius: 8px;
    padding: 3px;
}

.nl-chip2 {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 12px;
    border: 1px solid transparent;
    background: transparent;
    border-radius: 5px;
    font-size: 12px;
    font-weight: 500;
    color: #4A5160;
    cursor: pointer;
    line-height: 1.2;
    transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
    white-space: nowrap;
}

.nl-chip2:hover:not(:disabled):not(.is-active) {
    background: #FFFFFF;
    color: var(--nl-color-text-primary);
    border-color: #DDE1E6;
}

.nl-chip2.is-active {
    background: #FFFFFF;
    color: var(--nl-color-text-primary);
    border-color: #DDE1E6;
    box-shadow: 0 1px 0 rgba(15, 48, 87, 0.08);
}

.nl-chip2-label { font-weight: 500; }

.nl-chip2-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    padding: 1px 6px;
    background: #ECEEF2;
    border-radius: 9px;
    font-size: 10.5px;
    font-weight: 600;
    color: #4A5160;
    line-height: 1.3;
    font-variant-numeric: tabular-nums;
}

.nl-chip2.is-active .nl-chip2-count {
    background: var(--nl-color-primary);
    color: #FFFFFF;
}

/* ---- Chip-Row in DxToolbar (kein eigener Hintergrund/Rahmen) ------- */
/* Wird verwendet wenn nl-chiprow in einem DxToolbarItem ContentTemplate sitzt.
   Die Toolbar hat selbst einen Hintergrund — doppelte Box entfernt.            */
.nl-chiprow.nl-chiprow-inline {
    background: transparent;
    border-color: transparent;
    padding: 0;
}

/* ---- DxGrid ToolbarTemplate-Abstimmung ----------------------------- */
/* Suchbox und Buttons in der Grid-Toolbar auf einheitliche Hoehe bringen */
.nl-toolbar-info-item {
    color: var(--nl-color-text-secondary);
    font-size: 12px;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 2px;
}

.nl-toolbar-cap {
    color: #9AA0A8;
    margin-left: 4px;
}

/* ---- [TB-FIX] Integrierte Suchbox in DxToolbar -------------------- */
/* DxSearchBox in einem DxToolbarItem: kompakte Breite, optisch einheitlich
   mit den anderen Toolbar-Elementen (gleiche Hoehe wie DxToolbarItem-Buttons). */
.nl-toolbar-searchbox {
    min-width: 220px;
    max-width: 320px;
}

/* ---- [CTX-1] Spaltenheader-Kontextmenu-Ausloeser ------------------- */
/* Der Span im ColumnHeaderCaptionTemplate nimmt die volle Breite des Headers
   ein, damit Rechtsklick ueberall im Header-Bereich funktioniert. */
.nl-col-header-span {
    display: block;
    width: 100%;
    cursor: default;
    user-select: none;
}

/* ---- [CTX] Kontextmenu-Styling ------------------------------------- */
/* Eigene CSS-Klasse auf DxContextMenu, damit Icon-Klassen greifen. */
.nl-ctx-menu .dxbl-context-menu-item {
    font-size: 13px;
}

/* [FU-1.1] Lucide-SVG-Icons fuer Kontextmenu-Eintraege (ersetzt Unicode-Platzhalter).
   SVG-Paths stammen von lucide.dev (MIT-Lizenz). Eingebettet als data-URI im background-image.
   Alle Icons: 16x16, stroke=currentColor, fill=none, stroke-width=2, round caps/joins.
   Farbgebung per filter:invert(1) nicht noetig — SVG-stroke erbt color via currentColor
   direkt nicht in data-URI; stattdessen: fester Grauton (#555) passend zum Menu-Theme. */
.nl-ctx-icon::before {
    content: "";
    display: inline-block;
    width: 14px;
    height: 14px;
    margin-right: 7px;
    vertical-align: -2px;
    background-repeat: no-repeat;
    background-position: center;
    background-size: 14px 14px;
    opacity: 0.75;
    flex-shrink: 0;
}

/* arrow-up (lucide) */
.nl-ctx-icon-sort-asc::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 19V5'/%3E%3Cpolyline points='5 12 12 5 19 12'/%3E%3C/svg%3E");
}
/* arrow-down (lucide) */
.nl-ctx-icon-sort-desc::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14'/%3E%3Cpolyline points='19 12 12 19 5 12'/%3E%3C/svg%3E");
}
/* x (lucide) */
.nl-ctx-icon-sort-off::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E");
}
/* columns (lucide) */
.nl-ctx-icon-spalten::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='2'/%3E%3Cline x1='12' y1='3' x2='12' y2='21'/%3E%3C/svg%3E");
}
/* eye-off (lucide) */
.nl-ctx-icon-ausblenden::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94'/%3E%3Cpath d='M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19'/%3E%3Cline x1='1' y1='1' x2='23' y2='23'/%3E%3C/svg%3E");
}
/* move-horizontal (lucide) */
.nl-ctx-icon-breite::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='18 8 22 12 18 16'/%3E%3Cpolyline points='6 8 2 12 6 16'/%3E%3Cline x1='2' y1='12' x2='22' y2='12'/%3E%3C/svg%3E");
}
/* external-link (lucide) */
.nl-ctx-icon-oeffnen::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6'/%3E%3Cpolyline points='15 3 21 3 21 9'/%3E%3Cline x1='10' y1='14' x2='21' y2='3'/%3E%3C/svg%3E");
}
/* file-text (lucide) — Auftrag oeffnen */
.nl-ctx-icon-auftrag::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='16' y1='13' x2='8' y2='13'/%3E%3Cline x1='16' y1='17' x2='8' y2='17'/%3E%3Cpolyline points='10 9 9 9 8 9'/%3E%3C/svg%3E");
}
/* git-branch (lucide) — Teilprobe */
.nl-ctx-icon-teilprobe::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='6' y1='3' x2='6' y2='15'/%3E%3Ccircle cx='18' cy='6' r='3'/%3E%3Ccircle cx='6' cy='18' r='3'/%3E%3Cpath d='M18 9a9 9 0 0 1-9 9'/%3E%3C/svg%3E");
}
/* refresh-cw (lucide) — Nachuntersuchung */
.nl-ctx-icon-nachuntersuchen::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='23 4 23 10 17 10'/%3E%3Cpolyline points='1 20 1 14 7 14'/%3E%3Cpath d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/%3E%3C/svg%3E");
}
/* archive (lucide) — Rueckstellprobe */
.nl-ctx-icon-rueckstell::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='21 8 21 21 3 21 3 8'/%3E%3Crect x='1' y='3' width='22' height='5'/%3E%3Cline x1='10' y1='12' x2='14' y2='12'/%3E%3C/svg%3E");
}
/* copy (lucide) — Duplikat */
.nl-ctx-icon-duplikat::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2'/%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1'/%3E%3C/svg%3E");
}
/* printer (lucide) */
.nl-ctx-icon-drucken::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 6 2 18 2 18 9'/%3E%3Cpath d='M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2'/%3E%3Crect x='6' y='14' width='12' height='8'/%3E%3C/svg%3E");
}
/* plus-circle (lucide) — Probe neu */
.nl-ctx-icon-probe-neu::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='16'/%3E%3Cline x1='8' y1='12' x2='16' y2='12'/%3E%3C/svg%3E");
}
/* ban (lucide) — stornieren */
.nl-ctx-icon-stornieren::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='4.93' y1='4.93' x2='19.07' y2='19.07'/%3E%3C/svg%3E");
}

/* ---- Empty-State (flach, ohne Box-Shadow) -------------------------- */
.nl-empty-flat {
    padding: 22px 18px;
    text-align: left;
    color: var(--nl-color-text-secondary);
    font-size: 13px;
    line-height: 1.5;
    background: #FFFFFF;
}

.nl-empty-flat-inline {
    padding: 18px 12px;
    background: transparent;
}

.nl-empty-flat-eyebrow {
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: 10.5px;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    margin-bottom: 4px;
}

.nl-empty-flat-title {
    font-size: 14px;
    font-weight: 600;
    color: var(--nl-color-text-primary);
    margin-bottom: 4px;
}

.nl-empty-flat-hint {
    color: var(--nl-color-text-secondary);
    line-height: 1.5;
}

/* ---- Detail-Pane (flach, statt klassische Card) -------------------- */
.nl-detail-flat {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 14px 16px;
}

/* Die Card ist im 50/50-Master-Detail-Layout ein flex-column mit
   height: 100%. Default flex-shrink:1 würde die Kinder (besonders den
   Summary-Strip mit den Zahlen) zusammenquetschen sobald die Card zu
   kurz ist — die Zahlen werden dann unleserlich. Garantiere statt
   dessen die Eigenhöhe jedes Kindes; die Card scrollt via
   overflow-y:auto. */
.nl-detail-flat > * { flex-shrink: 0; }

.nl-detail-flat-head {
    display: flex;
    flex-direction: row;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
}

.nl-detail-flat-head-main {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1 1 auto;
}

.nl-detail-flat-head > .nl-status {
    flex-shrink: 0;
    margin-top: 4px;
}

.nl-detail-flat-eyebrow {
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: 10.5px;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
}

.nl-detail-flat-title {
    display: flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--nl-color-text-primary);
    line-height: 1.25;
}

.nl-detail-flat-title code {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-size: 0.95rem;
    color: var(--nl-color-primary);
    background: transparent;
    padding: 0;
}

.nl-detail-flat-sub {
    font-size: 13px;
    font-weight: 500;
    color: var(--nl-color-text-secondary);
}

/* ---- Summary-Strip (i.O./Warn/n.i.O./offen) -----------------------
   Im schmalen Detail-Pane stehen die 4 Items oft mit wenig Platz —
   daher: min-width 64px pro Item + flex-wrap, damit auf engen Spalten
   2×2 statt 1×4 stehen. Plus min-height fuer konsistente Zeilenhoehe. */
.nl-summary-strip {
    display: flex;
    flex-wrap: wrap;
    gap: 0;
    border: 1px solid #ECEEF2;
    border-radius: 6px;
    background: #FFFFFF;
    overflow: hidden;
}

.nl-summary-strip-item {
    flex: 1 1 64px;
    min-width: 64px;
    min-height: 56px;
    padding: 10px 12px;
    border-right: 1px solid #ECEEF2;
    display: flex;
    flex-direction: column;
    gap: 4px;
    align-items: flex-start;
    justify-content: center;
}

.nl-summary-strip-item:last-child { border-right: none; }

.nl-summary-strip-num {
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--nl-color-text-primary);
    line-height: 1;
    font-variant-numeric: tabular-nums;
}

.nl-summary-strip-label {
    font-size: 10.5px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    line-height: 1.2;
}

.nl-summary-strip-io .nl-summary-strip-num   { color: var(--nl-color-io, #16A34A); }
.nl-summary-strip-warn .nl-summary-strip-num { color: var(--nl-color-warn, #fbbc3a); }
.nl-summary-strip-nio .nl-summary-strip-num  { color: var(--nl-color-nio, #DC2626); }

/* ---- Action-Bar im Detail-Pane ------------------------------------
   Kompakte horizontale Zeile, ohne eigene Border — die visuelle
   Trennung kommt aus dem Card-Gap. Buttons direkt in voller Höhe;
   kein vertikaler Bar-Padding. */
.nl-actionbar-flat {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 0;
    border: 0;
    margin: 0;
    flex-wrap: wrap;
}

.nl-actionbar-flat-spacer { flex: 1; }

.nl-actionbar-flat--standalone {
    border-top: 1px solid #ECEEF2;
    padding-top: 14px;
    margin-top: 18px;
}

/* ---- Detail-Sections im Detail-Pane (Stammdaten, Zusatzfelder, etc.) */
.nl-detail-section {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding-top: 12px;
    border-top: 1px solid #ECEEF2;
}

.nl-detail-section:first-of-type {
    padding-top: 0;
    border-top: none;
}

.nl-detail-section-title {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.09em;
    color: #6B7280;
    line-height: 1;
}

.nl-detail-section-body {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.nl-detail-section--danger .nl-detail-section-title {
    color: var(--nl-color-nio, #DC2626);
}

/* ---- ZustaendigkeitenPanel (Auftrags-/Probendetail) ------------------ */
.nl-zustaendigkeiten-panel .nl-detail-section-title {
    display: flex;
    align-items: center;
    gap: 8px;
}

.nl-zustaendigkeiten-liste {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.nl-zustaendigkeiten-item {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    padding: 4px 0;
}

.nl-zustaendigkeiten-name {
    font-weight: 600;
}

/* ---- nl-context-bar — Kontextleiste zwischen Grid und Tab-Block ------ */
.nl-context-bar {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 8px 16px;
    background: var(--nl-color-bg-card);
    border-top: 1px solid var(--nl-color-border, #E5E7EB);
    border-bottom: 1px solid var(--nl-color-border, #E5E7EB);
    /* [LAY-FIX-ITER2-2026-05-27] flex:0 0 auto verhindert Wachsen/Schrumpfen.
       position:relative + z-index:1 stellt sicher, dass sie ueber einem
       overflow-clip-Rand einer benachbarten Row sichtbar bleibt. */
    flex: 0 0 auto;
    position: relative;
    z-index: 1;
}

.nl-context-bar-info {
    display: flex;
    align-items: center;
    gap: 8px;
    flex: 1;
    min-width: 0;
    flex-wrap: wrap;
}

.nl-context-bar-nummer {
    font-size: var(--nl-font-size-sm, 13px);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    white-space: nowrap;
}

.nl-context-bar-bezeichnung {
    font-size: var(--nl-font-size-sm, 13px);
    color: var(--nl-color-text-secondary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 200px;
}

.nl-context-bar-kunde {
    font-size: var(--nl-font-size-sm, 13px);
    color: var(--nl-color-text-secondary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 200px;
}

.nl-context-bar-actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-shrink: 0;
}

/* ---- Quick-Datum-Buttons neben DateEdit ---- */
.nl-datefield-with-quick {
    display: flex;
    align-items: center;
    gap: 6px;
}

.nl-datefield-with-quick > .w-100 {
    flex: 1;
    min-width: 0;
}

.nl-quick-datum {
    white-space: nowrap;
    flex-shrink: 0;
}

/* ---- Audit-Marker-Icon im Bearbeiten-Dialog ---- */
.nl-field-audit-marker {
    font-size: 12px;
    opacity: 0.6;
    cursor: help;
}

/* ---- Bearbeiten-Dialog Readonly-Kopf ---- */
.nl-bearbeiten-head {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 0;
    border-bottom: 1px solid var(--nl-color-border, #E5E7EB);
}

.nl-bearbeiten-head-art {
    font-size: var(--nl-font-size-sm, 13px);
    color: var(--nl-color-text-secondary);
}

/* ---- Form-Label-Hint (Zusatz-Text neben Label) ---- */
.nl-form-label-hint {
    font-size: 11px;
    font-weight: 400;
    color: var(--nl-color-text-secondary);
    margin-left: 4px;
}

/* ---- Key-Values-Grid (Label | Wert) ------------------------------- */
.nl-keyvals {
    display: grid;
    grid-template-columns: 130px 1fr;
    row-gap: 4px;
    column-gap: 14px;
    margin: 0;
    font-size: 12.5px;
    line-height: 1.4;
}

.nl-keyvals dt {
    margin: 0;
    padding: 0;
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    align-self: center;
}

.nl-keyvals dd {
    margin: 0;
    padding: 0;
    color: var(--nl-color-text-primary);
    font-weight: 500;
}

.nl-keyvals-empty {
    color: #9AA0A8;
    font-weight: 400;
}

.nl-keyvals-mute {
    color: var(--nl-color-text-secondary);
    font-weight: 400;
    font-size: 11.5px;
}

.nl-keyvals-mute-block {
    display: block;
    margin-top: 4px;
}

.nl-keyvals-wide-label {
    grid-column: 1 / 3;
    padding-top: 6px;
}

.nl-keyvals-wide-value {
    grid-column: 1 / 3;
    white-space: pre-wrap;
}

/* ---- Tab-Scrollarea (für Probenbaum-Subview) ---------------------- */
.nl-tab-scrollarea {
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
}

/* ---- Wizard (AuftragNeu) ------------------------------------------ */
.nl-form-container-wide {
    max-width: 1200px;
}

.nl-form-page-head--compact { margin-bottom: 8px; }

.nl-eyebrow-link {
    color: var(--nl-color-text-secondary);
    text-decoration: none;
}

.nl-eyebrow-link:hover {
    color: var(--nl-color-primary);
    text-decoration: underline;
}

.nl-create-page {
    padding-bottom: 32px;
}

.nl-wizard-layout {
    display: grid;
    grid-template-columns: 240px 1fr;
    gap: 28px;
    align-items: flex-start;
}

.nl-wizard-rail {
    position: sticky;
    top: 16px;
    align-self: flex-start;
}

.nl-wizard-steps {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.nl-wizard-step {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 10px 12px;
    border: 1px solid transparent;
    border-radius: 6px;
    transition: border-color 0.12s ease, background 0.12s ease;
}

.nl-wizard-step-num {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 11px;
    background: #ECEEF2;
    color: var(--nl-color-text-secondary);
    font-size: 11px;
    font-weight: 700;
    flex-shrink: 0;
    line-height: 1;
}

.nl-wizard-step-body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.nl-wizard-step-title {
    font-size: 13px;
    font-weight: 600;
    color: var(--nl-color-text-primary);
    line-height: 1.25;
}

.nl-wizard-step-hint {
    font-size: 11px;
    color: var(--nl-color-text-secondary);
    line-height: 1.4;
}

.nl-wizard-step.is-current {
    background: #F2F6FB;
    border-color: rgba(38, 39, 102, 0.18);
}

.nl-wizard-step.is-current .nl-wizard-step-num {
    background: var(--nl-color-primary);
    color: #FFFFFF;
}

.nl-wizard-step.is-done .nl-wizard-step-num {
    background: var(--nl-color-io, #16A34A);
    color: #FFFFFF;
}

.nl-wizard-step.is-muted .nl-wizard-step-title,
.nl-wizard-step.is-muted .nl-wizard-step-hint {
    color: #9AA0A8;
}

.nl-wizard-main {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

/* Editorial-Section (Wizard-Schritte) — wie nl-popup-section, aber
   mit zusätzlichem „Schritt N"-Eyebrow oberhalb der Caption. */
.nl-editorial-section {
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding-top: 18px;
    border-top: 1px solid #ECEEF2;
}

.nl-editorial-section:first-of-type {
    padding-top: 4px;
    border-top: none;
}

.nl-editorial-section-head {
    display: flex;
    flex-direction: column;
    gap: 3px;
}

.nl-editorial-section-step {
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-size: 10.5px;
    font-weight: 600;
    color: var(--nl-color-primary);
}

.nl-editorial-section-title {
    font-size: 1rem;
    font-weight: 700;
    color: var(--nl-color-text-primary);
    margin: 0;
    line-height: 1.3;
}

.nl-editorial-section-hint {
    margin: 0;
    font-size: 12.5px;
    color: var(--nl-color-text-secondary);
    line-height: 1.45;
}

.nl-form-hint-warn {
    color: var(--nl-color-warn, #fbbc3a);
    font-weight: 500;
}

/* Responsive: Wizard kollabiert auf engen Screens */
@media (max-width: 900px) {
    .nl-wizard-layout {
        grid-template-columns: 1fr;
    }
    .nl-wizard-rail {
        position: static;
    }
}

/* ---- Row-Action-Icon (Listen-Spalte "Öffnen") --------------------- */
.nl-grid-rowaction {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 4px;
    color: var(--nl-color-text-secondary);
    border: 1px solid transparent;
    transition: all 0.15s ease;
}

.nl-grid-rowaction:hover {
    color: var(--nl-color-primary);
    background: #F2F6FB;
    border-color: rgba(38, 39, 102, 0.18);
}

/* ---- Spalten-Chooser-Popup (Listen-Customization) ----------------- */
.nl-spaltenchooser-liste {
    max-height: 420px;
    overflow-y: auto;
    border: 1px solid #E5E8EE;
    border-radius: 6px;
    padding: 4px;
    background: #FFFFFF;
}

.nl-spaltenchooser-zeile {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 6px 8px;
    border-radius: 4px;
}

.nl-spaltenchooser-zeile + .nl-spaltenchooser-zeile {
    border-top: 1px solid #F1F3F6;
}

.nl-spaltenchooser-zeile:hover {
    background: #F8FAFC;
}

.nl-spaltenchooser-zeile.is-zusatzfeld {
    background: #FBFAFF;
}

.nl-spaltenchooser-btn {
    border: 1px solid #DDE2EA;
    background: #FFFFFF;
    color: #5B6273;
    width: 28px;
    height: 28px;
    border-radius: 4px;
    font-size: 11px;
    cursor: pointer;
    transition: all 0.15s;
}

.nl-spaltenchooser-btn:hover:not(:disabled) {
    background: #F2F6FB;
    color: var(--nl-color-primary);
    border-color: var(--nl-color-primary);
}

.nl-spaltenchooser-btn:disabled {
    opacity: 0.3;
    cursor: not-allowed;
}

/* ---- Bulk-Selection-Bar (ProbenListe) ----------------------------- */
.nl-selectionbar {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 12px;
    background: #F2F6FB;
    border: 1px solid rgba(38, 39, 102, 0.18);
    border-radius: 6px;
    font-size: 12.5px;
}

.nl-selectionbar-count {
    font-weight: 600;
    color: var(--nl-color-primary);
}

.nl-card-flat {
    box-shadow: none;
    border: 1px solid #ECEEF2;
    background: #FFFFFF;
    padding: 0;
}

/* =====================================================================
   Bulk-Eingang (Scanner-Wedge-Workflow) — Editorial / Dense (2026-05-14)
   ===================================================================== */

/* ---- Scan-Input prominent ---- */
.nl-bulk-scan {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin-bottom: 2px;
}

.nl-bulk-scan-label {
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    font-weight: 700;
    color: var(--nl-color-text-secondary);
}

.nl-bulk-scan-input {
    height: 44px;
    padding: 8px 14px;
    font-size: 15px;
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    background: #FFFFFF;
    border: 2px solid var(--nl-color-primary);
    border-radius: 7px;
    box-shadow: 0 0 0 3px rgba(38, 39, 102, 0.10);
    color: var(--nl-color-text-primary);
    transition: box-shadow 0.12s ease;
}

.nl-bulk-scan-input:focus {
    outline: none;
    box-shadow: 0 0 0 4px rgba(38, 39, 102, 0.18);
}

/* ---- Pending-Card ---- */
.nl-bulk-pending {
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: 16px 18px;
    background: #FFFBF5;
    border: 1px solid rgba(217, 119, 6, 0.30);
    border-left: 4px solid var(--nl-color-warn, #fbbc3a);
    border-radius: 8px;
    box-shadow: 0 1px 3px rgba(15, 23, 42, 0.05);
}

.nl-bulk-pending-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
}

.nl-bulk-pending-headmain {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.nl-bulk-pending-eyebrow {
    font-size: 10px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    color: #92400E;
}

.nl-bulk-pending-title {
    display: flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--nl-color-text-primary);
}

.nl-bulk-pending-title code {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-size: 1rem;
    color: var(--nl-color-primary);
    background: transparent;
    padding: 0;
}

.nl-bulk-pending-sub {
    font-size: 13px;
    font-weight: 500;
    color: var(--nl-color-text-secondary);
}

.nl-bulk-pending-meta {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    column-gap: 16px;
    row-gap: 8px;
    margin: 0;
    padding: 0;
}

.nl-bulk-pending-meta-item {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.nl-bulk-pending-meta dt {
    margin: 0;
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    line-height: 1;
}

.nl-bulk-pending-meta dd {
    margin: 0;
    font-size: 13px;
    line-height: 1.4;
    color: var(--nl-color-text-primary);
}

/* ---- Checks-Block ---- */
.nl-bulk-checks {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding-top: 8px;
    border-top: 1px solid rgba(146, 64, 14, 0.18);
}

.nl-bulk-checks-head {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    color: var(--nl-color-text-secondary);
    margin-bottom: 4px;
}

.nl-bulk-checks-empty {
    padding: 6px 0;
    color: var(--nl-color-text-secondary);
    font-size: 12px;
    font-style: italic;
}

.nl-bulk-check-row {
    display: grid;
    grid-template-columns: minmax(220px, 1fr) 2fr;
    align-items: center;
    gap: 12px;
    padding: 6px 8px;
    border-radius: 5px;
    background: #FFFFFF;
    border: 1px solid transparent;
}

.nl-bulk-check-row.is-mangel {
    border-color: rgba(220, 38, 38, 0.25);
    background: #FEF4F4;
}

.nl-bulk-check-row .form-check {
    margin: 0;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding-left: 0;
    min-height: auto;
}

.nl-bulk-check-row .form-check-input {
    margin: 0;
    width: 16px;
    height: 16px;
    cursor: pointer;
}

.nl-bulk-check-row .form-check-label {
    font-size: 13px;
    color: var(--nl-color-text-primary);
    cursor: pointer;
}

.nl-bulk-check-pflicht {
    color: var(--nl-color-nio);
    font-weight: 700;
    margin-left: 2px;
}

.nl-bulk-check-notiz {
    height: 28px;
    font-size: 12px;
}

.nl-bulk-general-notiz {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.nl-bulk-general-notiz .form-label {
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    margin: 0;
}

.nl-bulk-pending-actions {
    display: flex;
    align-items: center;
    gap: 8px;
    padding-top: 8px;
    border-top: 1px solid rgba(146, 64, 14, 0.18);
}

/* ---- Heute / Sitzungs-Liste ---- */
.nl-bulk-heute {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 14px 16px;
    background: #FFFFFF;
    border: 1px solid #E5E8ED;
    border-radius: 8px;
}

.nl-bulk-heute-head {
    display: flex;
    align-items: center;
    gap: 10px;
    padding-bottom: 8px;
    border-bottom: 1px solid #ECEEF2;
}

.nl-bulk-heute-title {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    color: var(--nl-color-text-secondary);
}

.nl-bulk-heute-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    padding: 2px 8px;
    background: #ECEEF2;
    border-radius: 10px;
    font-size: 11px;
    font-weight: 600;
    color: #4A5160;
}

.nl-bulk-heute-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.nl-bulk-heute-row {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 7px 10px;
    border-radius: 5px;
    border: 1px solid transparent;
    transition: background 0.12s ease, border-color 0.12s ease;
    font-size: 12.5px;
}

.nl-bulk-heute-row:hover {
    border-color: #ECEEF2;
    background: #FAFBFC;
}

.nl-bulk-heute-row.is-mangel {
    background: rgba(217, 119, 6, 0.05);
}

.nl-bulk-heute-nr {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-weight: 600;
    color: var(--nl-color-primary);
    font-size: 12.5px;
}

.nl-bulk-heute-time {
    font-size: 11.5px;
    color: var(--nl-color-text-secondary);
    font-variant-numeric: tabular-nums;
}

/* ---- Prüfmittel-Inventur — Ziel-Konfig oben ----------------------- */
.nl-inventur-config {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 14px 16px;
    background: #F8FAFC;
    border: 1px solid #E5E8ED;
    border-left: 3px solid var(--nl-color-primary);
    border-radius: 8px;
}

.nl-inventur-config-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}

.nl-inventur-config-title {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.10em;
    color: var(--nl-color-text-primary);
}

.nl-inventur-config-hint {
    font-size: 11.5px;
    color: var(--nl-color-text-secondary);
}

.nl-inventur-row-name {
    font-size: 12.5px;
    color: var(--nl-color-text-primary);
    font-weight: 500;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    flex: 1 1 auto;
    min-width: 0;
}

/* ---- Eingebetteter Regelkarten-Chart ------------------------------ */
.nl-regelkarte-chart {
    padding: 12px 14px;
    background: #FFFFFF;
    border: 1px solid #ECEEF2;
    border-radius: 8px;
}

.nl-regelkarte-chart-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    padding-bottom: 8px;
    margin-bottom: 4px;
    border-bottom: 1px solid #ECEEF2;
}

/* =====================================================================
   QS-Hub: Karten-Status-Heatmap (2026-05-15)
   Klick-fähige Zellen, Ampel-Farben analog nl-status-*-Tokens.
   ===================================================================== */
.nl-spc-heatmap th,
.nl-spc-heatmap td {
    padding: 4px 6px;
    vertical-align: middle;
}

.nl-spc-cell {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 2px;
    min-width: 56px;
    height: 26px;
    padding: 0 8px;
    border: 1px solid transparent;
    border-radius: 6px;
    font-size: 0.75rem;
    font-weight: 600;
    background: transparent;
    cursor: pointer;
    transition: filter 0.12s ease, transform 0.12s ease;
}

.nl-spc-cell:hover { filter: brightness(0.96); transform: translateY(-1px); }
.nl-spc-cell:focus-visible { outline: 2px solid var(--nl-color-primary, #262766); outline-offset: 1px; }

.nl-spc-cell-gruen {
    background: rgba(22, 163, 74, 0.14);
    color: #15803d;
    border-color: rgba(22, 163, 74, 0.25);
}
.nl-spc-cell-initial {
    /* Initialphase: geplanter Aufbau-Zustand, eigene blau-graue Farbe — bewusst
       neutraler als Warnung (gelb), aber sichtbar abgesetzt von „endgültig grün". */
    background: rgba(37, 99, 235, 0.10);
    color: #1d4ed8;
    border-color: rgba(37, 99, 235, 0.25);
}
.nl-spc-cell-gelb {
    background: rgba(217, 119, 6, 0.15);
    color: #b45309;
    border-color: rgba(217, 119, 6, 0.30);
}
.nl-spc-cell-rot {
    background: rgba(220, 38, 38, 0.13);
    color: #b91c1c;
    border-color: rgba(220, 38, 38, 0.30);
}
.nl-spc-cell-leer {
    background: transparent;
    color: #d1d5db;
    cursor: default;
}
.nl-spc-cell-leer:hover { filter: none; transform: none; }

/* Worklist-Cards mit semantischem Left-Border-Akzent — Designer 2026-05-15. */
.nl-card-accent-rot { border-left: 3px solid #DC2626; }
.nl-card-accent-amber { border-left: 3px solid var(--nl-color-warn, #fbbc3a); }

/* =====================================================================
   Import-Profil-Editor: Vorschau-Tabelle (2026-05-15)
   Spalten farbig umrandet je nach Rolle (Schlüssel/Gemappt/Frei).
   Vollständiger Spalten-Frame: links/rechts an allen Zellen, oben an Header,
   unten nur an der letzten Datenzeile — ergibt einen sauberen Block-Look.
   ===================================================================== */
.nl-vorschau-tabelle {
    border-collapse: separate;
    border-spacing: 0;
}

.nl-vorschau-tabelle th,
.nl-vorschau-tabelle td {
    font-size: 0.75rem;
    padding: 4px 8px;
}

.nl-vorschau-tabelle th {
    font-weight: 600;
    text-transform: none;
    letter-spacing: 0;
}

/* Schlüssel-Spalte: Primary-Blau */
.nl-vorschau-rolle-key {
    background: rgba(38, 39, 102, 0.06);
    border-left: 1px solid rgba(38, 39, 102, 0.45);
    border-right: 1px solid rgba(38, 39, 102, 0.45);
}
.nl-vorschau-tabelle thead .nl-vorschau-rolle-key {
    background: rgba(38, 39, 102, 0.14);
    border-top: 1px solid rgba(38, 39, 102, 0.45);
    color: var(--nl-color-primary, #262766);
}
.nl-vorschau-tabelle tbody tr:last-child .nl-vorschau-rolle-key {
    border-bottom: 1px solid rgba(38, 39, 102, 0.45);
}

/* Gemappte Spalte: Grün */
.nl-vorschau-rolle-mapped {
    background: rgba(22, 163, 74, 0.06);
    border-left: 1px solid rgba(22, 163, 74, 0.45);
    border-right: 1px solid rgba(22, 163, 74, 0.45);
}
.nl-vorschau-tabelle thead .nl-vorschau-rolle-mapped {
    background: rgba(22, 163, 74, 0.14);
    border-top: 1px solid rgba(22, 163, 74, 0.45);
    color: #15803d;
}
.nl-vorschau-tabelle tbody tr:last-child .nl-vorschau-rolle-mapped {
    border-bottom: 1px solid rgba(22, 163, 74, 0.45);
}

/* Freie Spalte: keine Umrandung, nur Text muted — soll optisch zurücktreten. */
.nl-vorschau-rolle-unused {
    background: transparent;
    color: var(--nl-color-text-secondary, #6B7280);
}

/* Legenden-Marker: kleine Quadrate als Inline-Indikator (kein Frame). */
.small .nl-vorschau-rolle-key,
.small .nl-vorschau-rolle-mapped,
.small .nl-vorschau-rolle-unused {
    display: inline-block;
    min-width: 18px;
    text-align: center;
    padding: 0 4px;
    border-radius: 3px;
    font-weight: 700;
    font-size: 0.7rem;
    margin-right: 3px;
    border: none;
}
.small .nl-vorschau-rolle-key {
    background: rgba(38, 39, 102, 0.18);
    color: var(--nl-color-primary, #262766);
}
.small .nl-vorschau-rolle-mapped {
    background: rgba(22, 163, 74, 0.18);
    color: #15803d;
}
.small .nl-vorschau-rolle-unused {
    background: rgba(107, 114, 128, 0.12);
    color: var(--nl-color-text-secondary, #6B7280);
}

/* Profil-Auto-Match-Vorschlag (Messdaten-Upload) — Buttons mit Hover/Active-State. */
.nl-profil-vorschlag {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
    background: #FFFFFF;
    border: 1px solid #E5E9F0;
    border-radius: 6px;
    padding: 6px 10px;
    cursor: pointer;
    transition: background 0.12s ease, border-color 0.12s ease;
}

.nl-profil-vorschlag:hover {
    background: rgba(38, 39, 102, 0.04);
    border-color: rgba(38, 39, 102, 0.30);
}

.nl-profil-vorschlag.is-active {
    background: rgba(22, 163, 74, 0.08);
    border-color: rgba(22, 163, 74, 0.45);
}

.nl-profil-vorschlag-titel {
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--nl-color-text-primary, #1A1A2E);
}

.nl-profil-vorschlag-hint {
    font-size: 0.75rem;
    color: var(--nl-color-text-secondary, #6B7280);
}

/* Kompakte Key-Value-Liste für Import-Rohdaten (Messdaten-Detail). */
.nl-rohdaten-list {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 2px 8px;
    margin: 0;
}
.nl-rohdaten-list dt {
    color: var(--nl-color-text-secondary, #6B7280);
    font-weight: 500;
    font-size: 0.7rem;
}
.nl-rohdaten-list dd {
    margin: 0;
    font-size: 0.75rem;
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    word-break: break-word;
}

/* ============================================================
   Stammdaten-Cockpit Pivot-Tabelle (global, NICHT scoped)
   Bewusst hier statt in der scoped Razor-CSS, weil der Pivot-Markup
   per StringBuilder/AddMarkupContent injiziert wird und damit kein
   b-xxxxx-Attribut bekommt. Scoped CSS würde daher nicht greifen.
   Siehe Memory blazor_scoped_css_stringbuilder_trap.
   ============================================================ */

.nl-pivot-wrap {
    flex: 1;
    min-height: 0;
    min-width: 0;
    display: flex;
    /* Wichtig: max-width auf 100%, damit der Wrap nicht selbst über den Parent hinauswächst */
    max-width: 100%;
}

.nl-pivot-shell {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
    /* min-width: 0 erlaubt dem Scroll-Container, schmaler als sein Inhalt zu werden */
    min-width: 0;
}

.nl-pivot-scroll {
    flex: 1;
    /* overflow: auto erzeugt scrollbars in beiden Achsen wenn Inhalt überhängt */
    overflow: auto;
    /* min-width: 0 ist hier essenziell — sonst expandiert der Container statt zu scrollen */
    min-width: 0;
    border: 1px solid #dde3ec;
    border-radius: 6px;
    background: #fff;
    scrollbar-width: thin;
    scrollbar-color: #c4cbd6 transparent;
}

.nl-pivot-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
.nl-pivot-scroll::-webkit-scrollbar-thumb {
    background: #c4cbd6;
    border-radius: 4px;
    border: 2px solid #fff;
}
.nl-pivot-scroll::-webkit-scrollbar-thumb:hover { background: #9aa3b2; }

/* Virtual Scrolling (CSS-nativ) — bei sehr großen Pivot/Spec-Tabellen überspringt der
   Browser Layout + Painting für tbody-Rows außerhalb des Viewports. contain-intrinsic-size
   reserviert eine Platzhalter-Höhe, damit Scrollbar + Sticky-Header nicht springen.
   Funktioniert nur für tbody > tr, weil thead die Sticky-Spaltenköpfe enthält. */
.nl-pivot-scroll tbody > tr,
.nl-spec-scroll tbody > tr {
    content-visibility: auto;
    contain-intrinsic-size: 0 44px;
}

table.nl-pivot {
    border-collapse: separate;
    border-spacing: 0;
    font-size: 0.82rem;
    margin: 0;
    width: max-content;
    color: #1f2937;
    font-variant-numeric: tabular-nums;
}

table.nl-pivot th,
table.nl-pivot td {
    margin: 0;
    padding: 0;
    background: #fff;
    border-right: 1px solid #e6ebf2;
    border-bottom: 1px solid #e6ebf2;
    box-sizing: border-box;
}

table.nl-pivot tr > *:last-child { border-right: none; }
table.nl-pivot tbody tr:last-child > * { border-bottom: none; }

/* Corner (oben-links, sticky in beide Achsen) */
th.nl-pivot-corner {
    position: sticky;
    top: 0;
    left: 0;
    z-index: 4;
    background: linear-gradient(180deg, #f5f7fa 0%, #eef1f6 100%);
    text-align: left;
    padding: 10px 14px;
    font-size: 0.72rem;
    font-weight: 600;
    color: #6b7280;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    min-width: 240px;
    box-shadow:
        2px 0 0 -1px #dde3ec,
        0 2px 0 -1px #dde3ec,
        4px 4px 8px -4px rgba(15, 48, 87, 0.12);
}

th.nl-pivot-corner .nl-pivot-corner-axis {
    display: flex;
    align-items: center;
    gap: 6px;
    color: #4b5563;
}

th.nl-pivot-corner .nl-pivot-corner-arrow {
    color: #9ca3af;
    font-size: 0.85rem;
}

/* Matrix-Header (oben, sticky) */
th.nl-pivot-colhead {
    position: sticky;
    top: 0;
    z-index: 3;
    background: linear-gradient(180deg, #f5f7fa 0%, #eef1f6 100%);
    text-align: center;
    font-weight: 600;
    padding: 10px 12px;
    min-width: 116px;
    box-shadow: 0 2px 0 -1px #dde3ec;
}

th.nl-pivot-colhead .nl-pivot-colhead-kuerzel {
    display: block;
    font-family: ui-monospace, "SF Mono", "Cascadia Mono", "JetBrains Mono", Menlo, Consolas, monospace;
    font-size: 0.82rem;
    font-weight: 700;
    color: var(--nl-color-primary-dark, #1a1b4b);
    letter-spacing: 0.02em;
}

th.nl-pivot-colhead .nl-pivot-colhead-bez {
    display: block;
    font-size: 0.68rem;
    font-weight: 400;
    color: #6b7280;
    margin-top: 2px;
    max-width: 140px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Parameter-Header (links, sticky) */
th.nl-pivot-rowhead {
    position: sticky;
    left: 0;
    z-index: 2;
    background: #fbfcfd;
    text-align: left;
    font-weight: 500;
    padding: 8px 14px 8px 12px;
    min-width: 240px;
    max-width: 280px;
    box-shadow: 2px 0 0 -1px #dde3ec;
    transition: background-color 0.12s;
}

th.nl-pivot-rowhead .nl-pivot-rowhead-kuerzel {
    display: block;
    font-family: ui-monospace, "SF Mono", "Cascadia Mono", "JetBrains Mono", Menlo, Consolas, monospace;
    font-size: 0.82rem;
    font-weight: 700;
    color: var(--nl-color-primary-dark, #1a1b4b);
    letter-spacing: 0.02em;
}

th.nl-pivot-rowhead .nl-pivot-rowhead-bez {
    display: block;
    font-size: 0.7rem;
    font-weight: 400;
    color: #6b7280;
    margin-top: 1px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Daten-Zellen */
td.nl-pivot-cell {
    position: relative;
    z-index: 1;
    text-align: center;
    min-width: 116px;
    height: 44px;
    padding: 0;
    transition: background-color 0.12s;
}

td.nl-pivot-cell .nl-pivot-link {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0;
    width: 100%;
    height: 100%;
    padding: 6px 10px 6px 12px;
    color: inherit;
    text-decoration: none;
    white-space: nowrap;
    border-radius: 0;
    transition: background-color 0.1s;
}

td.nl-pivot-cell .nl-pivot-link:focus-visible {
    outline: 2px solid var(--nl-color-primary, #262766);
    outline-offset: -2px;
}

td.nl-pivot-cell .nl-pivot-methode {
    display: inline-block;
    font-family: ui-monospace, "SF Mono", "Cascadia Mono", "JetBrains Mono", Menlo, Consolas, monospace;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--nl-color-primary-dark, #1a1b4b);
    line-height: 1;
    padding: 3px 7px;
    background: #eef3f9;
    border-radius: 4px;
    letter-spacing: 0.01em;
}

td.nl-pivot-cell .nl-pivot-akkr {
    display: inline-block;
    margin-left: 8px;
    vertical-align: middle;
    width: 16px;
    height: 16px;
    line-height: 16px;
    background: var(--nl-color-io, #16a34a);
    color: #fff;
    border-radius: 50%;
    font-family: system-ui, -apple-system, sans-serif;
    font-size: 0.62rem;
    font-weight: 700;
    text-align: center;
    letter-spacing: 0;
    box-shadow: 0 0 0 2px #fff, 0 0 0 3px rgba(22, 163, 74, 0.25);
}

td.nl-pivot-cell .nl-pivot-multi {
    display: inline-block;
    margin-left: 6px;
    vertical-align: middle;
    padding: 2px 6px;
    background: var(--nl-color-primary-dark, #1a1b4b);
    color: #fff;
    border-radius: 10px;
    font-family: system-ui, -apple-system, sans-serif;
    font-size: 0.65rem;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0;
}

/* Status-Akzent links via inset-shadow */
td.nl-pivot-cell--gefuellt.nl-pivot-status-freigegeben {
    box-shadow: inset 3px 0 0 0 var(--nl-color-io, #16a34a);
}
td.nl-pivot-cell--gefuellt.nl-pivot-status-zurfreigabe {
    box-shadow: inset 3px 0 0 0 var(--nl-color-warn, #d97706);
    background: #fffaf2;
}
td.nl-pivot-cell--gefuellt.nl-pivot-status-entwurf {
    box-shadow: inset 3px 0 0 0 #9ca3af;
    background: #fafbfc;
}
td.nl-pivot-cell--gefuellt.nl-pivot-status-abgelehnt {
    box-shadow: inset 3px 0 0 0 var(--nl-color-nio, #dc2626);
    background: #fef5f5;
}
td.nl-pivot-cell--gefuellt.nl-pivot-status-archiviert {
    box-shadow: inset 3px 0 0 0 #d1d5db;
    color: #9ca3af;
}
td.nl-pivot-cell--gefuellt.nl-pivot-status-archiviert .nl-pivot-methode {
    background: #f3f4f6;
    color: #6b7280;
}

td.nl-pivot-cell--gefuellt:hover {
    background: #e8f0fb;
}
td.nl-pivot-cell--gefuellt:hover .nl-pivot-methode {
    background: #d6e6f7;
    color: var(--nl-color-primary, #262766);
}

/* Leere Zellen — Anlage-Button */
td.nl-pivot-cell--leer {
    background: #f8fafc;
    background-image: repeating-linear-gradient(
        45deg,
        transparent 0,
        transparent 8px,
        rgba(38, 39, 102, 0.025) 8px,
        rgba(38, 39, 102, 0.025) 9px
    );
}

td.nl-pivot-cell--leer .nl-pivot-link {
    color: #94a3b8;
    font-size: 0.95rem;
    font-weight: 700;
    line-height: 1;
}

td.nl-pivot-cell--leer .nl-pivot-plus {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: #fff;
    border: 1px dashed #cbd5e1;
    color: #94a3b8;
    font-size: 0.95rem;
    font-weight: 700;
    line-height: 1;
    transition: all 0.12s;
}

td.nl-pivot-cell--leer:hover {
    background: rgba(38, 39, 102, 0.08);
    background-image: none;
}

td.nl-pivot-cell--leer:hover .nl-pivot-plus {
    background: var(--nl-color-primary, #262766);
    border-color: var(--nl-color-primary, #262766);
    border-style: solid;
    color: #fff;
    transform: scale(1.08);
    box-shadow: 0 2px 6px rgba(38, 39, 102, 0.25);
}

/* Row-Hover highlightet die ganze Zeile */
table.nl-pivot tbody tr:hover > th.nl-pivot-rowhead {
    background: #eef3f9;
}
table.nl-pivot tbody tr:hover > th.nl-pivot-rowhead .nl-pivot-rowhead-kuerzel {
    color: var(--nl-color-primary, #262766);
}
table.nl-pivot tbody tr:hover > td.nl-pivot-cell--leer {
    background-color: #f0f6ff;
}

/* Status-Legende unter der Tabelle */
.nl-pivot-legende {
    display: flex;
    flex-wrap: wrap;
    gap: 14px 20px;
    padding: 10px 14px;
    margin-top: 8px;
    background: #fbfcfd;
    border: 1px solid #e6ebf2;
    border-radius: 6px;
    font-size: 0.72rem;
    color: #6b7280;
}

.nl-pivot-legende-item {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.nl-pivot-legende-swatch {
    display: inline-block;
    width: 3px;
    height: 14px;
    border-radius: 1px;
}

.nl-pivot-legende-akkr {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 14px;
    height: 14px;
    background: var(--nl-color-io, #16a34a);
    color: #fff;
    border-radius: 50%;
    font-size: 0.55rem;
    font-weight: 700;
}

@media (max-width: 900px) {
    th.nl-pivot-corner,
    th.nl-pivot-rowhead {
        min-width: 180px;
        max-width: 220px;
    }
    th.nl-pivot-colhead .nl-pivot-colhead-bez {
        display: none;
    }
}

/* ============================================================
   Spec-Cockpit (Grenzwertset-Pivot/Wirksamkeit/Vergleich)
   Visuell konsistent zum Mess-Pivot, aber mit eigenen Klassen
   nl-spec-* damit die Sichten unabhängig polishen können.
   ============================================================ */

.nl-spec-wrap {
    flex: 1;
    min-height: 0;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.nl-spec-shell {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
    min-width: 0;
}

/* ---------- Filter-Bar ---------- */
.nl-spec-filterbar {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 10px 12px;
    background: #f5f7fa;
    border: 1px solid #dde3ec;
    border-radius: 6px;
}

.nl-spec-filterbar-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
}

.nl-spec-filter-label {
    font-size: 0.72rem;
    font-weight: 600;
    color: #6b7280;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.nl-spec-filter-select {
    width: auto;
    min-width: 180px;
    max-width: 280px;
}

.nl-spec-active-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

.nl-spec-active-chip {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    background: rgba(38, 39, 102, 0.08);
    border: 1px solid rgba(38, 39, 102, 0.2);
    border-radius: 999px;
    font-size: 0.72rem;
    color: var(--nl-color-primary, #262766);
    font-weight: 500;
}

.nl-spec-active-chip--clear {
    background: transparent;
    border-color: transparent;
    color: #6b7280;
    cursor: pointer;
}

.nl-spec-active-chip--clear:hover {
    background: rgba(0, 0, 0, 0.05);
    color: #1f2937;
}

/* ---------- Spec-Matrix-Tabelle ---------- */
.nl-spec-scroll {
    flex: 1;
    overflow: auto;
    min-width: 0;
    border: 1px solid #dde3ec;
    border-radius: 6px;
    background: #fff;
    scrollbar-width: thin;
    scrollbar-color: #c4cbd6 transparent;
}

.nl-spec-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
.nl-spec-scroll::-webkit-scrollbar-thumb {
    background: #c4cbd6;
    border-radius: 4px;
    border: 2px solid #fff;
}

table.nl-spec-matrix {
    border-collapse: separate;
    border-spacing: 0;
    font-size: 0.82rem;
    margin: 0;
    width: max-content;
    color: #1f2937;
    font-variant-numeric: tabular-nums;
}

table.nl-spec-matrix th,
table.nl-spec-matrix td {
    margin: 0;
    padding: 0;
    background: #fff;
    border-right: 1px solid #e6ebf2;
    border-bottom: 1px solid #e6ebf2;
    box-sizing: border-box;
}

table.nl-spec-matrix tr > *:last-child { border-right: none; }
table.nl-spec-matrix tbody tr:last-child > * { border-bottom: none; }

/* Corner */
th.nl-spec-corner {
    position: sticky;
    top: 0;
    left: 0;
    z-index: 4;
    background: linear-gradient(180deg, #f5f7fa 0%, #eef1f6 100%);
    text-align: left;
    padding: 10px 14px;
    font-size: 0.72rem;
    font-weight: 600;
    color: #6b7280;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    min-width: 240px;
    box-shadow:
        2px 0 0 -1px #dde3ec,
        0 2px 0 -1px #dde3ec,
        4px 4px 8px -4px rgba(15, 48, 87, 0.12);
}

th.nl-spec-corner .nl-spec-corner-axis { color: #4b5563; }
th.nl-spec-corner .nl-spec-corner-arrow { color: #9ca3af; }

/* Set-Header (Spalten) */
th.nl-spec-colhead {
    position: sticky;
    top: 0;
    z-index: 3;
    background: linear-gradient(180deg, #f5f7fa 0%, #eef1f6 100%);
    text-align: center;
    padding: 8px 10px;
    min-width: 140px;
    max-width: 200px;
    box-shadow: 0 2px 0 -1px #dde3ec;
}

th.nl-spec-colhead .nl-spec-colhead-inner {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 3px;
}

th.nl-spec-colhead .nl-spec-set-kuerzel {
    font-family: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, monospace;
    font-size: 0.82rem;
    font-weight: 700;
    color: var(--nl-color-primary-dark, #1a1b4b);
}

th.nl-spec-colhead .nl-spec-set-bez {
    font-size: 0.68rem;
    font-weight: 400;
    color: #6b7280;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

th.nl-spec-colhead .nl-spec-set-meta {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 4px;
    margin-top: 2px;
}

.nl-spec-set-chip {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 1px 6px;
    border-radius: 999px;
    font-size: 0.62rem;
    font-weight: 600;
    background: #e5e7eb;
    color: #374151;
}

.nl-spec-set-version {
    display: inline-block;
    padding: 1px 5px;
    font-size: 0.62rem;
    font-family: ui-monospace, monospace;
    color: #6b7280;
    background: #f3f4f6;
    border-radius: 3px;
}

/* Geltungsbereich-Farben (für Chips + Border-Akzent oben) */
.nl-spec-geltung-kundenspezifisch { box-shadow: inset 0 3px 0 0 #7c3aed; }
.nl-spec-geltung-kundenspezifisch .nl-spec-set-chip,
.nl-spec-set-chip.nl-spec-geltung-kundenspezifisch { background: #ede9fe; color: #6d28d9; }
.nl-spec-geltung-artikelspezifisch { box-shadow: inset 0 3px 0 0 var(--nl-color-brand-mid, #5678b5); }
.nl-spec-geltung-artikelspezifisch .nl-spec-set-chip,
.nl-spec-set-chip.nl-spec-geltung-artikelspezifisch { background: #dbeafe; color: #1e3a8a; }
.nl-spec-geltung-regulatorisch { box-shadow: inset 0 3px 0 0 var(--nl-color-primary, #262766); }
.nl-spec-geltung-regulatorisch .nl-spec-set-chip,
.nl-spec-set-chip.nl-spec-geltung-regulatorisch { background: #e0e7ff; color: var(--nl-color-primary, #262766); }
.nl-spec-geltung-intern { box-shadow: inset 0 3px 0 0 #9ca3af; }
.nl-spec-geltung-intern .nl-spec-set-chip,
.nl-spec-set-chip.nl-spec-geltung-intern { background: #f3f4f6; color: #6b7280; }

/* Coverage-Streifen */
.nl-spec-coverage-strip {
    display: flex;
    align-items: center;
    gap: 5px;
    margin-top: 4px;
}

.nl-spec-coverage-bar {
    flex: 1;
    height: 4px;
    background: #e5e7eb;
    border-radius: 2px;
    overflow: hidden;
}

.nl-spec-coverage-bar-fill {
    height: 100%;
    background: var(--nl-color-io, #16a34a);
    transition: width 0.2s;
}

.nl-spec-coverage-text {
    font-size: 0.62rem;
    color: #6b7280;
    font-family: ui-monospace, monospace;
}

/* Prüfposition-Header (Zeilen) */
th.nl-spec-rowhead {
    position: sticky;
    left: 0;
    z-index: 2;
    background: #fbfcfd;
    text-align: left;
    font-weight: 500;
    padding: 8px 14px 8px 12px;
    min-width: 240px;
    max-width: 280px;
    box-shadow: 2px 0 0 -1px #dde3ec;
}

th.nl-spec-rowhead .nl-spec-pp-kuerzel {
    display: block;
    font-family: ui-monospace, monospace;
    font-size: 0.82rem;
    font-weight: 700;
    color: var(--nl-color-primary-dark, #1a1b4b);
}

th.nl-spec-rowhead .nl-spec-pp-sep { color: #9ca3af; }

th.nl-spec-rowhead .nl-spec-pp-bez {
    display: block;
    font-size: 0.7rem;
    color: #6b7280;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Daten-Zellen */
td.nl-spec-cell {
    text-align: center;
    min-width: 140px;
    height: 50px;
    padding: 0;
    transition: background-color 0.12s;
}

td.nl-spec-cell .nl-spec-link {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    padding: 6px 10px;
    color: inherit;
    text-decoration: none;
    white-space: nowrap;
}

td.nl-spec-cell--gefuellt .nl-spec-zelle-haupt {
    font-family: ui-monospace, monospace;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--nl-color-primary-dark, #1a1b4b);
    line-height: 1.15;
}

td.nl-spec-cell--gefuellt .nl-spec-zelle-aktion {
    font-family: ui-monospace, monospace;
    font-size: 0.66rem;
    color: var(--nl-color-warn, #d97706);
    margin-top: 2px;
}

td.nl-spec-cell--gefuellt:hover { background: #e8f0fb; }

/* Spezial-Typen */
.nl-spec-icon-formel,
.nl-spec-icon-aufz {
    font-size: 0.72rem;
    color: var(--nl-color-primary, #262766);
}

td.nl-spec-typ-formelbasiert .nl-spec-zelle-haupt,
td.nl-spec-typ-aufzaehlungswert .nl-spec-zelle-haupt {
    font-weight: 500;
    font-size: 0.74rem;
}

/* Leere Zellen */
td.nl-spec-cell--leer {
    background: #f8fafc;
    background-image: repeating-linear-gradient(
        45deg,
        transparent 0,
        transparent 8px,
        rgba(38, 39, 102, 0.025) 8px,
        rgba(38, 39, 102, 0.025) 9px
    );
}

td.nl-spec-cell--leer .nl-spec-plus {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: #fff;
    border: 1px dashed #cbd5e1;
    color: #94a3b8;
    font-size: 0.95rem;
    font-weight: 700;
    transition: all 0.12s;
}

td.nl-spec-cell--leer:hover { background: rgba(38, 39, 102, 0.08); background-image: none; }
td.nl-spec-cell--leer:hover .nl-spec-plus {
    background: var(--nl-color-primary, #262766);
    border-color: var(--nl-color-primary, #262766);
    border-style: solid;
    color: #fff;
    transform: scale(1.08);
}

/* Row-Hover */
table.nl-spec-matrix tbody tr:hover > th.nl-spec-rowhead {
    background: #eef3f9;
}
table.nl-spec-matrix tbody tr:hover > th.nl-spec-rowhead .nl-spec-pp-kuerzel {
    color: var(--nl-color-primary, #262766);
}

/* Legende */
.nl-spec-legende {
    display: flex;
    flex-wrap: wrap;
    gap: 12px 16px;
    padding: 10px 14px;
    margin-top: 8px;
    background: #fbfcfd;
    border: 1px solid #e6ebf2;
    border-radius: 6px;
    font-size: 0.72rem;
    color: #6b7280;
}

.nl-spec-legende-item {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.nl-spec-legende-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    font-weight: 700;
    font-size: 0.7rem;
}

/* ---------- Wirksamkeits-Tabelle ---------- */
.nl-spec-wirksam-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.85rem;
}

.nl-spec-wirksam-table thead th {
    text-align: left;
    padding: 8px 12px;
    background: #f5f7fa;
    border-bottom: 2px solid #dde3ec;
    font-size: 0.72rem;
    text-transform: uppercase;
    color: #6b7280;
    letter-spacing: 0.04em;
}

.nl-spec-wirksam-table tbody td {
    padding: 8px 12px;
    border-bottom: 1px solid #e6ebf2;
    vertical-align: top;
}

.nl-spec-wirksam-table tbody tr:hover { background: #f8fafc; }

.nl-spec-wirksam-hint {
    padding: 24px;
    text-align: center;
    color: #6b7280;
    background: #f8fafc;
    border: 1px dashed #cbd5e1;
    border-radius: 6px;
    margin-top: 12px;
}

.nl-spec-audit {
    margin-top: 14px;
    padding: 10px 14px;
    background: #fbfcfd;
    border: 1px solid #e6ebf2;
    border-radius: 6px;
    font-size: 0.82rem;
}

/* ---------- Vergleichs-Modus ---------- */
.nl-spec-vergleich-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    padding: 8px 12px;
    background: #eef3f9;
    border: 1px solid #dde3ec;
    border-radius: 6px;
}

.nl-spec-vergleich-chip {
    display: inline-flex;
    align-items: center;
    padding: 3px 10px;
    background: #fff;
    border: 1px solid #cbd5e1;
    border-radius: 999px;
    font-size: 0.78rem;
    cursor: pointer;
    transition: all 0.1s;
}

.nl-spec-vergleich-chip:hover {
    border-color: var(--nl-color-primary, #262766);
}

.nl-spec-vergleich-chip--aktiv {
    background: var(--nl-color-primary, #262766);
    border-color: var(--nl-color-primary, #262766);
    color: #fff;
}

.nl-spec-vergleich-chip--aktiv code { color: #fff; }

.nl-spec-vergleich-hint {
    padding: 24px;
    text-align: center;
    color: #6b7280;
    background: #f8fafc;
    border: 1px dashed #cbd5e1;
    border-radius: 6px;
    margin-top: 12px;
}

/* Diff-Zeilen */
table.nl-spec-diff-table tr.nl-spec-diff-row--gleich td.nl-spec-diff-marker { color: #9ca3af; }
table.nl-spec-diff-table tr.nl-spec-diff-row--luecke td.nl-spec-diff-marker { color: var(--nl-color-warn, #d97706); font-weight: 700; }
table.nl-spec-diff-table tr.nl-spec-diff-row--ungleich td.nl-spec-diff-marker { color: var(--nl-color-nio, #dc2626); font-weight: 700; }
table.nl-spec-diff-table tr.nl-spec-diff-row--ungleich { background: #fffaf2; }
table.nl-spec-diff-table tr.nl-spec-diff-row--luecke { background: #fef9c3; }

td.nl-spec-diff-marker {
    text-align: center;
    font-size: 1.1rem;
    width: 50px;
}

/* ---------- Plausibilitäts-Panel ---------- */
.nl-spec-plausi {
    padding: 12px 16px;
    background: #fef9c3;
    border: 1px solid #fde68a;
    border-radius: 6px;
}

.nl-spec-plausi-head {
    font-weight: 600;
    color: #854d0e;
    margin-bottom: 6px;
}

.nl-spec-plausi-list {
    margin: 0;
    padding-left: 18px;
    font-size: 0.82rem;
    color: #713f12;
}

.nl-spec-plausi-list li {
    margin-bottom: 3px;
}

/* Plausi-Toggle in der Filter-Bar — Default: dezent, aktiv: warn-gelb (passt zum Panel). */
.nl-spec-plausi-toggle {
    margin-left: auto;
    padding: 4px 10px;
    background: #fff;
    border: 1px solid #dde3ec;
    border-radius: 999px;
    font-size: 0.76rem;
    font-weight: 500;
    color: #4b5563;
    cursor: pointer;
    transition: background-color 0.12s, border-color 0.12s, color 0.12s;
    white-space: nowrap;
}

.nl-spec-plausi-toggle:hover {
    background: #f5f7fa;
    border-color: #c4cbd6;
}

.nl-spec-plausi-toggle--aktiv {
    background: #fef9c3;
    border-color: #fde68a;
    color: #854d0e;
}

.nl-spec-plausi-toggle--aktiv:hover {
    background: #fde68a;
}

/* =====================================================================
   CAPA / Nichtkonformitäten — Detail-Seite mit Tabs
   Sticky-Header, Tab-Indikatoren, Status-Strip, 5-Why-Treppe, Ishikawa-Grid.
   ===================================================================== */

.nl-nk-sticky-head {
    position: sticky;
    top: 0;
    z-index: 10;
    background: #fff;
    border-bottom: 1px solid #dde3ec;
    padding: 12px 16px 0;
    margin: -12px -16px 16px;
}

.nl-nk-head-row {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 16px;
    margin-bottom: 8px;
}

.nl-nk-head-main { flex: 1; min-width: 0; }
.nl-nk-head-eyebrow { font-size: 0.75rem; color: #6b7280; margin-bottom: 2px; }
.nl-nk-nummer { font-family: ui-monospace, monospace; color: var(--nl-color-primary, #262766); font-weight: 600; }
.nl-nk-offen-seit {
    background: #fef3c7;
    color: #854d0e;
    padding: 1px 8px;
    border-radius: 999px;
    font-size: 0.7rem;
    font-weight: 500;
    margin-left: 8px;
}
.nl-nk-titel { font-size: 1.3rem; font-weight: 600; margin: 0 0 6px 0; color: #1A1A2E; }
.nl-nk-head-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    font-size: 0.82rem;
    color: #4b5563;
}
.nl-nk-meta-sep { color: #d1d5db; }
.nl-nk-meta-item strong { color: #1A1A2E; font-weight: 500; }
.nl-nk-meta-overdue { color: #dc2626; }
.nl-nk-meta-overdue strong { color: #dc2626; }
.nl-nk-head-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.nl-nk-readonly-banner {
    background: linear-gradient(90deg, #fef9c3 0%, #f3f4f6 100%);
    border: 1px solid #fde68a;
    border-radius: 6px;
    padding: 8px 12px;
    margin: 8px 0;
    font-size: 0.85rem;
    color: #713f12;
}

.nl-schwere-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px 10px;
    border-radius: 999px;
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.nl-schwere-gering   { background: #d1fae5; color: #065f46; }
.nl-schwere-mittel   { background: #fef9c3; color: #854d0e; }
.nl-schwere-hoch     { background: #ffedd5; color: #9a3412; }
.nl-schwere-kritisch { background: #fee2e2; color: #991b1b; }

/* Schwere-Picker als Badge-Buttons im Neu-Dialog (analog Bewertungs-Badges) */
.nl-schwere-picker {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
}
.nl-schwere-pick {
    border: 2px solid transparent;
    border-radius: 999px;
    padding: 4px 14px;
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    cursor: pointer;
    opacity: 0.55;
    transition: opacity 0.12s, border-color 0.12s, transform 0.08s;
}
.nl-schwere-pick:hover { opacity: 0.85; }
.nl-schwere-pick.selected {
    opacity: 1;
    border-color: currentColor;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
}
.nl-schwere-pick:focus-visible {
    outline: 2px solid var(--nl-color-primary);
    outline-offset: 2px;
}

/* Nichtkonformitaets-Status — eigener Namespace, damit generische Namen wie "offen"
   nicht mit den Proben-/Auftrags-Status-Klassen (nl-status-offen, navy, weiter oben) kollidieren.
   W4 Paket 1b (Funktionsaudit 2026-07-14): von fest codierten Hex-Werten auf --nl-*-Tokens
   umgestellt (CLAUDE.md-Verstoss "keine hardgecodeten Farben") und Farbsemantik an die
   etablierte io/warn/nio/nb-Ampel-Logik angeglichen (deckungsgleich mit dem NkStatusClass-
   Mapping in EndproduktchargeDetail.razor: Offen=nio, InBearbeitung=warn,
   MassnahmenLaufen=info, Geschlossen=io, Verworfen=nb). NichtkonformitaetenListe.razor nutzt
   dieselben Klassen (vorher ein zweites, rohes bg-*-Bootstrap-System). */
.nl-nk-status-offen            { background: var(--nl-color-nio); color: #fff; }
.nl-nk-status-inbearbeitung    { background: var(--nl-color-warn); color: var(--nl-color-text-primary, #1A1A2E); }
.nl-nk-status-massnahmenlaufen { background: var(--nl-color-info-strong); color: #fff; }
.nl-nk-status-geschlossen      { background: var(--nl-color-io); color: #fff; }
.nl-nk-status-verworfen        { background: var(--nl-color-nb); color: #fff; }

.nl-nk-tabs {
    display: flex;
    gap: 4px;
    border-bottom: 1px solid #dde3ec;
    margin-top: 4px;
}
.nl-nk-tabs .nl-tab {
    background: transparent;
    border: none;
    border-bottom: 2px solid transparent;
    padding: 8px 14px;
    color: #6b7280;
    font-size: 0.88rem;
    cursor: pointer;
    transition: color 0.12s, border-color 0.12s;
    margin-bottom: -1px;
    display: inline-flex;
    align-items: center;
    gap: 6px;
}
.nl-nk-tabs .nl-tab:hover { color: #1A1A2E; }
.nl-nk-tabs .nl-tab.active {
    color: var(--nl-color-primary, #262766);
    border-bottom-color: var(--nl-color-primary, #262766);
    font-weight: 500;
}
.nl-tabs-secondary {
    display: flex;
    gap: 4px;
    border-bottom: 1px solid #e6ebf2;
}
.nl-tabs-secondary .nl-tab {
    background: transparent;
    border: none;
    border-bottom: 2px solid transparent;
    padding: 6px 12px;
    color: #6b7280;
    font-size: 0.82rem;
    cursor: pointer;
    margin-bottom: -1px;
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.nl-tabs-secondary .nl-tab.active {
    color: var(--nl-color-primary, #262766);
    border-bottom-color: var(--nl-color-primary, #262766);
    font-weight: 500;
}
.nl-tab-dot { width: 8px; height: 8px; background: var(--nl-color-primary, #262766); border-radius: 50%; display: inline-block; }
.nl-tab-count {
    background: #e6ebf2;
    color: #4b5563;
    padding: 1px 6px;
    border-radius: 999px;
    font-size: 0.7rem;
    font-weight: 600;
}
.nl-tab-count--alert { background: #fee2e2; color: #991b1b; }
.nl-tab-check { color: #16A34A; font-weight: 600; }
.nl-nk-tab-content { padding-top: 8px; }

.nl-massnahmen-table tbody tr.nl-massnahme-overdue {
    border-left: 3px solid #dc2626;
}
.nl-massnahmen-table tbody tr.nl-massnahme-overdue td:first-child { padding-left: 8px; }

.nl-verantw-intern { display: inline-flex; align-items: center; gap: 6px; font-size: 0.85rem; }
.nl-verantw-avatar {
    background: var(--nl-color-primary, #262766);
    color: #fff;
    font-weight: 600;
    font-size: 0.7rem;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.nl-verantw-extern {
    display: inline-block;
    background: #F5F7FA;
    border: 1px dashed #c4cbd6;
    border-radius: 4px;
    padding: 2px 8px;
    font-style: italic;
    font-size: 0.85rem;
}
.nl-extern-block {
    background: #f9fafb;
    border: 1px solid #e6ebf2;
    border-radius: 6px;
    padding: 8px 12px;
}
.nl-extern-block summary { cursor: pointer; font-weight: 500; list-style: revert; }

.nl-why-stairs { display: flex; flex-direction: column; gap: 12px; }
.nl-why-step {
    background: #fff;
    border: 1px solid #dde3ec;
    border-radius: 6px;
    padding: 10px 14px;
    display: flex;
    gap: 12px;
    position: relative;
}
.nl-why-step::before {
    content: "↓ Warum?";
    position: absolute;
    top: -16px;
    left: 24px;
    color: #6b7280;
    font-size: 0.7rem;
    font-weight: 500;
    letter-spacing: 0.04em;
}
.nl-why-step:first-child::before { content: ""; }
.nl-why-step--root {
    border-color: #16A34A;
    background: #f0fdf4;
}
.nl-why-step--root::after {
    content: "🎯 Hauptursache";
    position: absolute;
    top: 8px;
    right: 12px;
    color: #166534;
    font-size: 0.72rem;
    font-weight: 600;
}
.nl-why-step-num {
    background: var(--nl-color-primary, #262766);
    color: #fff;
    font-weight: 700;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.85rem;
    flex-shrink: 0;
}
.nl-why-step-body { flex: 1; }
.nl-why-step-frage { font-size: 0.78rem; color: #6b7280; margin-bottom: 4px; }
.nl-why-step-antwort {
    border: none;
    background: transparent;
    padding: 0;
    font-size: 0.92rem;
    color: #1A1A2E;
    resize: vertical;
    width: 100%;
}
.nl-why-step-antwort:focus {
    outline: 2px solid var(--nl-color-primary, #262766);
    outline-offset: 2px;
    background: #fff;
}
.nl-why-step-actions { margin-top: 4px; display: flex; justify-content: flex-end; gap: 4px; }
.nl-why-step-frage-input {
    border: 1px solid transparent;
    background: transparent;
    font-size: 0.78rem;
    color: #6b7280;
    font-weight: 500;
    padding: 2px 4px;
}
.nl-why-step-frage-input:hover {
    border-color: #e6ebf2;
    background: #fff;
}
.nl-why-step-frage-input:focus {
    outline: 2px solid var(--nl-color-primary, #262766);
    outline-offset: 2px;
    background: #fff;
    color: #1A1A2E;
}

.nl-why-step-add {
    border: 2px dashed #c4cbd6;
    border-radius: 6px;
    padding: 8px 12px;
    background: #fafbfc;
}
.nl-why-step-frage-preview {
    font-size: 0.78rem;
    color: #6b7280;
    font-weight: 500;
    margin-bottom: 4px;
}

.nl-why-rootcheck {
    background: #fef9c3;
    border-left: 3px solid var(--nl-color-warn, #fbbc3a);
    border-radius: 4px;
    padding: 8px 12px;
    font-size: 0.82rem;
    color: #713f12;
    margin: 8px 0;
}

.nl-ishikawa-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 12px;
}
@media (max-width: 1100px) {
    .nl-ishikawa-grid { grid-template-columns: repeat(2, 1fr); }
}
.nl-ishikawa-card {
    background: #fff;
    border: 1px solid #dde3ec;
    border-radius: 8px;
    border-top: 3px solid var(--nl-color-primary, #262766);
    padding: 10px 12px;
    display: flex;
    flex-direction: column;
    min-height: 140px;
}
.nl-ishikawa-cat-0 { border-top-color: #7C3AED; }
.nl-ishikawa-cat-1 { border-top-color: #DC2626; }
.nl-ishikawa-cat-2 { border-top-color: var(--nl-color-primary-light, #5678b5); }
.nl-ishikawa-cat-3 { border-top-color: var(--nl-color-warn, #fbbc3a); }
.nl-ishikawa-cat-4 { border-top-color: #16A34A; }
.nl-ishikawa-cat-5 { border-top-color: var(--nl-color-primary, #262766); }
.nl-ishikawa-card-head {
    display: flex;
    justify-content: space-between;
    font-size: 0.74rem;
    letter-spacing: 0.06em;
    color: #4b5563;
    margin-bottom: 8px;
}
.nl-ishikawa-count {
    background: #e6ebf2;
    color: #4b5563;
    padding: 0 6px;
    border-radius: 999px;
    font-size: 0.7rem;
}
.nl-ishikawa-list { list-style: none; padding: 0; margin: 0; flex: 1; display: flex; flex-direction: column; gap: 4px; }
.nl-ishikawa-item {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    font-size: 0.85rem;
    padding: 2px 4px;
    border-radius: 3px;
    transition: background-color 0.1s;
}
.nl-ishikawa-item:hover { background: #f5f7fa; }
.nl-ishikawa-item--root {
    background: #f0fdf4;
    border-left: 3px solid #16A34A;
    padding-left: 6px;
}
.nl-ishikawa-item--sub {
    padding-left: 18px;
    font-size: 0.8rem;
    color: #4b5563;
}
.nl-ishikawa-item--sub-input {
    padding-left: 18px;
}
.nl-ishikawa-sub-bullet {
    color: #9ca3af;
    font-family: ui-monospace, monospace;
    font-size: 0.85em;
}
.nl-ishikawa-bullet { color: #6b7280; }
.nl-ishikawa-text { cursor: pointer; flex: 1; }
.nl-ishikawa-actions { opacity: 0; transition: opacity 0.12s; display: flex; gap: 4px; }
.nl-ishikawa-item:hover .nl-ishikawa-actions { opacity: 1; }
.nl-ishikawa-add { margin-top: 8px; border-top: 1px dashed #e6ebf2; padding-top: 8px; }

.nl-anhang-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: 12px;
}
.nl-anhang-card {
    background: #fff;
    border: 1px solid #dde3ec;
    border-radius: 6px;
    padding: 8px;
    position: relative;
    cursor: pointer;
    transition: box-shadow 0.12s, transform 0.12s;
}
.nl-anhang-card:hover {
    box-shadow: 0 2px 8px rgba(15, 48, 87, 0.12);
    transform: translateY(-1px);
}
.nl-anhang-thumb {
    width: 100%;
    aspect-ratio: 4 / 3;
    background: #f5f7fa;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 6px;
    font-weight: 700;
    color: #4b5563;
    font-size: 0.85rem;
}
.nl-anhang-thumb--image { background: linear-gradient(135deg, #e0f2fe, #bae6fd); color: #075985; }
.nl-anhang-thumb--pdf { background: linear-gradient(135deg, #fee2e2, #fecaca); color: #991b1b; }
.nl-anhang-thumb--generic { background: #f5f7fa; color: #6b7280; }
.nl-anhang-typlabel { font-size: 0.72rem; letter-spacing: 0.1em; }
.nl-anhang-name {
    font-size: 0.82rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nl-anhang-delete {
    position: absolute;
    top: 4px;
    right: 4px;
    opacity: 0;
    transition: opacity 0.12s;
}
.nl-anhang-card:hover .nl-anhang-delete { opacity: 1; }

.nl-audit-table small { font-size: 0.78rem; }

.nl-section-title-xs {
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #6b7280;
    margin: 0 0 6px 0;
}
.nl-card-empty { background: #fafbfc; border-style: dashed; }
.nl-card-accent-primary { border-left: 3px solid var(--nl-color-primary, #262766); padding-left: 14px; }
.nl-card-accent-warn { border-left: 3px solid var(--nl-color-warn, #fbbc3a); padding-left: 14px; }

/* Übersicht-Tab: kein Vertical-Stretch zwischen Cards-Spalte und Sidebar */
.nl-uebersicht-grid {
    align-items: start;
}

/* Feature-Inaktiv-Banner für gesperrte Zusatzmodule (z. B. QS, HACCP, Charge-Traceability) */
.nl-feature-inaktiv-banner {
    display: flex;
    gap: 20px;
    align-items: flex-start;
    background: linear-gradient(135deg, #f9fafb 0%, #f3f4f6 100%);
    border: 1px solid #dde3ec;
    border-radius: 10px;
    padding: 24px 28px;
    max-width: 720px;
    margin: 24px auto;
}
.nl-feature-inaktiv-icon {
    color: #9ca3af;
    flex-shrink: 0;
}
.nl-feature-inaktiv-body { flex: 1; min-width: 0; }
.nl-feature-inaktiv-title {
    font-size: 1.2rem;
    font-weight: 600;
    margin: 0 0 6px 0;
    color: #1A1A2E;
}
.nl-feature-inaktiv-text {
    color: #4b5563;
    margin-bottom: 14px;
    line-height: 1.5;
}
.nl-feature-inaktiv-actions {
    display: flex;
    gap: 8px;
    align-items: center;
}

/* App-weite ErrorBoundary-Fallback-Karte (MainLayout, Welle 3 Audit-Fix) — faengt
   Rendering-/Lifecycle-Exceptions einzelner Seiten ab, ohne den Circuit abzureissen.
   Nur Tokens, keine hardcodierten Hex-Werte (im Gegensatz zum aelteren nl-feature-inaktiv-* Block). */
.nl-error-boundary {
    display: flex;
    gap: 20px;
    align-items: flex-start;
    background: var(--nl-color-bg-card);
    border: 1px solid var(--nl-color-border-card);
    border-left: 4px solid var(--nl-color-nio);
    border-radius: var(--nl-radius-lg);
    box-shadow: var(--nl-shadow-md);
    padding: 24px 28px;
    max-width: 720px;
    margin: 24px auto;
}
.nl-error-boundary-icon {
    color: var(--nl-color-nio);
    flex-shrink: 0;
}
.nl-error-boundary-body { flex: 1; min-width: 0; }
.nl-error-boundary-title {
    font-size: var(--nl-font-size-lg);
    font-weight: 600;
    margin: 0 0 6px 0;
    color: var(--nl-color-text-primary);
}
.nl-error-boundary-text {
    color: var(--nl-color-text-secondary);
    margin-bottom: 14px;
    line-height: 1.5;
}
.nl-error-boundary-actions {
    display: flex;
    gap: 8px;
    align-items: center;
}

/* Compliance-Profil-Badge */
.nl-compliance-badge {
    display: inline-flex;
    align-items: center;
    padding: 4px 12px;
    border-radius: 999px;
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.04em;
}
.nl-compliance-standard { background: #e6ebf2; color: #4b5563; }
.nl-compliance-haccp    { background: #fef9c3; color: #854d0e; }
.nl-compliance-pharma   { background: #fee2e2; color: #991b1b; }
/* R2 (Gesamtanalyse 2026-07-13): Akkreditiert (ISO 17025) — Klassenname folgt
   ComplianceProfil.AkkreditiertIso17025.ToString().ToLowerInvariant() */
.nl-compliance-akkreditiertiso17025 { background: #dbeafe; color: #1e40af; }

/* Inline-Toggle für CAPA-Auto-Trigger (Per-Entität-Override) */
.nl-capa-toggle-card {
    background: #f9fafb;
    border: 1px solid #e6ebf2;
    border-left: 3px solid var(--nl-color-primary, #262766);
    border-radius: 6px;
    padding: 12px 14px;
    margin-top: 12px;
}
.nl-capa-toggle-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 6px;
}

/* Zonen-Trigger-Liste (CapaTriggerConfigPage, Tab "NIO Hygiene-Zone") — vier Zeilen,
   eine je HygieneZone, analog .nl-capa-toggle-card aber ohne Primary-Akzent (die
   Zonen-Farbe kommt bereits über das .nl-zone-badge in der Zeile). */
.nl-zone-trigger-list {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.nl-zone-trigger-row {
    background: var(--nl-color-surface-subtle);
    border: 1px solid var(--nl-color-border-default);
    border-radius: 6px;
    padding: 12px 14px;
}

/* Trend-/Wiederholungs-Banner im NK-Detail */
.nl-trend-banner {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    background: #fef3c7;
    border: 1px solid #fbbf24;
    border-radius: 6px;
    padding: 12px 16px;
    margin-bottom: 12px;
}
.nl-trend-banner-icon {
    font-size: 1.5rem;
    color: #b45309;
    flex-shrink: 0;
}
.nl-trend-banner em { font-style: normal; font-weight: 500; }
.nl-trend-banner-details summary { cursor: pointer; }

/* =====================================================================
   [QT-01 / QT-03] Seiten-Wrapper-Standard & Vollhöhen-Helfer
   Layout-P0 — 2026-05-25

   nl-page-full-height: ersetzt dreifach dupliziertes
   `height: calc(100vh - 48px); min-height: 0; overflow: hidden;`
   in AuftragListe, ProbenListe, HaccpPlan.
   Der Wert 104px = Topbar 56px + Content-Padding-top 24px + -bottom 24px.
   Bei Topbar-Höhen-Änderung NUR hier anpassen.

   nl-card-fill: ersetzt `flex: 1 1 auto; min-height: 0; display:flex;
   flex-direction:column;` — lässt eine Card den Restplatz eines
   flex-column-Elternelements ausfüllen (Probenbaum-Card, Grid-Card).
   ===================================================================== */
.nl-page-full-height {
    height: calc(100vh - 104px);
    min-height: 0;
    overflow: hidden;
}

.nl-card-fill {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

/* =====================================================================
   [LAY-17] NK-Badges: Farbsemantik Nichtkonformitäten-Liste
   Mapping laut LIMS-Auflage: offen=nb, kritisch & offen=warn, überfällig=nio.
   Die Klassen erweitern nl-bewertungs-badge (immer kombiniert verwenden).
   ===================================================================== */
/* Hinweis: nl-badge-nb, nl-badge-warn, nl-badge-nio sind bereits oben in
   app.css definiert (Zeile ~204). Dieser Kommentar dokumentiert das
   semantische Mapping für die NK-Liste:
     offen            → nl-bewertungs-badge nl-badge-nb
     kritisch & offen → nl-bewertungs-badge nl-badge-warn
     überfällig       → nl-bewertungs-badge nl-badge-nio
   Kein neuer CSS nötig — die Klassen existieren bereits. */

/* =====================================================================
   [LAY-07] Freigabe-Queue — Grid-Variante + Bestätigungs-Dialog
   Layout-P0 — 2026-05-25
   ===================================================================== */

/* Grid-Tabelle für die Freigabe-Queue.
   Spaltenreihenfolge: Datensatz | Typ | Version | Ersteller | Wartedauer | Aktion
   Responsive: ab < 900px Typ+Version zusammenklappen. */
.nl-freigabe-grid-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--nl-font-size-sm);
    table-layout: fixed;
}

.nl-freigabe-grid-table thead th {
    text-align: left;
    font-size: 10.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--nl-color-text-secondary);
    padding: 8px 12px;
    border-bottom: 2px solid var(--nl-color-border-default);
    background: var(--nl-color-bg);
    position: sticky;
    top: 0;
    z-index: 1;
}

.nl-freigabe-grid-table tbody td {
    padding: 10px 12px;
    vertical-align: middle;
    border-bottom: 1px solid var(--nl-color-border-default);
    color: var(--nl-color-text-primary);
}

.nl-freigabe-grid-table tbody tr:last-child td {
    border-bottom: none;
}

.nl-freigabe-grid-table tbody tr:hover {
    background: var(--nl-color-surface-hover);
}

/* Eigener Antrag — nicht freigebbar (4-Augen-Sperrzustand).
   Visuell stark unterscheidbar: gelber linker Streifen + getönter Hintergrund.
   Nicht nur Text-Farbe — eigene Zeilen-Klasse. */
.nl-freigabe-grid-table tbody tr.nl-freigabe-row-own {
    background: #FFFBF5;
    border-left: 3px solid var(--nl-color-warn, #fbbc3a);
}

.nl-freigabe-grid-table tbody tr.nl-freigabe-row-own:hover {
    background: #FFF7E8;
}

/* Badge für den gesperrten Selbst-Antrag-Zustand.
   Ersetzt orange Text durch einen klar lesbaren Badge mit Icon-Platz. */
.nl-badge-selbst-antrag {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 8px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    background: rgba(217, 119, 6, 0.12);
    color: #92400E;
    border: 1px solid rgba(217, 119, 6, 0.30);
    white-space: nowrap;
}

/* Spaltenbreiten: Datensatz bekommt den meisten Platz */
.nl-freigabe-grid-col-datensatz  { width: 30%; }
.nl-freigabe-grid-col-typ        { width: 14%; }
.nl-freigabe-grid-col-version    { width: 8%; }
.nl-freigabe-grid-col-ersteller  { width: 18%; }
.nl-freigabe-grid-col-wartezeit  { width: 12%; }
.nl-freigabe-grid-col-aktion     { width: 18%; text-align: right; }

.nl-freigabe-grid-table thead th.nl-freigabe-grid-col-aktion {
    text-align: right;
}

/* Wartedauer: farbliche Eskalation (0-2 Tage=normal, 3-7=warn, >7=nio) */
.nl-freigabe-wartezeit-normal { color: var(--nl-color-text-secondary); }
.nl-freigabe-wartezeit-warn   { color: var(--nl-color-warn); font-weight: 600; }
.nl-freigabe-wartezeit-kritisch { color: var(--nl-color-nio); font-weight: 700; }

/* Aktions-Zelle: Buttons kompakt nebeneinander */
.nl-freigabe-grid-aktionen {
    display: flex;
    align-items: center;
    gap: 6px;
    justify-content: flex-end;
}

/* =====================================================================
   [LAY-07 Option B] Bestätigungs-Dialog vor Freigabe-Aktion
   DxPopup-Inhalt. Breite: nl-popup-md (500px).
   ===================================================================== */

/* Diff-Block im Bestätigungs-Dialog — kompaktere Darstellung als nl-freigabe-diff */
.nl-freigabe-confirm-diff {
    background: var(--nl-color-bg);
    border: 1px solid var(--nl-color-border-default);
    border-radius: var(--nl-radius-md);
    padding: 12px 14px;
    font-size: var(--nl-font-size-sm);
    max-height: 240px;
    overflow-y: auto;
}

.nl-freigabe-confirm-diff-leer {
    color: var(--nl-color-text-secondary);
    font-style: italic;
    font-size: var(--nl-font-size-sm);
}

/* Pflicht-Checkbox-Zeile (Bestätigung "Ich habe gelesen") */
.nl-freigabe-confirm-check {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 12px 14px;
    background: rgba(38, 39, 102, 0.04);
    border: 1px solid rgba(38, 39, 102, 0.12);
    border-radius: var(--nl-radius-md);
    cursor: pointer;
}

.nl-freigabe-confirm-check input[type="checkbox"] {
    margin-top: 2px;
    flex-shrink: 0;
    width: 16px;
    height: 16px;
    accent-color: var(--nl-color-primary);
}

.nl-freigabe-confirm-check-label {
    font-size: var(--nl-font-size-sm);
    font-weight: 500;
    color: var(--nl-color-text-primary);
    line-height: 1.45;
    cursor: pointer;
}

/* Footer des Bestätigungs-Dialogs: Abbrechen links, Freigeben rechts.
   Freigeben-Button ist disabled bis Checkbox gesetzt. */
.nl-freigabe-confirm-footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 8px;
    padding-top: 14px;
    border-top: 1px solid var(--nl-color-border-default);
    margin-top: 4px;
}

/* =====================================================================
   [LAY-11] ProbeDetail — Sticky-Kopf (nl-probe-kopf)
   OBSOLET 2026-05-25 (P4-Revision): Block aus ProbeDetail.razor entfernt.
   Die 6 ISO-Pflichtfelder sind jetzt im erweiterten nl-form-page-head sichtbar.
   CSS-Klassen werden noch behalten (Snapshots/Logs), Cleanup in separatem Sprint.

   Genau 6 Pflichtfelder (ISO 17025 §7.4/§7.5):
     Proben-ID | Probentyp (Badge) | Matrix | Status | Probenahme-Datum | Auftragsnummer
   Sticky unter dem App-Topbar (top: 56px).
   Max. 2 Zeilen — bei kleinen Viewports Felder umbrechen.
   ===================================================================== */
.nl-probe-kopf {
    position: sticky;
    top: 56px;
    z-index: 25;
    background: var(--nl-color-bg-card);
    border-bottom: 1px solid var(--nl-color-border-default);
    box-shadow: 0 2px 6px rgba(15, 48, 87, 0.07);
    padding: 10px 20px;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px 20px;
}

/* Trennzeichen zwischen den 6 Feldern */
.nl-probe-kopf-sep {
    color: var(--nl-color-border-card);
    font-size: 1rem;
    user-select: none;
    flex-shrink: 0;
}

/* Einzelnes Feld: Label oben, Wert unten */
.nl-probe-kopf-field {
    display: flex;
    flex-direction: column;
    gap: 1px;
    flex-shrink: 0;
}

.nl-probe-kopf-label {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.07em;
    color: var(--nl-color-text-secondary);
    line-height: 1;
}

.nl-probe-kopf-value {
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-primary);
    line-height: 1.3;
    white-space: nowrap;
}

/* Proben-ID ist breiter + Monospace (klare Identifikation) */
.nl-probe-kopf-field--id .nl-probe-kopf-value {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-size: var(--nl-font-size-base);
    font-weight: 700;
    color: var(--nl-color-primary);
}

/* Auftragsnummer-Link im Kopf */
.nl-probe-kopf-field--auftrag .nl-probe-kopf-value a {
    color: var(--nl-color-primary);
    text-decoration: none;
    font-weight: 600;
}
.nl-probe-kopf-field--auftrag .nl-probe-kopf-value a:hover {
    text-decoration: underline;
}

/* Probentyp-Badge im Kopf — identische Farbsemantik wie Probenliste.
   Nutzt nl-probe-typ-* Klassen für die farbige Linke Kante.
   Badge ist etwas kompakter als im Grid (probe-kopf-Kontext). */
.nl-probe-kopf-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 8px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    border: 1px solid rgba(15, 48, 87, 0.12);
    background: var(--nl-color-bg);
    color: var(--nl-color-text-primary);
}

/* Probentyp-Farben für den Kopf-Badge (gleiche Token wie Probenliste) */
.nl-probe-kopf-badge.nl-probe-typ-original         { color: var(--nl-color-probe-original); border-color: rgba(38, 39, 102, 0.25); }
.nl-probe-kopf-badge.nl-probe-typ-teilung          { color: var(--nl-color-probe-teilung); border-color: rgba(124, 58, 237, 0.25); }
.nl-probe-kopf-badge.nl-probe-typ-nachuntersuchung { color: var(--nl-color-probe-nachuntersuchung); border-color: rgba(8, 145, 178, 0.25); }
.nl-probe-kopf-badge.nl-probe-typ-rueckstellprobe  { color: var(--nl-color-probe-rueckstellprobe); border-color: rgba(146, 64, 14, 0.25); }
.nl-probe-kopf-badge.nl-probe-typ-blindwert        { color: var(--nl-color-probe-blindwert); border-color: rgba(55, 65, 81, 0.25); }
.nl-probe-kopf-badge.nl-probe-typ-duplikat         { color: var(--nl-color-probe-duplikat); border-color: rgba(6, 95, 70, 0.25); }

/* =====================================================================
   [LAY-10] ProbeDetail — Sticky Ergebnistabellen-Header: ENTFERNT 2026-05-25.
   Das page-relative position:sticky auf den DxGrid-Header-th kollidierte mit der
   DxGrid-eigenen Header-Struktur (zusammen mit VirtualScrolling) unter dem
   .nl-ergebnis-grid-Seiten-Scroll-Modell (overflow:visible/height:auto) → der
   Spaltenkopf landete mitten im Grid. Header rendert jetzt korrekt am Grid-Anfang.
   Ein mitscrollender Kopf bräuchte ein Grid-internes Scroll-Viewport (festes
   Height) statt Seiten-Scroll — bewusst zurückgestellt (separate Aufgabe).
   ===================================================================== */
:root {
    --nl-probe-kopf-hoehe: 58px;
}

/* =====================================================================
   [P6] Probenliste — Prüfumfang-Chips in der Aggregat-Spalte.
   Verwendet CSS-Variablen statt hardcodierter Farben.
   ===================================================================== */
.nl-probe-umfang-chips {
    display: flex;
    align-items: center;
    gap: 4px;
    flex-wrap: nowrap;
    overflow: hidden;
}

.nl-probe-umfang-chip {
    display: inline-flex;
    align-items: center;
    padding: 1px 8px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs, 11px);
    font-weight: 600;
    background: #EFF6FF;
    color: var(--nl-color-primary);
    border: 1px solid #BFDBFE;
    white-space: nowrap;
    max-width: 120px;
    overflow: hidden;
    text-overflow: ellipsis;
}

.nl-probe-umfang-more {
    font-size: var(--nl-font-size-xs, 11px);
    color: var(--nl-color-text-secondary);
    white-space: nowrap;
    font-weight: 500;
}

/* =====================================================================
   [A-10] ProbenanlageWizard — Modus-Selector, Vorbelegungs-Tokens,
   Hint-Chips, Wizard-Sektionen.
   Alle Werte: ausschliesslich CSS-Variablen; kein hardcodiertes Hex.
   ===================================================================== */

/* Design-Tokens: Vorbelegung (leichter Primär-Hint) */
:root {
    --nl-color-prefilled-bg:     color-mix(in srgb, var(--nl-color-secondary) 8%, transparent);
    --nl-color-prefilled-fg:     var(--nl-color-primary);
    --nl-color-prefilled-border: color-mix(in srgb, var(--nl-color-secondary) 30%, transparent);
}

/* --- Modus-Selector (3-Button Segment) --------------------------------
   Horizontale Toggle-Gruppe. Aktiver Modus: Primär-Hintergrund, weisser
   Text. Deaktiviert: ausgegraut + cursor:not-allowed.
   Fokus-Ring WCAG 2.1 §2.4.7: 2px solid primary, innerhalb der Gruppe.
   --------------------------------------------------------------------- */
.nl-mode-selector {
    display: inline-flex;
    border: 1px solid var(--nl-color-secondary);
    border-radius: var(--nl-radius-sm);
    overflow: hidden;
    margin-bottom: 16px;
    width: 100%;
}

.nl-mode-selector-btn {
    flex: 1;
    padding: 6px 16px;
    height: 36px;
    font-size: var(--nl-font-size-sm);
    font-weight: 500;
    background: transparent;
    border: none;
    border-right: 1px solid var(--nl-color-secondary);
    color: var(--nl-color-text-secondary);
    cursor: pointer;
    transition: background 0.12s ease, color 0.12s ease;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    line-height: 1;
}

.nl-mode-selector-btn:last-child {
    border-right: none;
}

.nl-mode-selector-btn.is-active {
    background: var(--nl-color-primary);
    color: var(--nl-color-text-inverted);
}

.nl-mode-selector-btn:hover:not(.is-active):not(:disabled) {
    background: var(--nl-color-surface-hover);
    color: var(--nl-color-primary);
}

.nl-mode-selector-btn:disabled {
    opacity: 0.45;
    cursor: not-allowed;
    color: var(--nl-color-text-secondary);
}

.nl-mode-selector-btn:focus-visible {
    outline: 2px solid var(--nl-color-primary);
    outline-offset: -2px;
    position: relative;
    z-index: 1;
}

/* --- Vorbelegungs-Feld-Markierung (nl-field-prefilled) -----------------
   Leichter Hintergrund + linke Borderline auf dem umgebenden Container.
   Bei Fokus innerhalb: Hint zuruecktreten lassen (opacity, kein Layout).
   --------------------------------------------------------------------- */
.nl-field-prefilled {
    background: var(--nl-color-prefilled-bg);
    border-left: 3px solid var(--nl-color-prefilled-border);
    border-radius: 0 var(--nl-radius-sm) var(--nl-radius-sm) 0;
    padding-left: 8px;
    transition: border-color 0.15s ease, background 0.15s ease;
}

.nl-field-prefilled:focus-within {
    border-left-color: color-mix(in srgb, var(--nl-color-prefilled-border) 40%, transparent);
    background: transparent;
}

/* --- Vorbelegungs-Hint-Chip (nl-form-hint-auto) -----------------------
   Klein (11px), inline-block. Punkt-Prafix per ::before, kein Icon-Only
   (WCAG 1.4.1: kein reines Farb-Coding). Subtile Sekundaerfarbe.
   --------------------------------------------------------------------- */
.nl-form-hint-auto {
    display: flex;
    align-items: center;
    gap: 4px;
    color: var(--nl-color-secondary);
    font-size: 11px;
    font-weight: 400;
    margin-top: 2px;
    line-height: 1.4;
}

.nl-form-hint-auto::before {
    content: '';
    display: inline-block;
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--nl-color-secondary);
    flex-shrink: 0;
}

/* --- Wizard-Sektionen (nl-wizard-section) ------------------------------
   Subtile Kopfzeile, 8px Gap zwischen Header und Inhalt.
   --------------------------------------------------------------------- */
.nl-wizard-section {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.nl-wizard-section-header {
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.06em;
}

/* Auftrag-Kontext-Kopf (ausgeklappt wenn AuftragId gesetzt) */
.nl-wizard-auftrag-kopf {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    background: var(--nl-color-surface-subtle);
    border: 1px solid var(--nl-color-border-default);
    border-radius: var(--nl-radius-sm);
    font-size: var(--nl-font-size-sm);
    margin-bottom: 4px;
}

.nl-wizard-auftrag-kopf-label {
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-xs);
    white-space: nowrap;
}

.nl-wizard-auftrag-kopf-wert {
    font-weight: 600;
    color: var(--nl-color-text-primary);
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nl-wizard-auftrag-kopf-clear {
    background: none;
    border: none;
    padding: 2px 6px;
    border-radius: 4px;
    color: var(--nl-color-text-secondary);
    cursor: pointer;
    font-size: 14px;
    line-height: 1;
    transition: color 0.12s, background 0.12s;
}

.nl-wizard-auftrag-kopf-clear:hover {
    color: var(--nl-color-nio);
    background: color-mix(in srgb, var(--nl-color-nio) 8%, transparent);
}

/* PNS-Placeholder-Banner */
.nl-wizard-pns-placeholder {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 20px 16px;
    background: var(--nl-color-surface-subtle);
    border: 1px dashed var(--nl-color-border-default);
    border-radius: var(--nl-radius-md);
    color: var(--nl-color-text-secondary);
    font-size: var(--nl-font-size-sm);
}

/* Deaktiviertes Formular-Grid waehrend Ladevorgang */
.nl-form-grid--disabled {
    pointer-events: none;
    opacity: 0.55;
    transition: opacity 0.2s ease;
}

/* Readonly-Feld-Darstellung (Matrix automatisch abgeleitet) */
.nl-form-field-readonly {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 10px;
    background: var(--nl-color-surface-subtle);
    border: 1px solid var(--nl-color-border-default);
    border-radius: var(--nl-radius-sm);
    font-size: var(--nl-font-size-sm);
    min-height: 32px;
}
/* =====================================================================
   [PW-1] 3-Step-Stepper-Header (ProbenanlageWizard)
   ===================================================================== */

/* Stepper-Header: horizontale Zeile aus Kreisen + Verbindungslinien */
.nl-wizard-stepper {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    padding: 16px 8px 12px;
    border-bottom: 1px solid var(--nl-color-border-default);
    margin-bottom: 4px;
    gap: 0;
}

/* Ein Step: Kreis + Label, senkrecht gestapelt, zentriert */
.nl-wizard-step-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    flex: 0 0 auto;
    cursor: default;
}

/* Step mit klickbarem Rueck-Navigationsmuster */
.nl-wizard-step-item--clickable {
    cursor: pointer;
}

.nl-wizard-step-item--clickable:hover .nl-wizard-step-circle {
    border-color: var(--nl-color-primary);
    color: var(--nl-color-primary);
}

/* Kreis: 28px, zentrierter Text */
.nl-wizard-step-circle {
    width: 28px;
    height: 28px;
    border-radius: 50%;
    border: 2px solid var(--nl-color-border-default);
    background: var(--nl-color-surface-default, #fff);
    color: var(--nl-color-text-secondary);
    font-size: 12px;
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
    user-select: none;
}

/* Aktiver Step */
.nl-wizard-step-circle--active {
    background: var(--nl-color-primary);
    border-color: var(--nl-color-primary);
    color: #ffffff;
}

/* Erledigter Step */
.nl-wizard-step-circle--done {
    background: var(--nl-color-io, #16A34A);
    border-color: var(--nl-color-io, #16A34A);
    color: #ffffff;
}

/* Verbindungslinie zwischen Kreisen */
.nl-wizard-step-line {
    flex: 1 1 auto;
    height: 2px;
    margin-top: 13px; /* vertikal auf Kreis-Mitte ausrichten */
    background: var(--nl-color-border-default);
    transition: background 0.2s ease;
}

.nl-wizard-step-line--done {
    background: var(--nl-color-io, #16A34A);
}

/* Step-Label */
.nl-wizard-step-label {
    font-size: 11px;
    color: var(--nl-color-text-secondary);
    white-space: nowrap;
    line-height: 1.2;
}

.nl-wizard-step-label--active {
    font-weight: 700;
    color: var(--nl-color-primary);
}

.nl-wizard-step-label--done {
    color: var(--nl-color-text-secondary);
}

/* Pruefumfang-Vorbelegungs-Hint */
.nl-wizard-pruefumfang-hint {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    margin-top: 4px;
    padding: 6px 8px;
    background: color-mix(in srgb, var(--nl-color-primary) 6%, transparent);
    border-left: 3px solid var(--nl-color-primary-light);
    border-radius: 0 var(--nl-radius-sm) var(--nl-radius-sm) 0;
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
}

.nl-wizard-pruefumfang-hint-icon {
    color: var(--nl-color-primary-light);
    font-size: 13px;
    flex-shrink: 0;
    margin-top: 1px;
}

/* =====================================================================
   Ende [A-10] ProbenanlageWizard CSS
   ===================================================================== */

/* =====================================================================
   [FU-3.4] Mobile-View: ProbenanlageWizard + ProbenListe-Header
   Touch-Optimierung fuer Probenehmer im Ausseneinsatz (< 768 px).
   Desktop-Layout bleibt unveraendert — alle Regeln greifen nur
   unterhalb des Breakpoints 768 px.

   Touch-Target-Mindestgroesse: 44 CSS-px (WCAG 2.5.5 AA, 2.5.8).
   ===================================================================== */

@media (max-width: 768px) {

    /* ------------------------------------------------------------------
       1. DxPopup-Vollbild (generisch): md-Editoren belegen den Viewport.
          Gilt fuer alle nl-popup-md AUSSER dem Wizard (siehe 1b Bottom-Sheet).
       ------------------------------------------------------------------ */
    .nl-popup-md .dxbs-popup {
        min-width: 0 !important;
        max-width: calc(100vw - 8px) !important;
        max-height: calc(100dvh - 16px) !important;
        height: calc(100dvh - 16px) !important;
    }

    /* ------------------------------------------------------------------
       1b. [P4] Bottom-Sheet fuer den Probenanlage-Wizard (nl-popup-sheet).
           Statt Vollbild dockt das Popup am unteren Rand an, nimmt max.
           92 dvh ein und slidet von unten ein — natives Mobile-Sheet-Gefuehl
           fuer Probenehmer im Aussendienst. Hoehere Spezifitaet (zwei Klassen
           am selben Element) ueberschreibt die generische Vollbild-Regel.
           DevExpress-Inline-Positionierung wird via !important + transform
           neutralisiert.
       ------------------------------------------------------------------ */
    .nl-popup-md.nl-popup-sheet .dxbs-popup {
        position: fixed !important;
        left: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
        top: auto !important;
        width: 100% !important;
        min-width: 0 !important;
        max-width: 100% !important;
        height: auto !important;
        max-height: 92dvh !important;
        margin: 0 !important;
        transform: none !important;
        border-radius: 16px 16px 0 0 !important;
        box-shadow: 0 -8px 28px rgba(15, 48, 87, 0.22) !important;
        animation: nl-sheet-slide-up 0.26s cubic-bezier(0.16, 1, 0.3, 1);
        overflow: hidden !important;
    }

    /* Drag-Handle (Greifer-Balken) oben — rein visuell, signalisiert Sheet. */
    .nl-popup-md.nl-popup-sheet .dxbs-popup::before {
        content: "";
        position: absolute;
        top: 7px;
        left: 50%;
        transform: translateX(-50%);
        width: 36px;
        height: 4px;
        border-radius: 9999px;
        background: #C7CDD5;
        z-index: 10;
        pointer-events: none;
    }

    /* Header bekommt etwas Platz fuer den Drag-Handle obendrueber. */
    .nl-popup-md.nl-popup-sheet .dxbs-popup .dxbs-popup-header,
    .nl-popup-md.nl-popup-sheet .dxbs-popup .dxbl-popup-header {
        padding-top: 18px !important;
    }

    /* Body scrollt innerhalb des Sheets, der Footer bleibt sichtbar unten. */
    .nl-popup-md.nl-popup-sheet .dxbs-popup .dxbs-popup-body,
    .nl-popup-md.nl-popup-sheet .dxbs-popup .dxbl-popup-body {
        overflow-y: auto !important;
        -webkit-overflow-scrolling: touch;
    }

    /* ------------------------------------------------------------------
       2. Wizard-Stepper: kompaktere Abstande auf schmalem Viewport.
          Statt 16px Padding oben/unten nur 10px; Label auf 10px
          (war 11px) damit "Stammdaten" noch auf einer Zeile bleibt.
       ------------------------------------------------------------------ */
    .nl-wizard-stepper {
        gap: 4px;
        padding: 10px 4px 8px;
    }

    .nl-wizard-step-label {
        font-size: 10px;
    }

    /* ------------------------------------------------------------------
       3. Form-Grid: 1-Spalten-Layout.
          Im Desktop-Modus gibt es nl-form-col-6 (halbe Breite).
          Auf Mobile sollen alle Felder full-width sein, um
          Touch-Eingabe und Lesbarkeit zu verbessern.
       ------------------------------------------------------------------ */
    .nl-popup-body .nl-form-grid .nl-form-col-6,
    .nl-popup-body .nl-form-grid .nl-form-col-4,
    .nl-popup-body .nl-form-grid .nl-form-col-3 {
        grid-column: 1 / -1;
    }

    /* ------------------------------------------------------------------
       4. Touch-freundliche Inputs: min. 44 px Touch-Target (WCAG 2.5.5).
          Betrifft DxDateEdit, DxTextBox, DxComboBox, DxMemo, Checkbox.
          nl-chip2 und nl-mode-selector-btn erhalten eigene Regeln.
       ------------------------------------------------------------------ */
    .nl-popup-body .dxbs-editor .dxbs-input,
    .nl-popup-body .dxbs-edit-input {
        min-height: 44px;
        font-size: 15px;     /* verhindert Auto-Zoom auf iOS Safari (>= 16px) */
    }

    .nl-popup-body .dxbs-spin-edit,
    .nl-popup-body .dxbs-combobox,
    .nl-popup-body .dxbs-date-edit,
    .nl-popup-body .dxbs-tag-box {
        min-height: 44px;
    }

    .nl-popup-body .form-control,
    .nl-popup-body .form-select {
        min-height: 44px;
        font-size: 15px;
    }

    .nl-popup-body .form-check-input {
        width: 20px;
        height: 20px;
    }

    /* ------------------------------------------------------------------
       5. Modus-Selector: vertikal gestapelt statt nebeneinander.
          Jeder Button nimmt die volle Breite ein. Min-Hoehe 48 px
          (groesseres Touch-Target als Minimum 44 px).
       ------------------------------------------------------------------ */
    .nl-mode-selector {
        flex-direction: column;
        width: 100%;
    }

    .nl-mode-selector-btn {
        width: 100%;
        min-height: 48px;
        border-right: none !important;
        border-bottom: 1px solid var(--nl-color-secondary);
        justify-content: center;
    }

    .nl-mode-selector-btn:last-child {
        border-bottom: none;
    }

    /* ------------------------------------------------------------------
       6. "Jetzt"-Button neben DxDateEdit: auf Mobile volle Breite,
          unterhalb des DateEdit-Feldes gestapelt (flex-direction column).
          nl-datefield-with-quick ist das Container-Element.
       ------------------------------------------------------------------ */
    .nl-datefield-with-quick {
        flex-direction: column;
        align-items: stretch;
    }

    .nl-datefield-with-quick > .w-100 {
        flex: none;
    }

    .nl-datefield-with-quick .nl-quick-datum {
        width: 100%;
        min-height: 44px;
        justify-content: center;
        white-space: nowrap;
    }

    /* ------------------------------------------------------------------
       7. Wizard-Footer-Buttons (DxPopup FooterContentTemplate):
          Buttons horizontal nebeneinander bleiben OK auf 375 px (2 Buttons
          je ~50 %). Falls nur 1 Button: full-width.
          Hoehe auf 44 px (Touch-Target).
       ------------------------------------------------------------------ */
    .dxbs-popup .dxbs-popup-footer .dxbs-button,
    .dxbs-popup .dxbs-popup-footer button:not(.nl-chip2) {
        min-height: 44px;
        flex: 1 1 auto;
    }

    /* ------------------------------------------------------------------
       8. ProbenListe-Header: auf Mobile kompakter.
          h1 kleiner; eyebrow und subtitle optional ausgeblendet
          wenn kein Platz (aktuell: nur Schriftgroesse reduzieren).
       ------------------------------------------------------------------ */
    .nl-listpage-head-main h1 {
        font-size: 1.25rem;
    }

    .nl-listpage-eyebrow {
        font-size: 9.5px;
    }

    /* ------------------------------------------------------------------
       9. ProbenListe-Toolbar-Flat: Filter-Chips umbrechen auf 2-3 Zeilen.
          nl-toolbar-flat hat bereits flex-wrap: wrap (Zeile 6533).
          nl-chiprow hat flex-wrap: wrap (Zeile 6553).
          Hier nur die Info-Span unter die Chips setzen (statt rechts).
       ------------------------------------------------------------------ */
    .nl-toolbar-flat {
        gap: 8px;
    }

    .nl-toolbar-flat-info {
        width: 100%;
        justify-content: flex-start;
    }

    /* Spalten-/Optimale-Breite-Buttons in nl-toolbar-flat-info:
       auf Mobile als volle Zeile gestapelt — die Proben-Legende
       darunter schiebt sich automatisch nach unten. */
    .nl-toolbar-flat-info .nl-btn-link-sm {
        font-size: 11px;
    }

    /* ------------------------------------------------------------------
       10. Probentyp-Legende: auf Mobile 2-spaltiges Wrap-Layout
           statt Single-Row-Scroll.
       ------------------------------------------------------------------ */
    .nl-probe-legend {
        flex-wrap: wrap;
        gap: 6px 12px;
    }

    /* ------------------------------------------------------------------
       11. nl-wizard-auftrag-kopf: auf Mobile vertikal stapeln wenn noetig.
       ------------------------------------------------------------------ */
    .nl-wizard-auftrag-kopf {
        flex-wrap: wrap;
    }

}

/* [P4] Slide-up-Animation fuer das Mobile-Bottom-Sheet (Wizard).
   Global definiert (keyframes ignorieren Media-Query-Scope). Respektiert
   prefers-reduced-motion weiter unten. */
@keyframes nl-sheet-slide-up {
    from { transform: translateY(100%); }
    to   { transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
    .nl-popup-md.nl-popup-sheet .dxbs-popup {
        animation: none !important;
    }
}

/* =====================================================================
   Ende [FU-3.4] Mobile-View
   ===================================================================== */

/* =====================================================================
   DevExpress Grid — Row-Selection-Highlight an ProbaLab-Brand angleichen
   =====================================================================
   DevExpress rendert das Hintergrund-Highlight der fokussierten/selektierten
   Zeile als ::before-Pseudo mit hartkodiertem `background-color: var(--bs-primary)`
   und opacity 90-100% — das ergibt ein nahezu solides Bootstrap-Blau, das stark
   vom NavMenu-Active-Look (Mittelblau mit ~14% Opacity, Navy-Text) abweicht.

   Wir ueberschreiben das Pseudo direkt mit unserem Mittelblau-Token in niedriger
   Opacity, damit die Row-Highlightung visuell konsistent zur Sidebar-Selection wird.

   Selektor-Kette aus dem Original (DevExpress-Theme bootstrap-external.bs5.min.css)
   1:1 uebernommen, damit die Spezifitaet ausreicht ohne !important.
*/

/* Fokussierte Zeile (geklickt, aber nicht selektiert) — Bootstrap-Primary @ 90% raus */
.dxbl-grid-focused-row:not(.dxbl-grid-touch-selection):not(.dxbl-grid-touch-selection-edge)
    > td:not(.dxbl-grid-empty-cell):not(.dxbl-grid-indent-cell)::before {
    background-color: var(--nl-color-brand-mid, #5678b5);
    opacity: 0.22;
}

/* Fokussiert + selektiert (Doppel-State) — Bootstrap-Primary @ 100% raus */
.dxbl-grid-focused-row.dxbl-grid-selected-row:not(.dxbl-grid-touch-selection):not(.dxbl-grid-touch-selection-edge)
    > td:not(.dxbl-grid-empty-cell):not(.dxbl-grid-indent-cell)::before {
    background-color: var(--nl-color-brand-mid, #5678b5);
    opacity: 0.28;
}

/* Textfarbe der fokussierten Zeile auf Navy zwingen — DevExpress setzt sonst
   currentcolor auf weiss (passend zum Solid-Blau-BG, aber nicht zu unserem Tint). */
.dxbl-grid-focused-row:not(.dxbl-grid-touch-selection):not(.dxbl-grid-touch-selection-edge)
    > td:not(.dxbl-grid-empty-cell):not(.dxbl-grid-indent-cell),
.dxbl-grid-focused-row.dxbl-grid-selected-row:not(.dxbl-grid-touch-selection):not(.dxbl-grid-touch-selection-edge)
    > td:not(.dxbl-grid-empty-cell):not(.dxbl-grid-indent-cell) {
    color: var(--nl-color-brand-navy, #262766);
}

/* Hover ueber fokussierter Zeile — gleiche Logik (DevExpress nutzt --dxbl-grid-focus-frame-color
   das via var(--bs-primary) auch Bootstrap-Primary erbt). */
.dxbl-grid-focused-row:not(.dxbl-grid-group-row):not(.dxbl-grid-group-footer-row):not(.dxbl-grid-edit-row):not(.dxbl-grid-empty-row):hover
    > td:not(.dxbl-grid-edit-form):not(.dxbl-grid-indent-cell):not(.dxbl-grid-detail-cell):not(.dxbl-grid-empty-data-area):not(.dxbl-grid-empty-cell)::before {
    background-color: var(--nl-color-brand-mid, #5678b5);
    opacity: 0.28;
}

/* -----------------------------------------------------------------------
   Banner-Leiste — Trial-Banner + System-Hinweis-Banner
   Direkt unter der Topbar / Sidebar-Kopf, ueber dem Haupt-Content.
   SSR-sicher: nl-banner-bar ist immer im DOM, Banner-Items erscheinen
   nach OnInitializedAsync (rendermode InteractiveServer, prerender=false).
   ----------------------------------------------------------------------- */
.nl-banner-bar {
    display: flex;
    flex-direction: column;
    gap: 0;
}

.nl-banner-bar:empty {
    display: none;
}

.nl-banner-bar-item {
    border-radius: 0;
    border-left-width: 4px;
    border-right: none;
    border-top: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 10px 16px;
    font-size: 13px;
}

/* Info-Variante fuer Banner-Bar (leicht abgesetzt von nl-banner-info fuer kompakteres Layout) */
.nl-banner-bar-info {
    border-left-color: var(--nl-color-primary, #262766);
    background: #EEF3FA;
    color: #1F3A5F;
    border-color: rgba(38, 39, 102, 0.15);
}

.nl-banner-bar-text {
    flex: 1;
    line-height: 1.45;
}

.nl-banner-bar-close {
    background: none;
    border: none;
    cursor: pointer;
    color: inherit;
    opacity: 0.55;
    font-size: 14px;
    padding: 0 2px;
    line-height: 1;
    flex-shrink: 0;
    transition: opacity 0.15s;
}

.nl-banner-bar-close:hover {
    opacity: 1;
}

/* -----------------------------------------------------------------
   Archivierungs-UI
   nl-stamm-archiviert: graue Zeile in Stammdaten-Grids (archivierte
   Eintraege). nl-archiviert-band: Statusband oben im Editor.
   ----------------------------------------------------------------- */
.nl-stamm-archiviert {
    color: #9ca3af;
    font-style: italic;
}

.nl-stamm-archiviert td {
    color: #9ca3af;
}

.nl-archiviert-band {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 16px;
    border-left: 4px solid var(--nl-color-archiviert, #9CA3AF);
    background: #f3f4f6;
    border-radius: 4px;
    margin-bottom: 16px;
    font-size: 13.5px;
    color: #4b5563;
}

.nl-archiviert-band .nl-archiviert-band-text {
    flex: 1;
}

.nl-archiviert-band .nl-archiviert-band-text strong {
    font-weight: 600;
    color: #374151;
}

/* =====================================================================
   Druck-Button (NlDruckenButton) — im normalen Viewport ein kleiner
   Icon-Button; wird beim Drucken selbst ausgeblendet.
   ===================================================================== */
.nl-drucken-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border: 1px solid var(--nl-color-border-card);
    background: var(--nl-color-bg-card);
    color: var(--nl-color-text-secondary);
    border-radius: 4px;
    cursor: pointer;
    padding: 0;
}
.nl-drucken-btn:hover {
    background: var(--nl-color-surface-subtle);
    color: var(--nl-color-text-primary);
}

/* =====================================================================
   Export-Toolbar fuer Listen-Seiten (C1-A)
   Kleine Schaltflaechen-Gruppe "Drucken / Excel / CSV" rechts in der
   nl-list-toolbar oder nl-listpage-head-actions.
   ===================================================================== */
.nl-export-group {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.nl-export-btn {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 4px 10px;
    font-size: 12px;
    line-height: 1.4;
    border: 1px solid var(--nl-color-border-card);
    background: var(--nl-color-bg-card);
    color: var(--nl-color-text-secondary);
    border-radius: 4px;
    cursor: pointer;
    white-space: nowrap;
}
.nl-export-btn:hover {
    background: var(--nl-color-surface-subtle);
    color: var(--nl-color-text-primary);
}
.nl-export-btn svg {
    flex-shrink: 0;
}

/* =====================================================================
   Etikett-Designer — freie XY-Positionierung (Drag-and-Drop)
   ===================================================================== */

/* Dreispalten-Wrapper: Palette | Canvas | Eigenschaften */
.nl-etikett-canvas-wrap {
    display: grid;
    grid-template-columns: 200px 1fr 240px;
    gap: 12px;
    align-items: start;
    min-height: 0;
}

/* Linke Sidebar: Element-Palette */
.nl-etikett-palette {
    background: var(--nl-color-bg-card);
    border: 1px solid var(--nl-color-border, #dee2e6);
    border-radius: 6px;
    padding: 12px;
}
.nl-etikett-palette-title {
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--nl-color-text-muted, #6c757d);
    margin-bottom: 8px;
}
.nl-etikett-palette-btn {
    display: flex;
    align-items: center;
    gap: 6px;
    width: 100%;
    margin-bottom: 4px;
    padding: 6px 10px;
    background: var(--nl-color-bg, #f5f7fa);
    border: 1px solid var(--nl-color-border, #dee2e6);
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.82rem;
    text-align: left;
    transition: background 0.12s, border-color 0.12s;
}
.nl-etikett-palette-btn:hover {
    background: var(--nl-color-primary-light, #5678b5);
    color: #fff;
    border-color: var(--nl-color-primary-light, #5678b5);
}

/* Mittlerer Bereich: scrollbarer Canvas-Container */
.nl-etikett-canvas-container {
    overflow: auto;
    padding: 16px;
    background: #f0f0f0;
    border-radius: 6px;
    border: 1px solid var(--nl-color-border, #dee2e6);
}

/* Canvas: repraesentiert das physische Etikett in echten mm */
.nl-etikett-canvas {
    position: relative;
    background: #fff;
    border: 1px solid #aaa;
    box-shadow: 0 2px 8px rgba(0,0,0,0.15);
    /* 1-mm- und 5-mm-Gitter */
    background-image:
        linear-gradient(to right, rgba(0,0,0,0.06) 1px, transparent 1px),
        linear-gradient(to bottom, rgba(0,0,0,0.06) 1px, transparent 1px),
        linear-gradient(to right, rgba(0,0,0,0.12) 1px, transparent 1px),
        linear-gradient(to bottom, rgba(0,0,0,0.12) 1px, transparent 1px);
    background-size: 1mm 1mm, 1mm 1mm, 5mm 5mm, 5mm 5mm;
    /* Width und Height werden per inline-style gesetzt (aus Vorlage in mm) */
}

/* Einzelne Slot-Elemente auf dem Canvas */
.nl-etikett-slot {
    position: absolute;
    border: 1px solid transparent;
    padding: 1px 2px;
    cursor: move;
    user-select: none;
    font-size: 7pt;
    line-height: 1.2;
    box-sizing: border-box;
    min-width: 8mm;
    min-height: 3mm;
    overflow: hidden;
    transition: border-color 0.1s;
    background: rgba(255, 255, 255, 0.7);
}
.nl-etikett-slot:hover {
    background: rgba(38, 39, 102, 0.06);
    border-color: rgba(38, 39, 102, 0.3);
}
.nl-etikett-slot.selected {
    border-color: var(--nl-color-primary, #262766);
    outline: 1px dashed var(--nl-color-primary, #262766);
    background: rgba(38, 39, 102, 0.06);
    z-index: 10;
}
.nl-etikett-slot.dragging {
    opacity: 0.8;
    z-index: 20;
    box-shadow: 0 2px 6px rgba(0,0,0,0.2);
}

/* Barcode-Vorschau im Canvas */
.nl-etikett-slot-barcode {
    font-family: 'Courier New', monospace;
    font-size: 5pt;
    letter-spacing: -0.05em;
    display: block;
    white-space: nowrap;
}

/* Resize-Handle: rechts/unten am Slot */
.nl-etikett-resize-handle {
    position: absolute;
    right: -4px;
    bottom: -4px;
    width: 8px;
    height: 8px;
    background: var(--nl-color-primary, #262766);
    border-radius: 2px;
    cursor: se-resize;
    z-index: 11;
}

/* Rechte Sidebar: Eigenschaften-Panel */
.nl-etikett-props {
    background: var(--nl-color-bg-card);
    border: 1px solid var(--nl-color-border, #dee2e6);
    border-radius: 6px;
    padding: 12px;
}
.nl-etikett-props-title {
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--nl-color-text-muted, #6c757d);
    margin-bottom: 10px;
}
.nl-etikett-props .form-label {
    font-size: 0.78rem;
    margin-bottom: 2px;
}

/* Migrations-Banner fuer Altvorlagen */
.nl-etikett-migration-banner {
    background: #fff3cd;
    border: 1px solid #ffc107;
    border-radius: 6px;
    padding: 10px 14px;
    margin-bottom: 12px;
    font-size: 0.85rem;
}

/* Designer-Toolbar ueber dem Canvas */
.nl-etikett-toolbar {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    margin-bottom: 8px;
}
.nl-etikett-toolbar-sep {
    width: 1px;
    height: 24px;
    background: var(--nl-color-border, #dee2e6);
    margin: 0 4px;
}

/* Responsive: bei schmalen Screens Palette ausblenden */
@media (max-width: 1100px) {
    .nl-etikett-canvas-wrap {
        grid-template-columns: 1fr 220px;
    }
    .nl-etikett-palette {
        display: none;
    }
}
@media (max-width: 800px) {
    .nl-etikett-canvas-wrap {
        grid-template-columns: 1fr;
    }
    .nl-etikett-props {
        display: none;
    }
}

/* =====================================================================
   Print-CSS — wird beim window.print() / Drucken-Dialog aktiv.
   Blendet alle Navigations- und Steuerungs-Elemente aus und
   lasst nur den inhaltlichen Bereich stehen.
   ===================================================================== */
@media print {
    /* Haupt-Chrome ausblenden */
    .nl-sidebar,
    .nl-topbar,
    .nl-banner-bar,
    .nl-tabbar,
    .nl-toolbar,
    .nl-toolbar-flat,
    .nl-list-toolbar,
    .nl-listpage-head-actions,
    .nl-page-head-actions,
    .nl-form-page-head button:not(.print-keep),
    .nl-quickcreate-trigger,
    .nl-zurueck-btn,
    .nl-drucken-btn,
    .nl-export-group,
    .nl-row-actions,
    .nl-probenbaum-toolbar,
    .nl-probenbaum-row,
    .dxbs-toolbar,
    button:not(.print-keep) { display: none !important; }

    /* Hintergrund / Schatten fuer Druck reduzieren */
    body { background: white !important; }
    .nl-form-container { box-shadow: none !important; border: none !important; padding: 0 !important; }
    .nl-card { box-shadow: none !important; border: 1px solid #ccc !important; }

    /* Seitenumbruch-Hinweise */
    .nl-mermaid,
    .nl-card,
    .nl-form-card { page-break-inside: avoid; }

    /* Seitenraender */
    @page { margin: 1.5cm; }
}

/* ====================================================================
   NlToast — globaler Toast-Container + Toast-Karten
   Position: fixed, oben rechts, z-Index ueber allem.
   Farbgebung via semantische CSS-Tokens.
   ==================================================================== */

.nl-toast-container {
    position: fixed;
    top: 16px;
    right: 16px;
    z-index: 9999;
    display: flex;
    flex-direction: column;
    gap: 8px;
    pointer-events: none;   /* Container selbst ist kein Klickziel */
    width: 320px;
    max-width: calc(100vw - 32px);
}

.nl-toast {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 12px 14px 16px 14px;   /* unten Platz fuer Progress-Bar */
    border-radius: 8px;
    background: #fff;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 1px 4px rgba(0, 0, 0, 0.08);
    border-left: 4px solid #C7CDD5;
    font-size: 13.5px;
    line-height: 1.45;
    color: #2A3340;
    pointer-events: all;
    overflow: hidden;
    animation: nl-toast-enter 180ms ease-out forwards;
}

/* Slide-In von rechts */
@keyframes nl-toast-enter {
    from { opacity: 0; transform: translateX(32px); }
    to   { opacity: 1; transform: translateX(0); }
}

/* Varianten */
.nl-toast-success {
    border-left-color: var(--nl-color-io, #16A34A);
    background: #F0FAF4;
    color: #14532D;
}

.nl-toast-error {
    border-left-color: var(--nl-color-nio, #DC2626);
    background: #FFF5F5;
    color: #7F1D1D;
}

.nl-toast-info {
    border-left-color: var(--nl-color-primary, #262766);
    background: #F2F6FB;
    color: #1F3A5F;
}

/* Icon */
.nl-toast-icon {
    flex-shrink: 0;
    font-size: 15px;
    line-height: 1;
    margin-top: 1px;
    font-style: normal;
}

/* Text nimmt verbleibenden Platz */
.nl-toast-text {
    flex: 1;
    word-break: break-word;
}

/* Schliessen-Button */
.nl-toast-close {
    flex-shrink: 0;
    background: none;
    border: none;
    padding: 0 0 0 6px;
    cursor: pointer;
    color: inherit;
    opacity: 0.5;
    font-size: 14px;
    line-height: 1;
    transition: opacity 120ms;
}

.nl-toast-close:hover { opacity: 1; }

/* Auto-Dismiss Progress-Bar */
.nl-toast-progress {
    position: absolute;
    bottom: 0;
    left: 0;
    height: 3px;
    background: currentColor;
    opacity: 0.25;
    width: 100%;
    animation: nl-toast-progress linear forwards;
    transform-origin: left;
}

@keyframes nl-toast-progress {
    from { transform: scaleX(1); }
    to   { transform: scaleX(0); }
}

/* Im Druck verstecken */
@media print {
    .nl-toast-container { display: none; }
}

/* =====================================================================
   Reklamationsmanagement — CSS-Tokens + Komponenten-Klassen
   Quellen: docs/reklamationsmanagement/02-ux.md (CSS-Tokens §)
   Alle Farben AUSSCHLIESSLICH als CSS-Variable — kein Hex in Razor.
   ===================================================================== */

:root {
    /* Status-Farben Reklamation — leihen sich die globalen Bewertungs-/
       Versionierungs-Tokens (Zeile ~103ff.): identischer Hex-Wert, jetzt
       referenziert statt dupliziert (keine Hex-Drift-Gefahr mehr). */
    --nl-color-rek-neu:            var(--nl-color-nb);          /* Grau  #6B7280 */
    --nl-color-rek-klaerung:       var(--nl-color-warn-strong); /* Amber #D97706 */
    --nl-color-rek-in-bearbeitung: var(--nl-color-nwg);         /* Blau  #2563EB */
    --nl-color-rek-geschlossen:    var(--nl-color-io);          /* Gruen #16A34A */
    --nl-color-rek-abgelehnt:      var(--nl-color-nio);         /* Rot   #DC2626 */
    --nl-color-rek-storniert:      var(--nl-color-archiviert);  /* Grau-hell #9CA3AF */

    /* Ampel-Farben (abgeleiteter Bearbeitungsstand) — gleiche Referenzen wie oben. */
    --nl-color-ampel-rot:   var(--nl-color-nio);          /* Rot   #DC2626 */
    --nl-color-ampel-gelb:  var(--nl-color-warn-strong);  /* Amber #D97706 */
    --nl-color-ampel-gruen: var(--nl-color-io);           /* Gruen #16A34A */
    --nl-color-ampel-grau:  var(--nl-color-archiviert);   /* Grau-hell #9CA3AF */

    /* Typ-Farben Reklamation — leihen sich die Proben-Typ-Tokens (Zeile ~129ff.),
       identischer Hex-Wert. Gleiches Muster wie der Kalender-Block weiter unten
       (--nl-color-kal-qs/-pruefmittel/-material). */
    --nl-color-rek-typ-kunde:     var(--nl-color-probe-teilung);          /* Violett     #7C3AED */
    --nl-color-rek-typ-lieferant: var(--nl-color-probe-nachuntersuchung); /* Cyan        #0891B2 */
    --nl-color-rek-typ-intern:    var(--nl-color-probe-blindwert);        /* Grau-dunkel #374151 */
}

/* ---------- Ampel ---------- */
.nl-ampel {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    flex-shrink: 0;
}
.nl-ampel--grau  { background: var(--nl-color-ampel-grau); }
.nl-ampel--gelb  { background: var(--nl-color-ampel-gelb); }
.nl-ampel--rot   { background: var(--nl-color-ampel-rot); }
.nl-ampel--gruen { background: var(--nl-color-ampel-gruen); }

/* ---------- Reklamations-Typ-Badge ---------- */
.nl-rek-typ-badge {
    display: inline-block;
    padding: 2px 8px;
    border-radius: var(--nl-radius-sm);
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    letter-spacing: 0.03em;
    color: #fff;
}
.nl-rek-typ-badge--kunde     { background: var(--nl-color-rek-typ-kunde); }
.nl-rek-typ-badge--lieferant { background: var(--nl-color-rek-typ-lieferant); }
.nl-rek-typ-badge--intern    { background: var(--nl-color-rek-typ-intern); }

/* ---------- Status-Badges ---------- */
.nl-rek-status-offen             { background: var(--nl-color-rek-neu); color: #fff; }
.nl-rek-status-inklaerung        { background: var(--nl-color-rek-klaerung); color: #fff; }
.nl-rek-status-inbearbeitung     { background: var(--nl-color-rek-in-bearbeitung); color: #fff; }
.nl-rek-status-abschlussausstehend { background: var(--nl-color-accent, #fbbc3a); color: #1A1A2E; }
.nl-rek-status-geschlossen       { background: var(--nl-color-rek-geschlossen); color: #fff; }
.nl-rek-status-abgelehnt         { background: var(--nl-color-rek-abgelehnt); color: #fff; }
.nl-rek-status-storniert         { background: var(--nl-color-rek-storniert); color: #fff; }

/* ---------- Typ-Auswahl-Karten (Wizard Schritt 1) ---------- */
.nl-rek-typ-cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 12px;
    margin-bottom: 16px;
}
.nl-rek-typ-card {
    border: 2px solid var(--nl-color-border-card);
    border-radius: var(--nl-radius-md);
    padding: 20px 16px;
    cursor: pointer;
    text-align: center;
    transition: border-color 150ms, box-shadow 150ms;
    background: var(--nl-color-bg-card);
}
.nl-rek-typ-card:hover {
    border-color: var(--nl-color-primary-light);
    box-shadow: var(--nl-shadow-sm);
}
.nl-rek-typ-card.selected {
    border-color: var(--nl-color-primary);
    box-shadow: 0 0 0 3px rgba(38,39,102,0.12);
}
.nl-rek-typ-card--kunde.selected    { border-color: var(--nl-color-rek-typ-kunde); }
.nl-rek-typ-card--lieferant.selected { border-color: var(--nl-color-rek-typ-lieferant); }
.nl-rek-typ-card--intern.selected    { border-color: var(--nl-color-rek-typ-intern); }
.nl-rek-typ-card-icon {
    margin-bottom: 8px;
    color: var(--nl-color-primary);
    display: flex;
    justify-content: center;
}
.nl-rek-typ-card--kunde     .nl-rek-typ-card-icon { color: var(--nl-color-rek-typ-kunde); }
.nl-rek-typ-card--lieferant .nl-rek-typ-card-icon { color: var(--nl-color-rek-typ-lieferant); }
.nl-rek-typ-card--intern    .nl-rek-typ-card-icon { color: var(--nl-color-rek-typ-intern); }
.nl-rek-typ-card-label {
    font-weight: 600;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
}
.nl-rek-typ-card-desc {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    margin-top: 4px;
}

/* ---------- Reklamations-Wizard-Schritte (horizontal; eigener Prefix, um Kollision
   mit dem vertikalen .nl-wizard-steps des Probenanlage-Wizards zu vermeiden) ---------- */
.nl-rek-wizard-steps {
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: 0;
    margin-bottom: 24px;
}
.nl-rek-wizard-step {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
    white-space: nowrap;
}
.nl-rek-wizard-step.active {
    color: var(--nl-color-primary);
    font-weight: 600;
}
.nl-rek-wizard-step.done {
    color: var(--nl-color-rek-geschlossen);
}
.nl-rek-wizard-step-num {
    width: 28px;
    height: 28px;
    border-radius: 50%;
    border: 2px solid currentColor;
    background: var(--nl-color-bg-card);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    flex-shrink: 0;
}
.nl-rek-wizard-step.active .nl-rek-wizard-step-num  { background: var(--nl-color-primary); color: #fff; border-color: var(--nl-color-primary); }
.nl-rek-wizard-step.done   .nl-rek-wizard-step-num  { background: var(--nl-color-rek-geschlossen); color: #fff; border-color: var(--nl-color-rek-geschlossen); }
.nl-rek-wizard-connector {
    flex: 1 1 auto;
    height: 2px;
    background: var(--nl-color-border-default);
    min-width: 24px;
    margin: 0 8px;
}

/* ---------- Kommunikations-Timeline ---------- */
.nl-kom-timeline {
    list-style: none;
    padding: 0;
    margin: 0;
    position: relative;
}
.nl-kom-timeline::before {
    content: '';
    position: absolute;
    left: 18px;
    top: 0; bottom: 0;
    width: 2px;
    background: var(--nl-color-border-default);
}
.nl-kom-eintrag {
    position: relative;
    padding: 0 0 20px 48px;
}
.nl-kom-eintrag-icon {
    position: absolute;
    left: 6px;
    top: 2px;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    background: var(--nl-color-primary);
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 11px;
    z-index: 1;
}
.nl-kom-eintrag--empfang .nl-kom-eintrag-icon  { background: var(--nl-color-rek-klaerung); }
.nl-kom-eintrag--vorlaeufig .nl-kom-eintrag-icon { background: var(--nl-color-rek-in-bearbeitung); }
.nl-kom-eintrag--final .nl-kom-eintrag-icon      { background: var(--nl-color-rek-geschlossen); }
.nl-kom-eintrag--kundenbestaetigung .nl-kom-eintrag-icon { background: var(--nl-color-ampel-gruen); }
.nl-kom-eintrag-header {
    display: flex;
    align-items: baseline;
    gap: 8px;
    margin-bottom: 4px;
}
.nl-kom-eintrag-label {
    font-weight: 600;
    font-size: var(--nl-font-size-sm);
}
.nl-kom-eintrag-meta {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
}
.nl-kom-eintrag-text {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
    background: var(--nl-color-surface-subtle);
    border-radius: var(--nl-radius-sm);
    padding: 8px 12px;
    white-space: pre-line;
    border-left: 3px solid var(--nl-color-border-card);
}
.nl-kom-eintrag-worm-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: 10px;
    font-weight: 700;
    color: var(--nl-color-text-secondary);
    background: var(--nl-color-surface-subtle);
    border-radius: 3px;
    padding: 1px 5px;
    letter-spacing: 0.05em;
}

/* ---------- 8D-Navigation ---------- */
.nl-8d-layout {
    display: grid;
    grid-template-columns: 180px 1fr;
    gap: 16px;
    align-items: start;
}
.nl-8d-nav {
    display: flex;
    flex-direction: column;
    gap: 4px;
    position: sticky;
    top: 80px;
}
.nl-8d-disziplin {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 10px;
    border-radius: var(--nl-radius-sm);
    cursor: pointer;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
    border: 1px solid transparent;
    transition: background 100ms;
    background: none;
    text-align: left;
    width: 100%;
}
.nl-8d-disziplin:hover {
    background: var(--nl-color-surface-hover);
    color: var(--nl-color-text-primary);
}
.nl-8d-disziplin.active {
    background: var(--nl-color-surface-hover);
    border-color: var(--nl-color-primary-light);
    color: var(--nl-color-primary);
    font-weight: 600;
}
.nl-8d-status-dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
    border: 1.5px solid var(--nl-color-border-default);
    background: #fff;
}
.nl-8d-status-dot--offen         { background: var(--nl-color-ampel-grau); border-color: var(--nl-color-ampel-grau); }
.nl-8d-status-dot--inbearbeitung  { background: var(--nl-color-ampel-gelb); border-color: var(--nl-color-ampel-gelb); }
.nl-8d-status-dot--abgeschlossen  { background: var(--nl-color-ampel-gruen); border-color: var(--nl-color-ampel-gruen); }
.nl-8d-status-dot--nichtanwendbar { background: var(--nl-color-border-default); border-color: var(--nl-color-border-default); }
.nl-8d-fortschritt {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px;
    border-radius: var(--nl-radius-sm);
    background: var(--nl-color-surface-subtle);
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    margin-bottom: 8px;
}

/* =====================================================================
   Kalender-Modul — Kategorie-Tokens, Monats-Grid, Agenda, Ad-hoc-Popup
   Phase B — 2026-07-01 (docs/kalender/00-konzept.md)

   Kategorie-Farben sind bewusst KEINE Neu-Erfindung: sie leihen sich
   bestehende Bedeutungsfarben (Status-/Proben-Tokens), damit die
   Legende ohne neue Farbsprache auskommt.
   ===================================================================== */
:root {
    --nl-color-kal-pruefmittel:  var(--nl-color-probe-nachuntersuchung); /* Cyan  #0891B2 */
    --nl-color-kal-capa:         var(--nl-color-nio);                   /* Rot   #DC2626 */
    --nl-color-kal-reklamation:  var(--nl-color-probe-rueckstellprobe); /* Braun #92400E */
    --nl-color-kal-probenahme:   var(--nl-color-probe-original);        /* Blau  #1B4F8A */
    --nl-color-kal-auftrag:      var(--nl-color-primary-light);         /* Mittelblau #5678B5 */
    --nl-color-kal-qs:           var(--nl-color-probe-teilung);         /* Violett #7C3AED */
    --nl-color-kal-dokument:     var(--nl-color-probe-duplikat);        /* Grün-dunkel #065F46 */
    --nl-color-kal-kompetenz:    var(--nl-color-warn);                  /* Amber #FBBC3A */
    --nl-color-kal-material:     var(--nl-color-probe-blindwert);       /* Grau-dunkel #374151 */
    --nl-color-kal-eigen:        var(--nl-color-nwg);                   /* Blau-hell #2563EB */
    --nl-color-kal-ringversuch:  var(--nl-color-io);                   /* Grün  #16A34A — externe Validierung/Eignungsprüfung */
    --nl-color-kal-produktionsplan: var(--nl-color-primary);           /* Indigo #262766 — Produktions-/Planungsbezug */
    --nl-color-kal-chargenmhd:   var(--nl-color-warn-strong);          /* Orange #D97706 — MHD/Verfall (W3, Funktionsaudit 2026-07-14) */
}

/* ---------- Kopf: Monat/Jahr, Navigation, Ansicht-Umschalter ---------- */
.nl-kal-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}

.nl-kal-nav {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-top: 6px;
}

.nl-kal-nav-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: var(--nl-radius-sm);
    border: 1px solid var(--nl-color-border-card);
    background: var(--nl-color-bg-card);
    color: var(--nl-color-text-primary);
    cursor: pointer;
    font-size: var(--nl-font-size-base);
    line-height: 1;
}
.nl-kal-nav-btn:hover { background: var(--nl-color-surface-hover); }
.nl-kal-nav-btn:focus-visible { outline: 2px solid var(--nl-color-primary-light); outline-offset: 2px; }

.nl-kal-nav-heute {
    padding: 0 14px;
    height: 32px;
    border-radius: var(--nl-radius-sm);
    border: 1px solid var(--nl-color-border-card);
    background: var(--nl-color-bg-card);
    color: var(--nl-color-text-primary);
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    cursor: pointer;
}
.nl-kal-nav-heute:hover { background: var(--nl-color-surface-hover); }

.nl-kal-monatstitel {
    font-size: var(--nl-font-size-lg);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    min-width: 190px;
    text-align: center;
}

/* Segmented Control: Monat / Agenda */
.nl-kal-viewswitch {
    display: inline-flex;
    border-radius: var(--nl-radius-sm);
    border: 1px solid var(--nl-color-border-card);
    overflow: hidden;
}
.nl-kal-viewswitch-btn {
    padding: 6px 16px;
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    background: var(--nl-color-bg-card);
    border: none;
    cursor: pointer;
}
.nl-kal-viewswitch-btn + .nl-kal-viewswitch-btn { border-left: 1px solid var(--nl-color-border-card); }
.nl-kal-viewswitch-btn:hover { background: var(--nl-color-surface-hover); }
.nl-kal-viewswitch-btn.active {
    background: var(--nl-color-primary);
    color: var(--nl-color-text-inverted);
}

/* ---------- Kategorie-Filter-Chips + Legende ---------- */
.nl-kal-legend {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin: 12px 0;
}

.nl-kal-legend-dot {
    display: inline-block;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    margin-right: 6px;
    flex-shrink: 0;
}

.nl-kal-kategorie-pruefmittel .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-pruefmittel { background: var(--nl-color-kal-pruefmittel); }
.nl-kal-kategorie-capa .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-capa { background: var(--nl-color-kal-capa); }
.nl-kal-kategorie-reklamation .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-reklamation { background: var(--nl-color-kal-reklamation); }
.nl-kal-kategorie-probenahme .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-probenahme { background: var(--nl-color-kal-probenahme); }
.nl-kal-kategorie-auftrag .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-auftrag { background: var(--nl-color-kal-auftrag); }
.nl-kal-kategorie-qs .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-qs { background: var(--nl-color-kal-qs); }
.nl-kal-kategorie-dokument .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-dokument { background: var(--nl-color-kal-dokument); }
.nl-kal-kategorie-kompetenz .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-kompetenz { background: var(--nl-color-kal-kompetenz); }
.nl-kal-kategorie-material .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-material { background: var(--nl-color-kal-material); }
.nl-kal-kategorie-eigen .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-eigen { background: var(--nl-color-kal-eigen); }
.nl-kal-kategorie-ringversuch .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-ringversuch { background: var(--nl-color-kal-ringversuch); }
.nl-kal-kategorie-produktionsplan .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-produktionsplan { background: var(--nl-color-kal-produktionsplan); }
.nl-kal-kategorie-chargenmhd .nl-kal-legend-dot,
.nl-kal-tag-kategoriedot.nl-kal-kategorie-chargenmhd { background: var(--nl-color-kal-chargenmhd); }

.nl-kal-legend-label {
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-text-secondary);
    display: inline-flex;
    align-items: center;
}

.nl-kal-legend-sep {
    color: var(--nl-color-border-card);
    margin: 0 2px;
}

/* ---------- Monats-Ansicht (DxScheduler, seit 2026-07-15) ----------
   Das frühere handgebaute 6x7-Grid (.nl-kal-grid/.nl-kal-tag/…) inkl. Tages-Popover-Overflow
   ("+k weitere") wurde durch DxScheduler + DxSchedulerMonthView ersetzt — DevExpress liefert
   Wochenraster, Wochentags-Header, Tages-Overflow und Tastatur-Navigation nativ. Nur noch die
   Größe des Scheduler-Wurzelelements ist hier zu steuern; die Termin-Chips selbst nutzen
   weiterhin die gemeinsamen .nl-kal-event-Klassen (siehe unten), gerendert über ein eigenes
   HorizontalAppointmentTemplate in KalenderHub.razor.

   FIXE statt Mindest-Höhe (Fix 2026-07-15, Live-Verifikation tester-Agent): DxSchedulerMonthView
   rendert je nach Monat 5 oder 6 Wochenzeilen mit jeweils fixer Zeilenhöhe — mit `min-height`
   allein wächst der Container bei 6-Zeilen-Monaten trotzdem über den 5-Zeilen-Fall hinaus
   (gemessen 782px bei 5 Zeilen vs. 932px bei 6 Zeilen, exakt eine Zeilenhöhe Differenz). Das war
   der weiterhin reproduzierbare Rest des ursprünglich gemeldeten Layout-Sprungs beim
   Monatswechsel (früher: Skeleton mit 5 Zeilen vs. echtes Grid mit 6 Zeilen). Eine FESTE Höhe
   zwingt DxScheduler, seine Wochenzeilen anteilig auf den verfügbaren Platz zu verteilen (interne
   Flex-/Grid-Verteilung der Komponente) — der Container bleibt über alle Monate konstant hoch,
   nur die einzelne Zeilenhöhe variiert geringfügig zwischen 5- und 6-Zeilen-Monaten. */
.nl-kal-scheduler {
    height: 940px;
}

/* ---------- Event-Chip (im DxScheduler-Termin-Template und in der Agenda) ---------- */
.nl-kal-event {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 11px;
    line-height: 1.3;
    padding: 2px 5px;
    border-radius: 4px;
    background: var(--nl-color-surface-subtle);
    color: var(--nl-color-text-primary);
    border-left: 3px solid var(--nl-color-text-secondary);
    text-align: left;
    width: 100%;
    cursor: pointer;
    overflow: hidden;
}
.nl-kal-event:hover { background: var(--nl-color-surface-hover); }
.nl-kal-event:focus-visible { outline: 2px solid var(--nl-color-primary-light); outline-offset: 1px; }

.nl-kal-event-dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    flex-shrink: 0;
}
.nl-kal-event.nl-kal-kategorie-pruefmittel { border-left-color: var(--nl-color-kal-pruefmittel); }
.nl-kal-event.nl-kal-kategorie-pruefmittel .nl-kal-event-dot { background: var(--nl-color-kal-pruefmittel); }
.nl-kal-event.nl-kal-kategorie-capa { border-left-color: var(--nl-color-kal-capa); }
.nl-kal-event.nl-kal-kategorie-capa .nl-kal-event-dot { background: var(--nl-color-kal-capa); }
.nl-kal-event.nl-kal-kategorie-reklamation { border-left-color: var(--nl-color-kal-reklamation); }
.nl-kal-event.nl-kal-kategorie-reklamation .nl-kal-event-dot { background: var(--nl-color-kal-reklamation); }
.nl-kal-event.nl-kal-kategorie-probenahme { border-left-color: var(--nl-color-kal-probenahme); }
.nl-kal-event.nl-kal-kategorie-probenahme .nl-kal-event-dot { background: var(--nl-color-kal-probenahme); }
.nl-kal-event.nl-kal-kategorie-auftrag { border-left-color: var(--nl-color-kal-auftrag); }
.nl-kal-event.nl-kal-kategorie-auftrag .nl-kal-event-dot { background: var(--nl-color-kal-auftrag); }
.nl-kal-event.nl-kal-kategorie-qs { border-left-color: var(--nl-color-kal-qs); }
.nl-kal-event.nl-kal-kategorie-qs .nl-kal-event-dot { background: var(--nl-color-kal-qs); }
.nl-kal-event.nl-kal-kategorie-dokument { border-left-color: var(--nl-color-kal-dokument); }
.nl-kal-event.nl-kal-kategorie-dokument .nl-kal-event-dot { background: var(--nl-color-kal-dokument); }
.nl-kal-event.nl-kal-kategorie-kompetenz { border-left-color: var(--nl-color-kal-kompetenz); }
.nl-kal-event.nl-kal-kategorie-kompetenz .nl-kal-event-dot { background: var(--nl-color-kal-kompetenz); }
.nl-kal-event.nl-kal-kategorie-material { border-left-color: var(--nl-color-kal-material); }
.nl-kal-event.nl-kal-kategorie-material .nl-kal-event-dot { background: var(--nl-color-kal-material); }
.nl-kal-event.nl-kal-kategorie-eigen { border-left-color: var(--nl-color-kal-eigen); }
.nl-kal-event.nl-kal-kategorie-eigen .nl-kal-event-dot { background: var(--nl-color-kal-eigen); }
.nl-kal-event.nl-kal-kategorie-ringversuch { border-left-color: var(--nl-color-kal-ringversuch); }
.nl-kal-event.nl-kal-kategorie-ringversuch .nl-kal-event-dot { background: var(--nl-color-kal-ringversuch); }
.nl-kal-event.nl-kal-kategorie-produktionsplan { border-left-color: var(--nl-color-kal-produktionsplan); }
.nl-kal-event.nl-kal-kategorie-produktionsplan .nl-kal-event-dot { background: var(--nl-color-kal-produktionsplan); }
.nl-kal-event.nl-kal-kategorie-chargenmhd { border-left-color: var(--nl-color-kal-chargenmhd); }
.nl-kal-event.nl-kal-kategorie-chargenmhd .nl-kal-event-dot { background: var(--nl-color-kal-chargenmhd); }

.nl-kal-event.nl-kal-event-ueberfaellig {
    background: rgba(220, 38, 38, 0.10);
    border-left-color: var(--nl-color-nio);
    color: var(--nl-color-nio);
    font-weight: 600;
}
.nl-kal-event.nl-kal-event-ueberfaellig .nl-kal-event-dot { background: var(--nl-color-nio); }

.nl-kal-event-zeit {
    flex-shrink: 0;
    font-variant-numeric: tabular-nums;
    opacity: 0.85;
}

.nl-kal-event-titel {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ---------- Agenda-Ansicht ---------- */
.nl-kal-agenda-section {
    margin-bottom: 20px;
}
.nl-kal-agenda-section:last-child { margin-bottom: 0; }

.nl-kal-agenda-section-title {
    font-size: var(--nl-font-size-sm);
    font-weight: 700;
    color: var(--nl-color-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin: 0 0 8px 0;
}
.nl-kal-agenda-section-title.is-ueberfaellig { color: var(--nl-color-nio); }

.nl-kal-agenda-tag {
    margin-bottom: 14px;
}
.nl-kal-agenda-tag:last-child { margin-bottom: 0; }

.nl-kal-agenda-tag-head {
    font-size: var(--nl-font-size-sm);
    font-weight: 700;
    color: var(--nl-color-text-primary);
    padding: 4px 0;
    border-bottom: 1px solid var(--nl-color-border-default);
    margin-bottom: 6px;
}
.nl-kal-agenda-tag-head .nl-kal-agenda-tag-heute-badge {
    display: inline-block;
    margin-left: 8px;
    font-size: 10px;
    font-weight: 700;
    color: var(--nl-color-text-inverted);
    background: var(--nl-color-primary);
    border-radius: 9999px;
    padding: 1px 8px;
}

.nl-kal-agenda-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 10px;
    border-radius: var(--nl-radius-sm);
    cursor: pointer;
    border: 1px solid transparent;
}
.nl-kal-agenda-row:hover {
    background: var(--nl-color-surface-hover);
    border-color: var(--nl-color-border-default);
}
.nl-kal-agenda-row:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: -1px;
}

.nl-kal-agenda-row-zeit {
    flex-shrink: 0;
    width: 64px;
    font-size: var(--nl-font-size-xs);
    font-variant-numeric: tabular-nums;
    color: var(--nl-color-text-secondary);
}
.nl-kal-agenda-row.is-ueberfaellig .nl-kal-agenda-row-zeit { color: var(--nl-color-nio); font-weight: 700; }

.nl-kal-agenda-row-titel {
    flex: 1 1 auto;
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-primary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nl-kal-agenda-row.is-ueberfaellig .nl-kal-agenda-row-titel { color: var(--nl-color-nio); font-weight: 600; }

.nl-kal-agenda-row-kategorie {
    flex-shrink: 0;
    font-size: 10px;
    font-weight: 600;
    color: var(--nl-color-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

.nl-kal-agenda-empty {
    padding: 24px 0;
    text-align: center;
    color: var(--nl-color-text-secondary);
}

/* Tages-Popover ("+k weitere") und Skeleton-Grid (.nl-kal-skeleton-grid/-cell) entfallen mit dem
   DxScheduler-Umbau — Ladezustand läuft jetzt über DxLoadingPanel (siehe KalenderHub.razor),
   Tages-Overflow übernimmt DxSchedulerMonthView nativ. Das @keyframes nl-kal-skeleton-shimmer
   bleibt erhalten: wird vom Ressourcenplanung-Modul weiterverwendet (.nl-res-skeleton-row/-card
   unten im Ressourcenplanung-Abschnitt dieser Datei). */
@keyframes nl-kal-skeleton-shimmer {
    0%   { background-position: 100% 50%; }
    100% { background-position: 0 50%; }
}

/* =====================================================================
   Ressourcenplanung-Modul — Token-Aliasse, Hub-4-Spalten, Timeline,
   Kapazitätsboard, Material-Karten
   Phase 3 — 2026-07-02 (docs/ressourcenplanung/02-ux.md §7)

   Alle Farb-Tokens sind Aliasse auf bereits bestehende semantische Tokens
   (io/warn/nio/nb/ampel/primary) — bewusst KEINE neue Farbfamilie
   (siehe UX-Spec §0.3/§7). Nur Aliasse hier definieren, keine Hex-Werte.
   ===================================================================== */
:root {
    --nl-color-abw-urlaub:      var(--nl-color-ampel-gruen);
    --nl-color-abw-krankheit:   var(--nl-color-nio);
    --nl-color-abw-schulung:    var(--nl-color-kal-kompetenz);
    --nl-color-abw-sonstiges:   var(--nl-color-nb);

    --nl-color-res-frei:        var(--nl-color-io);
    --nl-color-res-belegt:      var(--nl-color-primary-light);
    --nl-color-res-sperrzeit:   var(--nl-color-nb);
    --nl-color-res-warnung:     var(--nl-color-warn);
    --nl-color-res-block:       var(--nl-color-nio);
    /* Phase 2 (docs/ressourcenplanung/05-phase2-konzept.md §1.2, Übergabe an designer): Ruhezeit-
       Hinweise (Feature 1, ADVISORY) sind bewusst NEUTRALER als eine echte Warnung (Abwesenheits-
       Kollision/Kompetenzlücke) — eigener, ruhigerer Farbton (nb-Grau statt Warn-Amber), damit
       Anwender "unverbindlicher Hinweis" vs. "geprüfter Fachkonflikt" optisch sofort unterscheiden. */
    --nl-color-res-hinweis:     var(--nl-color-nb);

    --nl-color-kap-engpass:      var(--nl-color-nio);
    --nl-color-kap-ueberbuchung: var(--nl-color-warn);

    /* Schichttausch-Workflow (docs/ressourcenplanung/04-schichttausch-konzept.md §2/§9):
       eigene Vorgangs-Status-Tokens statt der generischen Bewertungs-Badges (nl-badge-io/warn/nio) —
       ein Tauschantrag ist ein Vorgangs-, kein Konformitäts-Status (siehe Übergabe-Hinweis an
       designer, §10 dort). Aliasse auf bestehende semantische Tokens, keine neuen Hex-Werte. */
    --nl-color-tausch-beantragt:      var(--nl-color-nb);
    --nl-color-tausch-angenommen:     var(--nl-color-res-warnung);
    --nl-color-tausch-bestaetigt:     var(--nl-color-io);
    --nl-color-tausch-abgelehnt:      var(--nl-color-nio);
    --nl-color-tausch-zurueckgezogen: var(--nl-color-archiviert);
    /* Phase 2 (05-phase2-konzept.md §3.2/Übergabe an designer): "Angeboten" (Marktplatz, offen, noch
       niemand aufgegriffen) farblich zwischen "kein Antrag" (kein Badge) und "Beantragt" (nb-Grau)
       positioniert — ein eigener, ruhiger Blauton statt Grau/Amber/Grün/Rot der übrigen Vorgangs-
       stufen, damit ein offenes Marktplatz-Angebot auf den ersten Blick klar von einem bereits an
       eine Person gerichteten Antrag unterscheidbar ist. Alias auf bestehendes Token, kein neuer Hex. */
    --nl-color-tausch-angeboten:      var(--nl-color-primary-light);
}

/* ---------- Hub: 4-Spalten-Modifier (Basis .nl-hub-grid bleibt 3-spaltig) ---------- */
.nl-hub-grid-4 {
    grid-template-columns: repeat(4, 1fr);
}
@media (max-width: 1199.98px) {
    .nl-hub-grid-4 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 767.98px) {
    .nl-hub-grid-4 { grid-template-columns: 1fr; }
}

/* ---------- Abwesenheits-Kategorie-Badges (Text + Farbe, nie Farbpunkt allein) ---------- */
.nl-res-abw-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 2px 10px;
    border-radius: 999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    color: #fff;
}
.nl-res-abw-badge::before {
    content: "";
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: currentColor;
    opacity: 0.001; /* Dot bleibt strukturell, Text traegt die Bedeutung */
}
.nl-res-abw-urlaub    { background: var(--nl-color-abw-urlaub); }
.nl-res-abw-krankheit { background: var(--nl-color-abw-krankheit); }
.nl-res-abw-schulung  { background: var(--nl-color-abw-schulung); color: #1f2937; }
.nl-res-abw-sonstiges { background: var(--nl-color-abw-sonstiges); }

/* Überlappungs-/Konflikt-Hinweis inline in Listenzeilen (kein reiner Tooltip). */
.nl-res-inline-warn {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: var(--nl-font-size-xs);
    color: var(--nl-color-res-warnung);
    font-weight: 600;
}

/* ---------- Warnung-/Block-Banner im Popup (gestapelt, ursachengetrennt) ---------- */
.nl-res-banner-stack {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-top: 10px;
}
.nl-res-banner-stack .nl-banner { margin: 0; }

/* ---------- Belegungsplan / Kapazitätsboard: native Timeline (Zeilen × Tage) ---------- */
.nl-res-timeline {
    display: grid;
    width: 100%;
    border-collapse: collapse;
}
.nl-res-timeline-scroll {
    overflow-x: auto;
}
.nl-res-timeline-row {
    display: grid;
    grid-template-columns: 160px repeat(var(--nl-res-tage, 7), minmax(96px, 1fr));
    border-bottom: 1px solid var(--nl-color-border-default);
}
.nl-res-timeline-row.nl-res-timeline-header {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--nl-color-bg-card);
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    color: var(--nl-color-text-secondary);
}
.nl-res-timeline-rowlabel {
    position: sticky;
    left: 0;
    z-index: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 8px 10px;
    background: var(--nl-color-bg-card);
    border-right: 1px solid var(--nl-color-border-default);
    font-size: var(--nl-font-size-sm);
    font-weight: 600;
    color: var(--nl-color-text-primary);
}
.nl-res-timeline-rowlabel small {
    font-weight: 400;
    color: var(--nl-color-text-secondary);
}

/* Bereichs-Filter (Kapazitaetsboard) — kompakte Breite neben der Wochen-Navigation. */
.nl-res-bereich-filter {
    width: 220px;
}

/* Bereich-Combo in der Pruefmittel-Lifecycle-Leiste (PruefmittelDetail.razor). */
.nl-pm-bereich-combo {
    width: 200px;
}
.nl-res-timeline-cell {
    min-height: 56px;
    padding: 4px;
    border-right: 1px solid var(--nl-color-border-subtle, var(--nl-color-border-default));
    display: flex;
    flex-direction: column;
    gap: 2px;
    cursor: pointer;
    background: transparent;
}
.nl-res-timeline-cell:focus-visible {
    outline: 2px solid var(--nl-color-primary-light);
    outline-offset: -2px;
}
.nl-res-timeline-cell.is-wochenende { background: var(--nl-color-surface-subtle); }

.nl-res-block {
    border-radius: 4px;
    padding: 3px 6px;
    font-size: 11px;
    line-height: 1.3;
    color: #fff;
    text-align: left;
}
.nl-res-block-frei { background: transparent; color: var(--nl-color-text-secondary); font-size: 10px; }
.nl-res-block-belegt { background: var(--nl-color-res-belegt); }
.nl-res-block-sperrzeit { background: var(--nl-color-res-sperrzeit); }
.nl-res-block-warnung { background: var(--nl-color-res-warnung); color: #1f2937; }
.nl-res-block-block { background: var(--nl-color-res-block); }

/* Aktive Reservierung ist zusaetzlich per Storno-Aktion anklickbar (eigenes Klick-Target
   innerhalb der Zelle, @onclick:stopPropagation verhindert, dass zugleich das Reservierungs-
   Popup der Zelle oeffnet). */
.nl-res-block-clickable {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 4px;
    cursor: pointer;
}
.nl-res-block-clickable:hover,
.nl-res-block-clickable:focus-visible {
    outline: 1px solid rgba(255, 255, 255, 0.7);
    outline-offset: -1px;
}
.nl-res-block-storno-hint {
    font-size: 10px;
    opacity: 0.75;
    flex-shrink: 0;
}

/* Ausser-Betrieb-Zeile: durchgestrichenes Muster statt Tageszellen (AC-10 harter Block). */
.nl-res-timeline-row.is-ausserbetrieb .nl-res-timeline-cell {
    cursor: not-allowed;
    background: repeating-linear-gradient(
        135deg,
        var(--nl-color-surface-subtle),
        var(--nl-color-surface-subtle) 8px,
        var(--nl-color-border-default) 8px,
        var(--nl-color-border-default) 9px
    );
}

/* ---------- Kapazitätsboard: Zellen mit Farbe + Kurztext (nie Farbe allein) ---------- */
.nl-res-kap-zelle {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 6px;
    border-radius: 4px;
    font-size: 11px;
    font-weight: 600;
    color: #1f2937;
    background: var(--nl-color-surface-subtle);
}
.nl-res-kap-zelle.is-frei      { background: color-mix(in srgb, var(--nl-color-res-frei) 18%, transparent); color: var(--nl-color-res-frei); }
.nl-res-kap-zelle.is-belegt    { background: color-mix(in srgb, var(--nl-color-res-belegt) 22%, transparent); color: var(--nl-color-primary-dark); }
.nl-res-kap-zelle.is-abwesend  { background: color-mix(in srgb, var(--nl-color-abw-krankheit) 16%, transparent); color: var(--nl-color-abw-krankheit); }
.nl-res-kap-zelle.is-warnung   { background: color-mix(in srgb, var(--nl-color-res-warnung) 24%, transparent); color: #92400e; }
.nl-res-kap-zelle.is-sperrzeit { background: color-mix(in srgb, var(--nl-color-res-sperrzeit) 20%, transparent); color: var(--nl-color-text-secondary); }
.nl-res-kap-zelle.is-engpass   { background: color-mix(in srgb, var(--nl-color-kap-engpass) 18%, transparent); color: var(--nl-color-kap-engpass); }

.nl-res-kap-ueberbuchung {
    color: var(--nl-color-kap-ueberbuchung);
    font-weight: 700;
    margin-left: 2px;
}

/* ---------- Schichtplan: Farbpunkt (Stammdaten-Grid) + Zuweisungs-Chip (Plan-Zelle) ----------
   Schicht.Farbe ist ein gespeicherter, mandantenfrei wählbarer Wert (kein Bewertungs-Token) —
   daher als Inline-Style über --nl-res-schicht-farbe eingebunden, nicht hardcodiert. Die
   Redaktions-/„nicht verfügbar"-Kennzeichnung nutzt bewusst EIN eigenes, informationsarmes
   neutrales Muster (grau, kein Ampel-Farbton), damit die Abwesenheit visuell nicht auf eine
   Kategorie schließen lässt (§3.3 Konzept, Übergabe an designer). */
.nl-res-schicht-farbpunkt {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    margin: 0 auto;
}

.nl-res-schicht-chip {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 2px 6px;
    border-radius: 4px;
    font-size: 11px;
    font-weight: 700;
    color: #1f2937;
    background: color-mix(in srgb, var(--nl-res-schicht-farbe, var(--nl-color-res-belegt)) 28%, transparent);
    margin: 1px 3px 1px 0;
}

.nl-res-schicht-warnbadge {
    color: var(--nl-color-res-warnung);
    font-weight: 700;
}

.nl-res-schicht-entfernen {
    border: none;
    background: transparent;
    color: inherit;
    opacity: 0.6;
    font-weight: 700;
    line-height: 1;
    padding: 0 0 0 2px;
    cursor: pointer;
}
.nl-res-schicht-entfernen:hover,
.nl-res-schicht-entfernen:focus-visible {
    opacity: 1;
}

/* Tausch/Abgabe beantragen — nur an der eigenen Zuweisung sichtbar (§1 Schichttausch-Konzept). */
.nl-res-schicht-tausch {
    border: none;
    background: transparent;
    color: inherit;
    opacity: 0.7;
    font-weight: 700;
    line-height: 1;
    padding: 0 0 0 2px;
    cursor: pointer;
}
.nl-res-schicht-tausch:hover,
.nl-res-schicht-tausch:focus-visible {
    opacity: 1;
}

/* Marktplatz-Angebot einstellen (Feature 3) — eigenes Icon, bewusst getrennt vom gerichteten
   Tausch/Abgabe-Button oben (§3.1 Abgrenzung: kein Ziel-Person-Feld, kein echter Tausch). */
.nl-res-schicht-anbieten {
    border: none;
    background: transparent;
    color: var(--nl-color-primary);
    opacity: 0.7;
    font-weight: 700;
    line-height: 1;
    padding: 0 0 0 2px;
    cursor: pointer;
}
.nl-res-schicht-anbieten:hover,
.nl-res-schicht-anbieten:focus-visible {
    opacity: 1;
}

/* Ruhezeit-Hinweis (Feature 1, ADVISORY, docs/ressourcenplanung/05-phase2-konzept.md §1.2/§1.3) —
   bewusst neutraler als eine echte Warnung: "ⓘ" statt "⚠", eigener ruhigerer Farbton
   (--nl-color-res-hinweis). Blockiert nichts, reiner Hinweis inkl. Pflicht-Disclaimer im Tooltip. */
.nl-res-ruhehinweis {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-left: 4px;
    color: var(--nl-color-res-hinweis);
    font-weight: 700;
    font-size: 11px;
    cursor: help;
}

/* Neutrale „nicht verfügbar"-Kennzeichnung im Schichtplan — bewusst kein Ampel-Ton (DSGVO-Redaktion,
   §3.3): grau/informationsarm, egal ob Kategorie sichtbar ist oder nicht. */
.nl-res-schicht-abwesend {
    display: inline-flex;
    align-items: center;
    padding: 2px 6px;
    border-radius: 4px;
    font-size: 11px;
    color: var(--nl-color-text-secondary);
    background: var(--nl-color-surface-subtle);
    border: 1px dashed var(--nl-color-border-default);
    margin: 1px 0;
}

/* ---------- Schichttausch-Workflow: Vorgangs-Status-Badge (5 Werte, §2/§9) ---------- */
.nl-tausch-status-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 10px;
    border-radius: 9999px;
    font-size: var(--nl-font-size-xs);
    font-weight: 600;
    letter-spacing: 0.03em;
    line-height: 1.4;
    color: #fff;
    white-space: nowrap;
}
.nl-tausch-status-beantragt      { background: var(--nl-color-tausch-beantragt); }
.nl-tausch-status-angenommen     { background: var(--nl-color-tausch-angenommen); color: #1f2937; }
.nl-tausch-status-bestaetigt     { background: var(--nl-color-tausch-bestaetigt); }
.nl-tausch-status-abgelehnt      { background: var(--nl-color-tausch-abgelehnt); }
.nl-tausch-status-zurueckgezogen { background: var(--nl-color-tausch-zurueckgezogen); }
.nl-tausch-status-angeboten      { background: var(--nl-color-tausch-angeboten); }

/* Karten-Liste der Tauschanträge (kompakter als DxGrid — wenige Felder, viel Freitext). */
.nl-tausch-liste {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.nl-tausch-karte {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 12px 16px;
    border: 1px solid var(--nl-color-border-default);
    border-radius: var(--nl-radius-md);
    background: var(--nl-color-bg-card);
}
.nl-tausch-karte.is-mir-offen {
    border-left: 3px solid var(--nl-color-tausch-angenommen);
}
.nl-tausch-karte-kopf {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
}
.nl-tausch-karte-titel {
    font-weight: 600;
    color: var(--nl-color-text-primary);
}
.nl-tausch-karte-rollen {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
}
.nl-tausch-rolle-chip {
    font-size: 11px;
    font-weight: 600;
    padding: 1px 7px;
    border-radius: 4px;
    background: var(--nl-color-surface-subtle);
    color: var(--nl-color-text-secondary);
    border: 1px solid var(--nl-color-border-default);
}
.nl-tausch-karte-detail {
    font-size: var(--nl-font-size-sm);
    color: var(--nl-color-text-secondary);
}
.nl-tausch-karte-aktionen {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin-top: 4px;
}

/* ---------- Skeleton (wiederverwendet Kalender-Shimmer-Keyframe) ---------- */
.nl-res-skeleton-row {
    height: 44px;
    border-radius: var(--nl-radius-sm);
    margin-bottom: 6px;
    background: linear-gradient(90deg, var(--nl-color-surface-subtle) 25%, var(--nl-color-border-default) 37%, var(--nl-color-surface-subtle) 63%);
    background-size: 400% 100%;
    animation: nl-kal-skeleton-shimmer 1.4s ease infinite;
}
.nl-res-skeleton-card {
    height: 120px;
    border-radius: var(--nl-radius-sm);
    background: linear-gradient(90deg, var(--nl-color-surface-subtle) 25%, var(--nl-color-border-default) 37%, var(--nl-color-surface-subtle) 63%);
    background-size: 400% 100%;
    animation: nl-kal-skeleton-shimmer 1.4s ease infinite;
}

@media (max-width: 900px) {
    .nl-res-timeline-row { grid-template-columns: 120px repeat(var(--nl-res-tage, 7), minmax(76px, 1fr)); }
}

/* =====================================================================
   Ressourcenplanung Phase 2 — Skill-/Verfügbarkeits-Vorschläge (Feature 2)
   docs/ressourcenplanung/05-phase2-konzept.md §2 — Rangliste als klickbare
   Komfort-Hilfe in den Zuordnen-/Zuweisen-Popups. Wiederverwendet die
   bestehenden Bewertungs-Badge-Tokens (nl-badge-io/warn/nio/nb, keine neuen
   Farben) — io=qualifiziert+verfügbar, warn=qualifiziert-aber-verplant,
   nio=nicht qualifiziert, nb=neutral "nicht verfügbar" (Schicht, 2 Ränge).
   ===================================================================== */
.nl-vorschlag-block {
    margin-top: 10px;
    padding-top: 10px;
    border-top: 1px dashed var(--nl-color-border-default);
}
.nl-vorschlag-titel {
    font-size: var(--nl-font-size-xs);
    font-weight: 700;
    color: var(--nl-color-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin-bottom: 6px;
}
.nl-vorschlag-liste {
    display: flex;
    flex-direction: column;
    gap: 4px;
    max-height: 220px;
    overflow-y: auto;
}
.nl-vorschlag-item {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    padding: 6px 10px;
    border: 1px solid var(--nl-color-border-default);
    border-radius: var(--nl-radius-sm);
    background: var(--nl-color-bg-card);
    text-align: left;
    cursor: pointer;
}
.nl-vorschlag-item:hover,
.nl-vorschlag-item:focus-visible {
    border-color: var(--nl-color-primary-light);
    background: var(--nl-color-surface-subtle);
}
.nl-vorschlag-item.is-gewaehlt {
    border-color: var(--nl-color-primary);
    background: color-mix(in srgb, var(--nl-color-primary-light) 12%, transparent);
}
.nl-vorschlag-name {
    font-weight: 600;
    color: var(--nl-color-text-primary);
}
.nl-vorschlag-begruendung {
    margin-left: auto;
    text-align: right;
}

/* =====================================================================
   MFA / Zwei-Faktor-Authentifizierung (Konto-Bereich)
   Seiten: Pages/Konto/MfaEinrichten.razor, Pages/Konto/MfaEinstellungen.razor
   Komponente: Components/Konto/RecoveryCodesGrid.razor
   ===================================================================== */

/* QR-Code-Container: weisse Flaeche, damit der SVG-QR (schwarz auf weiss) auch bei
   dunklem Karten-Hintergrund/Theme-Overrides zuverlaessig scanbar bleibt. */
.nl-mfa-qr {
    width: 200px;
    height: 200px;
    margin: 0 auto 16px;
    padding: 12px;
    background: #FFFFFF;
    border: 1px solid var(--nl-color-sidebar-border, #E1E6F0);
    border-radius: var(--nl-radius-md);
    display: flex;
    align-items: center;
    justify-content: center;
}

.nl-mfa-qr svg {
    width: 100%;
    height: 100%;
}

/* Manueller Schlüssel als Fallback zum QR-Scan — Monospace, gut lesbar/abtippbar. */
.nl-mfa-key {
    font-family: var(--nl-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: var(--nl-font-size-lg);
    letter-spacing: 0.06em;
    text-align: center;
    background: var(--nl-color-bg, #F5F7FA);
    border: 1px solid var(--nl-color-sidebar-border, #E1E6F0);
    border-radius: var(--nl-radius-md);
    padding: 10px 14px;
    margin: 0 auto 12px;
    max-width: 360px;
    color: var(--nl-color-text-primary);
    user-select: all;
}

.nl-mfa-codes-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 8px 16px;
    margin: 4px 0 12px;
}

@media (max-width: 480px) {
    .nl-mfa-codes-grid { grid-template-columns: 1fr; }
}

.nl-mfa-code {
    font-family: var(--nl-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: var(--nl-font-size-sm);
    letter-spacing: 0.02em;
    text-align: center;
    background: var(--nl-color-bg, #F5F7FA);
    border: 1px solid var(--nl-color-sidebar-border, #E1E6F0);
    border-radius: var(--nl-radius-sm);
    padding: 6px 10px;
    color: var(--nl-color-text-primary);
}

.nl-mfa-codes-textarea {
    font-family: var(--nl-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: var(--nl-font-size-xs);
}

/* [UI-Audit 2026-07] Kopfzeile über der Recovery-Codes-Textarea: Hinweistext + Druck-Button
   (NlDruckenButton, bereits per Print-CSS/.nl-drucken-btn aus dem Ausdruck ausgeblendet). */
.nl-mfa-codes-actions {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}

