/*
 * cve_standalone.css — FE-W4.2 Teil 2 (10.10.2026): Seiten-CSS der /cve-
 * Standalone-Fläche, 1:1 aus dem Inline-<style>-Block von cve.php (Z. 483-1092)
 * externalisiert (Audit-Befund M1/W4.2). Inhalt, Layer-Verträge (@layer
 * bootstrap-W14-Heiler lädt weiter NACH default.css — gleiche Dokumentordnung)
 * und Theme-Bindung unverändert; Einbindung via tenant_asset_url() (Hash-
 * cachebar). Lokale --font-sans/--font-mono/:root-Overrides bleiben bewusst
 * erhalten (Dark-Lock-Historie der Seite), sie verlieren gegen die foundation-
 * Bindungen nur dann, wenn default.css sie früher setzt — Dokumentordnung
 * unverändert wie beim Inline-Block.
 */
:root {
    /* --- Design-Token (Senior-Layer): eine Quelle der Wahrheit für Farbe/Radius/Fokus ---
       Sprint 3 (25.09.) THEME-BINDUNG: Die lokalen Tokens konsumieren
       ab jetzt die globalen Theme-Tokens aus default.css (--color-*,
       --threat-*), die je data-bs-theme dark/light umschalten. Vorher
       war die Seite per Dark-Lock hardcoded — Light-Theme renderte
       Dark-Farben. Fallbacks = die alten Werte (Dark-Lock bleibt
       funktionsfähig, falls die Token-Kette nicht lädt). */
    --surface-glass: rgba(15, 23, 42, 0.85);
    --border-glass: rgba(255, 255, 255, 0.12);
    --surface-1: rgba(30, 41, 59, 0.4);
    --surface-2: rgba(30, 41, 59, 0.6);
    --surface-3: rgba(30, 41, 59, 0.55);
    --cyan: var(--color-accent-cyan, #00f0ff);
    --cyan-soft: var(--color-accent-cyan, #22d3ee);
    --cyan-bg: rgba(0, 240, 255, 0.08);
    --cyan-bg-hover: rgba(0, 240, 255, 0.2);
    --cyan-border: rgba(0, 240, 255, 0.35);
    --cyan-border-strong: rgba(0, 240, 255, 0.4);
    --sev-critical: var(--threat-critical, #f87171); --sev-critical-bg: rgba(239, 68, 68, 0.2); --sev-critical-bd: rgba(239, 68, 68, 0.4); --sev-critical-solid: var(--threat-critical, #ef4444);
    --sev-high: var(--threat-high, #fb923c);     --sev-high-bg: rgba(249, 115, 22, 0.2);  --sev-high-bd: rgba(249, 115, 22, 0.4);  --sev-high-solid: var(--threat-high, #f97316);
    --sev-medium: var(--threat-medium, #facc15);   --sev-medium-bg: rgba(234, 179, 8, 0.2); --sev-medium-bd: rgba(234, 179, 8, 0.4); --sev-medium-solid: var(--threat-medium, #eab308);
    --sev-low: var(--threat-low, #7dd3fc);      --sev-low-bg: rgba(56, 189, 248, 0.2);   --sev-low-bd: rgba(56, 189, 248, 0.4);   --sev-low-solid: var(--threat-low, #38bdf8);
    --amber: var(--color-accent, #fbbf24); --amber-bg: rgba(245, 158, 11, 0.1); --amber-border: rgba(245, 158, 11, 0.35);
    /* --text-muted lokal ENTFERNT (Theme-Bindung): das globale
       --text-muted (Dark #94a3b8 / Light #475569, WCAG-geprüft) fließt
       jetzt unverändert durch — vorher shadowete der lokale Wert
       #a5b4cd den Theme-Switch. */
    --radius-card: 1rem; --radius-tile: 0.9rem; --radius-pill: 9999px;
    --ring: 0 0 0 2px rgba(0, 240, 255, 0.55);
    --font-sans: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
    --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
/* Sprint 3 (25.09.): Light-Mode-Overrides der Seite-spezifischen
   Glass-/Tint-Tokens (die globalen --color-/-threat-Tokens schalten
   selbst um; nur die hier lokal definierten rgba-Tints brauchen
   explizite Light-Werte).
   Welle ML-16 (27.09.): PARSE-FIX — dieser Kommentar enthielt bis-
   her im Token-Doppelnamen die Zeichenfolge Stern+Slash und schloss
   sich damit VORZEITIG; der Rest wurde zu CSS-Muell und der Parser
   verschluckte die gesamte folgende Light-Regel. Der Block war seit
   Sprint 3 NIEMALS aktiv (die Light-Optik der Seite kam allein aus
   den globalen default.css-Tokens). */
html[data-bs-theme="light"] {
    --surface-glass: rgba(248, 250, 252, 0.92);
    --border-glass: rgba(15, 23, 42, 0.14);
    --surface-1: rgba(226, 232, 240, 0.45);
    --surface-2: rgba(226, 232, 240, 0.65);
    --surface-3: rgba(226, 232, 240, 0.6);
    --cyan-bg: rgba(8, 145, 178, 0.08);
    --cyan-bg-hover: rgba(8, 145, 178, 0.18);
    --cyan-border: rgba(8, 145, 178, 0.35);
    --cyan-border-strong: rgba(8, 145, 178, 0.45);
    --ring: 0 0 0 2px rgba(8, 145, 178, 0.45);
    --sev-critical-bg: rgba(220, 38, 38, 0.12);
    --sev-critical-bd: rgba(220, 38, 38, 0.35);
    --sev-high-bg: rgba(234, 88, 12, 0.12);
    --sev-high-bd: rgba(234, 88, 12, 0.35);
    --sev-medium-bg: rgba(202, 138, 4, 0.12);
    --sev-medium-bd: rgba(202, 138, 4, 0.35);
    --sev-low-bg: rgba(22, 163, 74, 0.12);
    --sev-low-bd: rgba(22, 163, 74, 0.35);
    /* Welle ML-16 (27.09.): Text-Tokens der Severity-Skala im Light —
       die Dark-300/400er (--threat-* bzw. #facc15-Familie) liegen auf
       #f8fafc bei 1.6-2.8:1 (R8-Walk, 15 Funde). 600/700er-Pendants,
       Projekt-Muster #b45309 (RCI-Heilung text-warning). */
    --sev-critical: #b91c1c; --sev-critical-solid: #dc2626;
    --sev-high: #c2410c;     --sev-high-solid: #ea580c;
    --sev-medium: #b45309;   --sev-medium-solid: #d97706;
    --sev-low: #0369a1;      --sev-low-solid: #0284c7;
}
body {
    background-color: var(--surface-ground, #0b0f19);
    color: var(--color-text-heading, #f8fafc);
    font-family: var(--font-sans);
    min-height: 100vh;
}
html[data-bs-theme="light"] body {
    color: var(--color-text-heading, #090d16);
}
/* Bootstrap-Mono-Kanal auf Marke umlenken (CVE-IDs, Scores, EPSS-Zahlen) */
body { --bs-font-monospace: var(--font-mono); }
/* Kontrastanhebung im Seiten-Scope (betrifft ~25 extra-small-Texte) */
body .text-muted { color: var(--text-muted) !important; }
/* Tastatur-Fokus: sichtbarer Cyan-Ring für alle Interaktiven */
a:focus-visible, button:focus-visible, [role="button"]:focus-visible,
.filter-btn:focus-visible, .chip:focus-visible, .ms-option:focus-visible, input:focus-visible {
    outline: none; box-shadow: var(--ring); border-radius: var(--radius-pill);
}
.cve-card {
    background: var(--surface-glass);
    border: 1px solid var(--border-glass);
    border-radius: var(--radius-card);
    transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.2s ease, box-shadow 0.2s ease, backdrop-filter 0.2s ease;
}
.cve-card:hover, .cve-card.spotlight {
    backdrop-filter: blur(16px); /* Blur-Kosten nur bei Interesse, nicht dauerhaft auf 60 Karten */
}
.cve-card:hover {
    transform: translateY(-3px);
    border-color: var(--cyan-border-strong);
    box-shadow: 0 10px 25px rgba(0, 240, 255, 0.08);
}
.cve-card.critical { border-left: 4px solid var(--sev-critical-solid); }
.cve-card.high { border-left: 4px solid var(--sev-high-solid); }
.cve-card.medium { border-left: 4px solid var(--sev-medium-solid); }
.cve-card.low { border-left: 4px solid var(--sev-low-solid); }
.cve-card.spotlight {
    border: 2px solid var(--cyan) !important;
    box-shadow: 0 0 35px rgba(0, 240, 255, 0.3) !important;
}

.badge-critical { background: var(--sev-critical-bg); color: var(--sev-critical); border: 1px solid var(--sev-critical-bd); font-weight: 700; }
.badge-high { background: var(--sev-high-bg); color: var(--sev-high); border: 1px solid var(--sev-high-bd); font-weight: 700; }
.badge-medium { background: var(--sev-medium-bg); color: var(--sev-medium); border: 1px solid var(--sev-medium-bd); font-weight: 700; }
.badge-kev { background: #c03030; color: #fff; font-weight: 800; } /* WCAG 1.4.3: 5.67:1 — rgba(.9)-Rot war 4.46:1; LH1-W6: pulse entfernt — Opacity-Dip 0,55 blendete mitten im Puls auf #d88687/#fbf9fa (2,6:1, axe-Sampler) — gleiche Entscheidung wie §13 Flash-Banner */
/* Zeit- & Bedrohungs-Signale (10.10.2026): NEU-Badge, KEV-Alter,
   EPSS-Trendpfeil, aktualisiert-Fußnote. Bewusst OHNE Pulse/Animation
   (gleiche axe-Begründung wie badge-kev oben), fixe Kontrastfarben. */
.badge-new { background: #0891b2; color: #fff; font-weight: 800; letter-spacing: .05em; } /* Cyan-600 auf Karten-Panels */
.badge-kev .kev-age { color: rgba(255, 255, 255, .88); font-weight: 700; }
.badge-kev .kev-fresh { color: #fde047; } /* frisch im KEV (≤ 7 T) — Gelb-Akzent im roten Badge, theme-unabhängig */
.epss-trend { font-size: .72rem; line-height: 1; font-weight: 800; }
.epss-trend.up { color: #f87171; } /* steigende Exploit-Wahrscheinlichkeit = rot-warm */
.epss-trend.down { color: #4ade80; } /* sinkend = Grün */
.card-updated { opacity: .85; }

/* --- Karten v2: Score-Typo + EPSS-Minibar + Icon-Signalleiste --- */
.card-score {
    font-family: var(--bs-font-monospace, ui-monospace, monospace);
    font-size: 1.35rem; font-weight: 800; line-height: 1;
    letter-spacing: -0.02em;
}
.card-score.critical { color: var(--sev-critical); }
.card-score.high { color: var(--sev-high); }
.card-score.medium { color: var(--sev-medium); }
.card-score.low { color: var(--sev-low); }
.epss-track {
    height: 4px; border-radius: 2px; background: rgba(148, 163, 184, 0.18);
    overflow: hidden; min-width: 5.5rem;
}
.epss-fill { height: 100%; border-radius: 2px; transition: width 0.6s cubic-bezier(0.16, 1, 0.3, 1); }
.epss-fill.tier-danger { background: linear-gradient(90deg, #ef4444, #f87171); }
.epss-fill.tier-warning { background: linear-gradient(90deg, #f59e0b, #fbbf24); }
.epss-fill.tier-info { background: linear-gradient(90deg, #0ea5e9, #38bdf8); }
.epss-fill.tier-muted { background: linear-gradient(90deg, #475569, #94a3b8); }
.signal-chip {
    display: inline-flex; align-items: center; gap: 0.2rem;
    font-size: 0.68rem; font-weight: 700; letter-spacing: 0.02em;
    padding: 0.12rem 0.45rem; border-radius: var(--radius-pill);
    border: 1px solid var(--border-glass); background: var(--surface-1);
}

.filter-btn {
    background: rgba(30, 41, 59, 0.6);
    border: 1px solid var(--border-glass);
    color: var(--text-muted);
    font-size: 0.82rem;
    font-weight: 600;
    padding: 0.35rem 0.85rem;
    border-radius: 9999px;
    cursor: pointer;
    transition: all 0.2s ease;
}
.filter-btn:hover, .filter-btn.active {
    background: var(--cyan);
    color: var(--surface-ground, #0b0f19);
    border-color: var(--cyan);
    font-weight: 700;
}
.vendor-stat-tile {
    background: rgba(30, 41, 59, 0.4);
    border: 1px solid var(--border-glass);
    border-radius: 0.75rem;
    padding: 0.6rem 0.9rem;
    cursor: pointer;
    transition: all 0.2s ease;
}
.vendor-stat-tile:hover {
    border-color: rgba(0, 240, 255, 0.5);
    background: rgba(30, 41, 59, 0.8);
    transform: translateY(-2px);
}

/* --- Nachgelieferte Utilities: im Markup referenziert, aber in keinem der geladenen Stylesheets definiert --- */
.extra-small { font-size: 0.72rem; }
/* R6-B1 (18.09.): statische Inline-Style-Muster aus dem Karten-Loop
   (×60 pro Render) auf Utilities — A3b-Vertrag auch auf Standalone-
   Routen. Dynamische Werte (Balken-width-%) bleiben inline. */
.extra-small-xs { font-size: 0.68rem; }
.text-uppercase-track { text-transform: uppercase; letter-spacing: 0.04em; }
.measure-card { max-width: var(--measure-card, 65ch); }
.text-critical-rose { color: #fb7185; }
.btn-inherit { background: transparent; border: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
.text-cyan { color: var(--cyan); }
.bg-cyan { background-color: var(--cyan); }
.border-cyan { border-color: var(--cyan); }
a.hover-cyan:hover, .hover-cyan:hover { color: var(--cyan); }
.btn-xs { padding: 0.2rem 0.6rem; font-size: 0.72rem; }
.text-truncate-3 { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.tracking-wider { letter-spacing: 0.05em; }
.leading-snug { line-height: 1.375; }
.cursor-pointer { cursor: pointer; }
.p-3\.5 { padding: 0.875rem; }
.mb-1\.5 { margin-bottom: 0.375rem; }
.mb-2\.5 { margin-bottom: 0.625rem; }
.mt-2\.5 { margin-top: 0.625rem; }
.px-1\.5 { padding-left: 0.375rem; padding-right: 0.375rem; }
.px-2\.5 { padding-left: 0.625rem; padding-right: 0.625rem; }
.py-0\.5 { padding-top: 0.125rem; padding-bottom: 0.125rem; }
.py-1\.5 { padding-top: 0.375rem; padding-bottom: 0.375rem; }
.gap-1\.5 { gap: 0.375rem; }
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } }
.animate-pulse { animation: pulse 2s infinite; }
@keyframes fade-in-up { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.animate-fade-in { animation: fade-in-up 0.4s ease-out; }

/* --- EUVD-Quelle & Exploit-Status Badges (gleiche Optik wie .badge-critical etc.) --- */
.badge-euvd { background: rgba(0, 240, 255, 0.15); color: #22d3ee; border: 1px solid rgba(0, 240, 255, 0.4); font-weight: 700; } /* W21 (3. Rev, fixe Messung): Badge-Tint liegt auf DUNKLEN Panels (≈ #0d3244) — Original-Cyan trägt 6.6:1; die 1.39-Messung war ein Sampler-Alpha-Artefakt. Zurückgesetzt. */
.badge-exploited { background: var(--sev-critical-bg, rgba(239, 68, 68, 0.25)); color: var(--sev-critical); border: 1px solid rgba(239, 68, 68, 0.5); font-weight: 700; }
.badge-poc { background: transparent; color: #fb7185; border: 1px dashed rgba(251, 113, 133, 0.55); font-weight: 600; }

.cve-card.low { border-left: 4px solid #38bdf8; }
.badge-low { background: rgba(56, 189, 248, 0.2); color: #7dd3fc; border: 1px solid rgba(56, 189, 248, 0.4); font-weight: 700; }

/* --- CVE-Dossier (?cve=-Detailansicht) --- */
.dossier-rejected { background: rgba(245, 158, 11, 0.12); border: 1px solid rgba(245, 158, 11, 0.45); }
.metric-tile { background: rgba(30, 41, 59, 0.55); border: 1px solid var(--border-glass); border-radius: 0.6rem; padding: 0.45rem 0.6rem; height: 100%; }
.metric-tile .metric-name { display: block; font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.metric-tile .metric-value { display: block; font-size: 0.8rem; font-weight: 700; margin-top: 2px; }
.metric-bad .metric-value { color: var(--sev-critical); }
.metric-warn .metric-value { color: #facc15; }
.metric-good .metric-value { color: #4ade80; }
.chip { display: inline-flex; align-items: center; border-radius: 9999px; padding: 0.18rem 0.6rem; font-size: 0.72rem; font-weight: 600; border: 1px solid; text-decoration: none; line-height: 1.4; }
.chip-cwe { background: rgba(34, 211, 238, 0.12); color: #67e8f9; border-color: rgba(34, 211, 238, 0.35); }
.chip-alias { background: rgba(0, 240, 255, 0.08); color: #22d3ee; border-color: rgba(0, 240, 255, 0.35); }
.chip-alias:hover { background: rgba(0, 240, 255, 0.2); color: #a5f3fc; }
.chip-vendor { background: rgba(96, 165, 250, 0.12); color: #93c5fd; border-color: rgba(96, 165, 250, 0.35); }
.chip-capec { background: rgba(245, 158, 11, 0.1); color: #fbbf24; border-color: rgba(245, 158, 11, 0.35); }
.chip-capec:hover { background: rgba(245, 158, 11, 0.22); color: #fde68a; }
.chip-attack { background: rgba(248, 113, 113, 0.1); color: #fca5a5; border-color: rgba(248, 113, 113, 0.35); }
.chip-attack:hover { background: rgba(248, 113, 113, 0.22); color: #fecaca; }
.chip-product { background: rgba(52, 211, 153, 0.1); color: #6ee7b7; border-color: rgba(52, 211, 153, 0.3); }
.dossier-refs li { padding: 0.15rem 0; }
.dossier-refs a { color: #7dd3fc; text-decoration: none; font-size: 0.78rem; word-break: break-all; }
.dossier-refs a:hover { color: #bae6fd; text-decoration: underline; }
.dossier-meta { background: rgba(30, 41, 59, 0.4); border: 1px solid var(--border-glass); }

/* --- Welle ML-16 (27.09.): Light-Scopes der themenunabhaengig
       gepinnten Dark-Paletten (R8-Walk-Funde auf #f8fafc). 600/700er-
       Pendants, alle >= 4.5:1 auf der Light-Glasflaeche. --- */
html[data-bs-theme="light"] .text-critical-rose { color: #be123c; }
/* LH1-W4b: EUVD/CWE/Alias-Badges auf #075985 vertieft (wie badge-low) —
   #0369a1 lag auf der Panel-Fläche (#ccdfea-Blend) bei 4,3:1. */
html[data-bs-theme="light"] .badge-euvd { background: rgba(8, 145, 178, 0.1); color: #075985; border-color: rgba(8, 145, 178, 0.4); }
/* Zeit- & Bedrohungs-Signale (10.10.2026): 600/700er-Pendants auf
   Light-Glas (gleiche Disziplin wie die Zeile darüber). */
html[data-bs-theme="light"] .badge-new { background: #0e7490; color: #fff; }
html[data-bs-theme="light"] .epss-trend.up { color: #b91c1c; }
html[data-bs-theme="light"] .epss-trend.down { color: #15803d; }
html[data-bs-theme="light"] .chip-cwe { background: rgba(8, 145, 178, 0.08); color: #075985; border-color: rgba(8, 145, 178, 0.35); }
html[data-bs-theme="light"] .chip-alias { background: rgba(8, 145, 178, 0.08); color: #075985; border-color: rgba(8, 145, 178, 0.35); }
html[data-bs-theme="light"] .chip-alias:hover { background: rgba(8, 145, 178, 0.16); color: #075985; }
html[data-bs-theme="light"] .chip-vendor { background: rgba(29, 78, 216, 0.08); color: #1d4ed8; border-color: rgba(29, 78, 216, 0.35); }
html[data-bs-theme="light"] .chip-capec { background: rgba(180, 83, 9, 0.08); color: #b45309; border-color: rgba(180, 83, 9, 0.35); }
html[data-bs-theme="light"] .chip-capec:hover { background: rgba(180, 83, 9, 0.16); color: #92400e; }
html[data-bs-theme="light"] .chip-attack { background: rgba(185, 28, 28, 0.08); color: #b91c1c; border-color: rgba(185, 28, 28, 0.35); }
html[data-bs-theme="light"] .chip-attack:hover { background: rgba(185, 28, 28, 0.16); color: #991b1b; }
html[data-bs-theme="light"] .chip-product { background: rgba(4, 120, 87, 0.08); color: #047857; border-color: rgba(4, 120, 87, 0.3); }
html[data-bs-theme="light"] .dossier-refs a { color: #0369a1; }
html[data-bs-theme="light"] .dossier-refs a:hover { color: #075985; }
html[data-bs-theme="light"] .dossier-meta { background: rgba(226, 232, 240, 0.5); }
html[data-bs-theme="light"] .metric-good .metric-value { color: #047857; }
/* MFF-2.5 (28.09.): Gegenheilung der hartcodierten Dunkel-Stats-Boxen —
   .metric-tile/.vendor-stat-tile blieben im Light dunkel, während die
   Text-Tokens (--text-muted/--sev-*) auf dunkle 600/700er kippten
   (dunkel-auf-dunkel). Flächen folgen dem Light-Glas-Vertrag,
   .metric-warn erhält sein 600er-Pendant (#facc15 → #a16207). */
html[data-bs-theme="light"] .metric-tile { background: rgba(226, 232, 240, 0.55); }
html[data-bs-theme="light"] .metric-warn .metric-value { color: #a16207; }
html[data-bs-theme="light"] .vendor-stat-tile { background: rgba(226, 232, 240, 0.5); }
html[data-bs-theme="light"] .vendor-stat-tile:hover { background: rgba(226, 232, 240, 0.8); border-color: rgba(8, 145, 178, 0.5); }
/* text-warning liegt Bootstrap-default (#ffc107) auf Light bei 1.6:1 —
   Projekt-Heiler aus RCI (#b45309) nachziehen, da /cve die globalen
   CSS-Ketten nicht laedt. */
/* LH1-W4b: Light-Töne auf die 800er-Stufe vertieft — #b45309/#0e7490
   lagen auf der soliden Panel-Fläche #e2e8f0 bei 4,1–4,3:1 (grenzwertig
   gefailt); #92400e/#155e75 halten 6+:1 auf Glas UND Panel. */
html[data-bs-theme="light"] .cve-page .text-warning { color: #92400e !important; }
/* Vendor-Dots/-Linien (Chart-Legende) erhalten ihre Light-Farbe als
   --vc-light inline aus dem PHP-Map (dunkler Wert bleibt Inline-Style). */
html[data-bs-theme="light"] .vendor-dot { color: var(--vc-light, #475569) !important; }
html[data-bs-theme="light"] .vendor-line { stroke: var(--vc-light, #64748b); }
/* ML-3b (27.09., ergänzend zu ML-16): Stats-Inseln — Bootstrap-.text-info
   (#0dcaf0) auf der hellen Glasfläche ≈1.7:1 (R8-Walk; intel-value,
   EUVD-ID, CW-/EPSS-Tabellen). #0e7490 = 5.1:1. */
html[data-bs-theme="light"] .cve-page .text-info { color: #155e75 !important; }
/* .badge-low war der einzige ungescoopete Severity-Badge (#7dd3fc auf
   Light-Glas ~2:1) — gleicher Aufbau wie badge-euvd oben. */
html[data-bs-theme="light"] .badge-low { background: rgba(8, 145, 178, 0.1); color: #075985; border-color: rgba(8, 145, 178, 0.4); }

/* LH1-W4b (01.10., Kontrast-Langtail 13/54 → 0): Die rgba(30,41,59,α)-
   Panels blendeten über dem hellen Grund auf #525b69/#a1a6af/#b7bbc2 —
   Token-Texte (#475569/#334155/#b45309/#0e7490) darauf = 1,2–4,4:1.
   Solide Light-Fläche via Theme-Var (Inline-Styles konsumieren sie). */
html[data-bs-theme="light"] .cve-page { --cve-panel-bg: #e2e8f0; }
/* Filter-Pills: rgba-Glas + text-muted kippte auf 1,2:1 — solides Light-
   Paar; Aktiv-/Hover-Zustand Weiß-auf-Cyan (3,0) → Weiß auf sky-800. */
html[data-bs-theme="light"] .cve-page .filter-btn { background: #e2e8f0; color: #334155; border-color: #cbd5e1; }
html[data-bs-theme="light"] .cve-page .filter-btn:hover,
html[data-bs-theme="light"] .cve-page .filter-btn.active { background: #0369a1; color: #ffffff; border-color: #0369a1; }
/* Aktiv-Filter-Chip: --cyan-soft (#0891b2) auf --cyan-bg ≈ 3,5:1. */
html[data-bs-theme="light"] .cve-page .filters-active-chip { color: #0c4a6e; }
/* Card-/Matrix-Outline-Buttons: Bootstrap btn-outline-info-Text
   #0dcaf0 auf heller Karte (21× gemessen) → cyan-800. */
html[data-bs-theme="light"] .cve-page .btn-outline-info { color: #155e75 !important; border-color: rgba(21, 94, 117, 0.6); }
/* Navbar-CVE bleibt dunkel — die Light-Heiler (#92400e/#155e75) dürfen
   die dunklen Navbar-Pills nicht treffen (dort 2,6–3,0:1); helle
   300er-Töne bestehen auf #232630 mit 7–8:1. Deckt cmdkTrigger mit. */
html[data-bs-theme="light"] .navbar-cve .text-warning,
html[data-bs-theme="light"] .navbar-cve .btn-warning,
html[data-bs-theme="light"] .navbar-cve .btn-outline-warning { color: #f59e0b !important; }
html[data-bs-theme="light"] .navbar-cve .text-info,
html[data-bs-theme="light"] .navbar-cve .btn-outline-info { color: #22d3ee !important; }
/* LH1-W4b: Lesezeichen-Pill (btn-outline-warning) — spezifischere
   (0,3,1)-Regel, damit kein anderes Light-Heilen durchgreifen kann. */
html[data-bs-theme="light"] .navbar-cve a.btn-outline-warning { color: #f59e0b !important; border-color: rgba(245, 158, 11, 0.6) !important; }

/* --- Multiselect (Hersteller-Filter aus der EUVD-Datenquelle) --- */
.multiselect { position: relative; }
.ms-panel {
    background: var(--surface-glass);
    backdrop-filter: blur(16px);
    border: 1px solid var(--border-glass);
    border-radius: 0.9rem;
    padding: 0.75rem;
    margin-top: 0.5rem;
    width: min(100%, 26rem);
}
.ms-options { max-height: 16rem; overflow-y: auto; display: flex; flex-direction: column; gap: 0.15rem; }
.ms-option {
    display: flex; align-items: center; gap: 0.5rem;
    padding: 0.3rem 0.5rem; border-radius: 0.5rem; cursor: pointer;
    font-size: 0.8rem; color: var(--color-text-heading, #e2e8f0);
}
.ms-option:hover { background: rgba(0, 240, 255, 0.07); }
.ms-option input { accent-color: var(--cyan); }
.ms-option .ms-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ms-count {
    flex: 0 0 auto; font-size: 0.66rem; font-weight: 700; color: #67e8f9;
    background: rgba(0, 240, 255, 0.1); border: 1px solid rgba(0, 240, 255, 0.25);
    border-radius: 9999px; padding: 0.05rem 0.45rem; font-variant-numeric: tabular-nums;
}

/* --- Intelligence-Stats-Kacheln (Landing) --- */
.intel-tile {
    background: var(--surface-glass);
    backdrop-filter: blur(12px);
    border: 1px solid var(--border-glass);
    border-radius: var(--radius-tile);
    padding: 0.85rem 0.95rem;
    height: 100%;
    transition: transform 0.2s ease, border-color 0.2s ease;
}
.intel-tile:hover { border-color: var(--cyan-border-strong); transform: translateY(-2px); }
.intel-tile .intel-value { display: block; font-size: 1.3rem; font-weight: 800; line-height: 1.15; }
.intel-tile .intel-label { display: block; font-size: 0.66rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-top: 0.2rem; }

/* --- Render-Performance: 60 Karten ohne Offscreen-Paint-Kosten --- */
.cve-item {
    content-visibility: auto;
    contain-intrinsic-size: auto 320px;
}
/* --- Karten-Stagger: sanftes Einlaufen, gedeckelt auf 12 --- */
#cveGrid .cve-item { animation: fade-in-up 0.4s ease-out both; }
#cveGrid .cve-item:nth-child(1)  { animation-delay: 0.02s; }
#cveGrid .cve-item:nth-child(n+2):nth-child(-n+12) { animation-delay: calc((var(--stagger, 0) + 0.02s) + 0.018s * (n - 1)); }
#cveGrid .cve-item:nth-child(n+13) { animation-delay: 0.24s; }
/* --- Sticky-Layout --- */
.navbar-cve { position: sticky; top: 0; z-index: 1030; }
@media (max-width: 767.98px) {
    .navbar-cve .container {
        flex-wrap: wrap;
        gap: 0.75rem;
    }
    .navbar-cve .container > div:last-child {
        flex-wrap: wrap;
        width: 100%;
        justify-content: flex-start;
        gap: 0.5rem;
    }
    .navbar-cve .btn-sm {
        padding: 0.35rem 0.65rem;
        font-size: 0.78rem;
    }
}
@media (min-width: 992px) {
    .dossier-aside { position: sticky; top: 5rem; }
}
/* --- Filter-Aktiv-Anzeige + Empty-State --- */
.filters-active-chip {
    display: inline-flex; align-items: center; gap: 0.4rem;
    background: var(--cyan-bg); border: 1px solid var(--cyan-border);
    color: var(--cyan-soft); border-radius: var(--radius-pill);
    padding: 0.25rem 0.8rem; font-size: 0.78rem; font-weight: 700;
}
.empty-state { border: 1px dashed var(--border-glass); border-radius: var(--radius-card); }
/* --- Command-Palette (⌘K) --- */
.cmdk-backdrop {
    position: fixed; inset: 0; z-index: 2000;
    background: rgba(7, 12, 24, 0.7); backdrop-filter: blur(4px);
    display: flex; align-items: flex-start; justify-content: center;
    padding: 8vh 1rem 1rem;
}
.cmdk-panel {
    width: min(100%, 40rem);
    background: var(--surface-glass); backdrop-filter: blur(24px);
    border: 1px solid var(--cyan-border); border-radius: 0.9rem;
    box-shadow: 0 24px 60px rgba(0, 0, 0, 0.5), 0 0 40px rgba(0, 240, 255, 0.06);
    overflow: hidden;
}
.cmdk-input {
    width: 100%; background: transparent; border: 0; outline: none;
    color: #f8fafc; font-size: 1rem; padding: 0.9rem 1.1rem;
    border-bottom: 1px solid var(--border-glass);
}
.cmdk-input::placeholder { color: var(--text-muted); }
.cmdk-list { max-height: 18rem; overflow-y: auto; padding: 0.4rem; }
.cmdk-item {
    display: flex; align-items: center; gap: 0.6rem;
    padding: 0.5rem 0.7rem; border-radius: 0.5rem;
    color: #e2e8f0; text-decoration: none; font-size: 0.88rem; cursor: pointer;
}
.cmdk-item:hover, .cmdk-item[aria-selected="true"] { background: var(--cyan-bg); color: #fff; }
.cmdk-item .cmdk-hint { margin-left: auto; font-size: 0.68rem; color: var(--text-muted); }
.cmdk-section {
    font-size: 0.64rem; text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--text-muted); padding: 0.5rem 0.7rem 0.2rem; font-weight: 700;
}
.cmdk-foot {
    display: flex; gap: 1rem; padding: 0.5rem 0.9rem; font-size: 0.66rem; color: var(--text-muted);
    border-top: 1px solid var(--border-glass); background: rgba(7, 12, 24, 0.3);
}
.cmdk-foot kbd {
    background: var(--surface-2); border: 1px solid var(--border-glass);
    border-radius: 0.3rem; padding: 0 0.3rem; font-family: var(--font-mono);
}
/* --- Mobile-Filter (<lg): Collapse-Toggle --- */
.filters-toggle { display: none; }
@media (max-width: 991.98px) {
    .filters-toggle { display: inline-flex; }
    #filterMatrix > .row { display: none; }
    #filterMatrix.expanded > .row { display: flex; }
}
/* --- Respekt vor reduced-motion: alles Bewegliche aus --- */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }
    .cve-card:hover, .intel-tile:hover, .vendor-stat-tile:hover { transform: none; }
}

/* --- Ausnutzungs-Timeline (Dossier, CSS-only) --- */
.ex-timeline { position: relative; padding: 0.2rem 0 0.1rem; }
.ex-timeline-line {
    position: absolute; left: 0.55rem; right: 0.55rem; top: 0.62rem; height: 2px;
    background: linear-gradient(90deg, var(--cyan-border) 0%, rgba(248, 113, 113, 0.5) 100%);
}
.ex-timeline-points { display: flex; justify-content: space-between; position: relative; }
.ex-tl-point { display: flex; flex-direction: column; align-items: center; gap: 0.3rem; flex: 1; min-width: 0; }
.ex-tl-dot {
    width: 0.72rem; height: 0.72rem; border-radius: 50%;
    background: var(--surface-3); border: 2px solid var(--text-muted); flex-shrink: 0;
}
.ex-tl-point.is-milestone .ex-tl-dot { background: var(--cyan); border-color: var(--cyan); box-shadow: 0 0 8px rgba(0, 240, 255, 0.5); }
.ex-tl-point.is-kev .ex-tl-dot { background: var(--sev-critical); border-color: var(--sev-critical); box-shadow: 0 0 8px rgba(239, 68, 68, 0.55); }
.ex-tl-label { font-size: 0.6rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-muted); text-align: center; line-height: 1.25; }
.ex-tl-value { font-size: 0.68rem; font-weight: 700; color: #e2e8f0; font-family: var(--font-mono); text-align: center; }
.ex-tl-point.is-kev .ex-tl-value { color: var(--sev-critical); }

/* --- Toast (Share-Feedback) --- */
.tsec-toast {
    position: fixed; right: 1.2rem; bottom: 1.2rem; z-index: 2100;
    background: var(--surface-glass); backdrop-filter: blur(16px);
    border: 1px solid var(--cyan-border); color: #e2e8f0;
    border-radius: 0.7rem; padding: 0.6rem 1rem; font-size: 0.85rem; font-weight: 600;
    box-shadow: 0 12px 30px rgba(0, 0, 0, 0.45);
}

/* --- Karten-Titel: Text-Link-Affordanz --- */
.cve-card h3 a { text-decoration: none; }
.cve-card h3 a:hover, .cve-card h3 a:focus-visible { text-decoration: underline; text-decoration-color: var(--cyan-border-strong); text-underline-offset: 3px; }

/* --- Druck-Ansicht: Dossier als heller Report-Anhang --- */
@media print {
    @page { margin: 14mm 12mm; }
    body { background: #fff !important; color: #111 !important; }
    body .text-muted { color: #555 !important; }
    .navbar-cve, .filters-toggle, #filterMatrix, #cveSearchInput, .input-group,
    #cmdkBackdrop, #cmdkTrigger, .watchlist-modal, .modal, .modal-backdrop,
    .filters-active-chip, .empty-state, .tsec-toast, #cveEmptyState,
    .vendor-stat-tile, .intel-tile, .dossier-refs a::before { display: none !important; }
    main.container { max-width: 100%; padding: 0; }
    /* Dossier: Collapse-Inhalte immer drucken */
    .collapse { display: block !important; }
    .cve-card, .dossier-meta, .cmdk-panel, .metric-tile, .ms-panel {
        background: #fff !important; backdrop-filter: none !important;
        border-color: #bbb !important; box-shadow: none !important; color: #111 !important;
    }
    .cve-card.critical { border-left-color: #b91c1c !important; }
    .cve-card.high { border-left-color: #c2410c !important; }
    .cve-card.medium { border-left-color: #a16207 !important; }
    .text-white, .fw-bold.text-white { color: #111 !important; }
    .text-info { color: #0e7490 !important; }
    /* Referenz-URLs sichtbar machen */
    .dossier-refs a::after { content: " (" attr(href) ")"; font-size: 0.66rem; color: #555; word-break: break-all; }
    /* Grid 2-spaltig, Karte kompakt */
    #cveGrid { display: grid !important; grid-template-columns: 1fr 1fr; gap: 6mm; }
    #cveGrid .cve-item { content-visibility: visible; contain-intrinsic-size: none; break-inside: avoid; }
    .ex-timeline-line { background: #999 !important; }
    a { color: #0e7490 !important; text-decoration: none; }
}
/* W14 (07.09., Auto-Audit): Dark-Lock-Kontraste — Bootstrap-Konstanten
   (text-danger #dc3545, text-success #198754, outline-secondary) liegen
   auf den fixen Dunkel-Islands der Seite bei 3.4–4.2:1. Heiler im Layer
   `bootstrap` (text-*-Utilities tragen !important — ungeschichtete
   normale Regeln verlieren gegen geschichtete Importants, css-cascade-5;
   dieses <style> lädt nach default.css → gleicher Layer, spätere
   Dokumentordnung = gewinnt). @media print oben bleibt unberührt. */
@layer bootstrap {
  .cve-page .text-danger { color: #ff8fa0 !important; }
  .cve-page .btn-outline-danger { color: #ff8fa0 !important; border-color: rgba(255, 143, 160, 0.55) !important; }
  .cve-page .text-success { color: #4ade80 !important; }
  .cve-page .btn-outline-success { color: #4ade80 !important; border-color: rgba(74, 222, 128, 0.5) !important; }
  .cve-page .btn-outline-secondary { color: #a8b6c8 !important; border-color: rgba(148, 163, 184, 0.5) !important; }
  .cve-page .cmdk-foot kbd { color: #e2e8f0 !important; background: #334155 !important; border-color: #475569 !important; }
  /* W14-Nacharbeit (Judge): btn-light ist eine HELLE Fläche in der dunklen
     Seite — der pale-red Heiler oben überschoss dort (ausgewaschen).
     Dunkles Rot auf der hellen Pill; höhere Spezifität, gleicher Layer. */
  .cve-page .btn-light.text-danger,
  .cve-page .btn-light .text-danger { color: #b91c1c !important; }
  /* Welle ML-16 (27.09.): Seit ML-3 (theme-boot) rendert /cve auch
     LIGHT — die Dark-Pins oben triffen dann helle Flächen (#f8fafc
     bei 1.6-2.6:1). Light-Gegenstücke: gleicher Layer, spaeter +
     html[data-bs-theme]-spezifischer -> gewinnt nur im Light. */
  html[data-bs-theme="light"] .cve-page .text-danger { color: #b91c1c !important; }
  html[data-bs-theme="light"] .cve-page .btn-outline-danger { color: #b91c1c !important; border-color: rgba(185, 28, 28, 0.55) !important; }
  /* LH1-W4b: #047857 kollabierte auf der hellen Emerald-Badge-Fläche
     (#cdeedd) auf 3,9:1 — Emerald-800 hält 5,9:1 auf beiden Flächen. */
  html[data-bs-theme="light"] .cve-page .text-success { color: #065f46 !important; }
  html[data-bs-theme="light"] .cve-page .btn-outline-success { color: #047857 !important; border-color: rgba(4, 120, 87, 0.5) !important; }
  /* btn-outline-secondary BEWUSST NICHT gescoped: der Dark-Pin (#a8b6c8)
     bedient die fix dunkle Header-Leiste, die auch im Light dunkel
     bleibt — ein Light-Wert machte dort 2.0:1 draus (Walk 27.09.). */
  html[data-bs-theme="light"] .cve-page .cmdk-foot kbd { color: #0f172a !important; background: #e2e8f0 !important; border-color: #cbd5e1 !important; }
  /* ML-3b (27.09.): btn-outline-warning trägt KEIN text-warning — die
     text-warning-Heilung greift hier nicht (Bootstrap-eigenes #ffc107
     = 1.56:1 auf Light-Glas: 🔖 Lesezeichen, 2× NVD-Eintrag, 📡 RSS
     Feed). Gleicher Layer, später + Theme-spezifischer. */
  html[data-bs-theme="light"] .cve-page .btn-outline-warning { color: #b45309 !important; border-color: rgba(180, 83, 9, 0.55) !important; }
  /* LH1-W4b: Die Navbar-CVE bleibt auch im Light dunkel — #b45309 auf
     #232630 = 3,0:1. Die Ausnahme MUSS im selben Layer stehen (nach
     :878): geschichtete Importants schlagen ungeschichtete. Amber-500
     auf Navbar-Dunkel = 7,4:1. */
  html[data-bs-theme="light"] .navbar-cve a.btn-outline-warning { color: #f59e0b !important; border-color: rgba(245, 158, 11, 0.6) !important; }
}
/* ML-4 (27.09.): Dock-/Safe-Variablen — /cve lädt design_tokens.css
   nicht, mobile.css:793 (body-Dock-Reserve) und der Dock selbst
   brauchen sie aber. Ohne diese Zeilen war die Reserve ungültig
   (invalid at computed-value time → padding 0). */
:root {
    --ts-dock-height: 64px;
    --ts-dock-safe: env(safe-area-inset-bottom, 0px);
}
/* MFF-CVE (04.10.): GT-Floating über dem mobilen Dock heben. /cve lädt
   design_tokens.css bewusst nicht (ML-4) — dessen .gtl--floating-Heiler
   (MFF-W15/AP14: Dock 64px + 8px Luft + Safe-Area) fehlte hier deshalb,
   und der Sprachknopf klebte AUF dem Bottom-Dock (Live-Screenshot
   390px, 04.10.). Gleiche Regel, gleicher Vertrag, page-scoped.
   /cve behält den Knopf bewusst (MFO-Entscheid 03.10.), nur angehoben. */
@media (max-width: 991.98px) {
    .gtl--floating {
        --gtl-float-bottom: calc(var(--ts-dock-height, 64px) + 8px + var(--ts-dock-safe, env(safe-area-inset-bottom, 0px)));
    }
}
/* ML-4: Mobile-LIVE-Badge (Navbar bleibt auch im Light dunkles Glas —
   Badge ist deshalb theme-neutral). Fail-closed via PHP unten. */
.cve-live-badge {
    display: inline-flex; align-items: center; gap: .45rem;
    padding: .28rem .8rem; border-radius: 999px;
    background: rgba(239, 68, 68, 0.15); border: 1px solid rgba(239, 68, 68, 0.45);
    color: #fca5a5; font-weight: 700; font-size: .8rem; text-decoration: none;
}
.cve-live-badge:hover, .cve-live-badge:focus { color: #fecaca; }
.cve-live-dot {
    width: 8px; height: 8px; border-radius: 999px; background: #ef4444;
    animation: cveLivePulse 1.6s ease-in-out infinite;
}
@keyframes cveLivePulse {
    0%, 100% { opacity: 1; transform: scale(1); }
    50% { opacity: .35; transform: scale(.8); }
}
.cve-live-peak { color: #fff; font-size: .78rem; }
@media (max-width: 575.98px) {
    .cve-live-badge { padding: .28rem .55rem; }
}
