/* ═══════════════════════════════════════════════════════════════
   MALERPLUS · SCHÄRFE-PAKET (Windows-Niveau)  — additiv, opt-in
   ---------------------------------------------------------
   Vorgang MP-20260901-017 · Spezifikation: Ida Neumann (ux-brand-designer)
   Umsetzung: Jonas Falk (product-engineer) · 01.09.2026
   Reparaturrunde nach NICHT-BESTANDEN-QA: Jonas Falk · 01.09.2026, abends
   Spezifikation: docs/ai-company/handoffs/MP-20260901-017-schaerfe-spezifikation.md
   QA-Bericht:    docs/ai-company/qa/2026-09-01-MP-017-schaerfe-qa.md (Lena Berger)
   Fix-Log:       docs/ai-company/handoffs/MP-20260901-017-umsetzung-jonas.md (Abschnitt „Reparaturrunde")

   WICHTIG — Lage seit der ersten Fassung geändert:
   `index.html` verdrahtet diese Datei inzwischen per <link ...?v=20260901sharp1>
   (Zeile ~1963) und core/mp-sharpness-toggle.js per <script defer ...>
   (Zeile ~473). Die Flagge ist damit auf JEDEM Windows-Rechner automatisch
   AN, sobald ausgerollt wird — kein reiner Test-Schalter mehr, sondern die
   künftige Voreinstellung für die Mehrheit der Desktop-Nutzer. Der frühere
   @import in mp-typography.css wurde zurückgebaut (Datei = Vor-017-Stand,
   NICHT wieder anfassen).

   ZWECK:
   Marcel empfindet die App im Browser auf Windows weicher als native
   Windows-Oberflächen. Diese Datei bündelt die Gegenmaßnahmen (Gewicht,
   Kontrast, Glas-hinter-Text) hinter EINEM Body-Flag, gesetzt von
   core/mp-sharpness-toggle.js:

     <body class="mp-sharp-win">   ← Auto-Erkennung Windows ODER
                                      manueller localStorage-Override

   HARTE REGEL DIESER DATEI:
   Jede einzelne Regel steht unter dem Präfix `body.mp-sharp-win`.
   Keine Ausnahme — ohne das Flag ist die Wirkung dieser Datei exakt
   null (Abnahmebedingung aus der Spezifikation, Punkt E/F.3 — von QA
   mit einer 4000-Elemente-Diffmessung bestätigt: 0 Unterschiede).

   Alle hier verwendeten Basis-Tokens (--mp-fw-*, --mp-text-muted,
   --glass-bg-solid) kommen aus mp-typography.css / design-system.css /
   mp-premium-surfaces.css / dark-mode.css und werden NICHT verändert —
   nur unter dem Flag überschrieben. `--glass-bg-solid` ist bereits von
   Haus aus themefest (Light `#ffffff` via mp-premium-surfaces.css,
   Dark `rgba(17,24,39,.96)` via dark-mode.css:92, Graphite
   `rgba(44,44,46,.96)` via dark-mode.css:5319) — das war nie das Problem.

   NEU: Die gesamte Datei steht unter @media screen, damit sie beim
   DOM-basierten PDF-/Druckweg strukturell nie mitläuft, unabhängig davon,
   ob body.mp-sharp-win dabei zufällig gesetzt ist (Koordinator-Auflage
   nach QA, spiegelt das bestehende Muster in dark-mode.css:347-367).
   ═══════════════════════════════════════════════════════════════ */

@media screen {

  /* ─────────────────────────────────────────────────────────────────
     TOKEN (nur unter dem Flag definiert — kein globaler Eintrag,
     damit ohne Flag rein gar nichts existiert, das irgendwo greifen
     könnte). Spezifikation Punkt B, Kontrastabsatz + Punkt E.1.
     Hell: 7.39:1 auf #ffffff, 7.33:1 auf --glass-bg-solid (QA-gemessen,
     besser als die in der Spezifikation behaupteten ≥6.7:1).
     ───────────────────────────────────────────────────────────────── */
  body.mp-sharp-win {
    --mp-text-muted-sharp: #47576b;
    /* Expliziter Windows-Stack fürs A/B — s. Abschnitt A unten.
       Führt zu KEINER sichtbaren Änderung ggü. var(--mp-font-stack),
       weil dessen erste beiden Glieder (-apple-system, BlinkMacSystemFont)
       auf Windows ohnehin nicht existieren und der Browser schon heute
       bis Segoe UI durchfällt — von QA im Browser bestätigt (Prüfpunkt 7). */
    --mp-font-stack-sharp: 'Segoe UI', system-ui, Arial, sans-serif;
  }

  /* FIX F-6 (QA ROT): --mp-text-muted-sharp hatte keine Dark-Fassung.
     html.dark hebt --mp-text-muted regulär auf #94a3b8 (mp-theme-tokens.css:95)
     — genau dieser bereits app-weit bewährte Wert wird hier wiederverwendet,
     statt eine neue Farbe zu erfinden: 6.92:1 auf der QA-gemessenen Dark-Card
     #111827, 6.08:1 auf #1d2430 (eigene Nachrechnung, WCAG-Formel) — beide
     über der geforderten ≥6:1-Schwelle, ohne den hellen 7.39:1-Wert anzurühren.
     Beide im Repo tatsächlich verwendeten Dark-Gates (s. z. B.
     dashboard.css:4247 `html.dark X,[data-theme='dark'] X`) werden bedient.
     BEWUSST KEIN `@media (prefers-color-scheme: dark)`: das ist in diesem
     Repo ein dokumentierter, bereits einmal gefundener und wieder entfernter
     Fehler (s. mp-mein-katalog.css:414-420, MP-20260805-005) — das Theme
     folgt der App-eigenen Umschaltung (core/dark-mode.js setzt `html.dark`),
     nicht der Betriebssystem-Einstellung. */
  html.dark body.mp-sharp-win,
  [data-theme='dark'] body.mp-sharp-win {
    --mp-text-muted-sharp: #94a3b8;
  }

  /* ═══════════════════════════════════════════════════════════════
     A. FONT-REINFORCEMENT (defensiv — im Browser bestätigt wirkungslos,
     weil kein im App-Shell erreichbares Inter existiert; QA Prüfpunkt 7
     bestätigt „Kein Inter", Rendering-Unterschied ist null)
     ═══════════════════════════════════════════════════════════════ */

  /* Basis-Elemente aus mp-typography.css (body:143, h1-h6:156) —
     identischer Wert wie var(--mp-font-stack) auf Windows, nur explizit. */
  body.mp-sharp-win,
  body.mp-sharp-win h1,
  body.mp-sharp-win h2,
  body.mp-sharp-win h3,
  body.mp-sharp-win h4 {
    font-family: var(--mp-font-stack-sharp) !important;
  }

  /* Inputs aus mp-typography.css:464-472 */
  body.mp-sharp-win input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
  body.mp-sharp-win textarea,
  body.mp-sharp-win select,
  body.mp-sharp-win .mp-input {
    font-family: var(--mp-font-stack-sharp) !important;
  }

  /* Die beiden mp-card-system.css-Stellen, die 'Inter' als (nie gezogenen)
     var()-Fallback tragen (Zeilen 44-51 und 359-365) — ohne !important im
     Original, hier trotzdem !important zur Robustheit gegen Datei-Reihenfolge. */
  body.mp-sharp-win .mp-card-title,
  body.mp-sharp-win .mp-section-title,
  body.mp-sharp-win .mp-panel-title,
  body.mp-sharp-win .modal-title,
  body.mp-sharp-win .sheet-title,
  body.mp-sharp-win .dialog-title,
  body.mp-sharp-win .mp-modal-title,
  body.mp-sharp-win .mp-sheet-title {
    font-family: var(--mp-font-stack-sharp) !important;
  }
  /* Bewusst NICHT angefasst: der dritte Inter-Fallback-Block in
     mp-card-system.css (Zeile ~255, body [class*="-card-title"]:not(...)…)
     — trägt bereits eigenes !important auf einer sehr langen :not()-Kette;
     ihn zu schlagen bräuchte künstliche Spezifitäts-Tricks für einen Wert,
     der ohnehin nie auf 'Inter' auflöst (--mp-font-stack ist immer gesetzt).
     Bewusst NICHT angefasst: .btn/.mp-button — mp-card-system.css setzt dort
     gar kein Inter (geprüft, keine Treffer), und eine .btn-*-Override wäre
     ein Verstoss gegen die stehende Regel „mp-button-system.css ist
     Standard, keine .btn-*-Overrides". Details im Umsetzungs-Handoff. */

  /* ═══════════════════════════════════════════════════════════════
     B. GEWICHT + KONTRAST  (Spezifikation Abschnitt B)
     Bestehende Tokens wiederverwendet, feste Obergrenze 700 bleibt
     unberührt (wir gehen hier max. auf 600).
     ═══════════════════════════════════════════════════════════════ */

  /* Hint/Helper — mp-typography.css:553-563, Original 400 ohne !important.
     Dark-Risiko durch die Token-Fassung oben mitbehoben (F-6) — QA hatte
     .hint/.mp-hint nur zufällig durch eine fremde, spezifischere Dark-Regel
     geschützt gesehen ("Zufall, kein Schutz"), das gilt jetzt strukturell. */
  body.mp-sharp-win .hint,
  body.mp-sharp-win .helper,
  body.mp-sharp-win .help-text,
  body.mp-sharp-win .field-hint,
  body.mp-sharp-win .mp-hint,
  body.mp-sharp-win .mp-helper {
    font-weight: var(--mp-fw-medium, 500) !important;
    color: var(--mp-text-muted-sharp) !important;
  }

  /* Card-/Modal-/Sheet-Subtitle — mp-typography.css:311-321, Original 400.
     Kein Kontrast-Override hier: Spezifikation begrenzt die Farbfrage
     ausdrücklich auf Eyebrow/Hint/KPI-Label (11-13px); Subtitle läuft auf
     --mp-text-body (14px) und ist nicht Teil dieser Korrektur. */
  body.mp-sharp-win .card-subtitle,
  body.mp-sharp-win .modal-subtitle,
  body.mp-sharp-win .sheet-subtitle,
  body.mp-sharp-win .mp-sheet-subtitle,
  body.mp-sharp-win .dialog-subtitle,
  body.mp-sharp-win .popover-subtitle {
    font-weight: var(--mp-fw-medium, 500) !important;
  }

  /* Eyebrow-Labels — mp-typography.css:325-336. Gewicht bleibt 600
     (Original schon obere Grenze) — nur der Kontrast wird korrigiert.
     War im Dark Mode ROT (F-6, 6.08:1 → 2.11:1) — mit der Token-Fassung
     oben jetzt 6.92:1/6.08:1, siehe Kommentar am Token. */
  body.mp-sharp-win .eyebrow,
  body.mp-sharp-win .section-eyebrow,
  body.mp-sharp-win .mp-eyebrow,
  body.mp-sharp-win .label-eyebrow,
  body.mp-sharp-win [class*="eyebrow"] {
    color: var(--mp-text-muted-sharp) !important;
  }

  /* KPI-/Stat-/Metric-Card-Label — mp-typography.css:421-434, Original 500.
     Laut QA aktuell 0 Vorkommen im Repo (kpi-card-label, stat-card-label,
     metric-card-label, card-subtitle, modal-subtitle, helper, help-text,
     mp-helper) — Regel bleibt trotzdem stehen (spezifikationskonform,
     zukunftssicher, kein Schaden durch tote Selektoren). */
  body.mp-sharp-win .kpi-card-label,
  body.mp-sharp-win .kpi-card .label,
  body.mp-sharp-win .stat-card-label,
  body.mp-sharp-win .stat-card .label,
  body.mp-sharp-win .metric-card-label,
  body.mp-sharp-win .metric-card .label,
  body.mp-sharp-win .mp-kpi-label {
    font-weight: var(--mp-fw-semibold, 600) !important;
    color: var(--mp-text-muted-sharp) !important;
  }

  /* ENTFERNT (Koordinator-Entscheidung nach QA, F-8): die frühere Regel
     `.dash-launch-tile-sub, .dash-launch-tile-desc { font-weight: 600 }`
     ist bewusst gestrichen. Diese 15 Dashboard-Tile-Untertitel sind ein
     von Marcel selbst am 17.05. eingestelltes Memory-Guard-Feintuning
     (mp-typography.css:196-202, "User-Feedback Patch") — die Spezifikation
     wollte sie zwar auf 500→600 anheben, aber ein Wert, den Marcel selbst
     gewählt hat, wird ihm vorgelegt (Vorher/Nachher), nicht still
     überschrieben. Memory-Guards (Dashboard-Tiles, Bottom-Nav) gelten
     damit auch hier strikt, wie in mp-typography.css selbst gefordert. */

  /* Pill/Badge/Chip/Tag und Card-/Modal-/Sheet-Titel: laut Spezifikation
     „unverändert" (schon an der oberen Grenze) — bewusst KEINE Regel hier,
     damit diese Datei keine wirkungslosen No-Op-Deklarationen führt. */

  /* ═══════════════════════════════════════════════════════════════
     C. GLAS-HINTER-TEXT  (Spezifikation Abschnitt C — nach QA NEU
     geschnitten, F-1/F-2/F-3/F-4-Reparatur)
     ═══════════════════════════════════════════════════════════════ */

  /* FIX F-1 (QA ROT, P1): Der bisherige Wildcard [class*="mp-ust-"] traf
     auch `.mp-ust-ov` — den bildschirmfüllenden Abdunkel-Vorhang der
     Info-Fenster (legacy_styles/modules/dashboard.css:4226,
     position:fixed;inset:0) — und machte ihn deckend WEISS statt
     halbtransparent dunkel: die ganze App verschwand hinter einer weißen
     Fläche (Screenshots MP-017-05/-07). Derselbe Wildcard traf zugleich
     Knöpfe/Chips/Listenzeilen/Schließkreuze (`.mp-ust-btn*`, `.mp-ust-chip`,
     `.mp-ust-li`, `.mp-ust-x`, `.mp-ust-reset`) und überschrieb dort die
     Bereichsfarbe des Kopf-Chips (Marcels Festlegung vom 28.07., F-2) UND
     tötete deren :hover-Rückmeldung, weil `background-color` mit
     `!important` jede `:hover`-Regel ohne `!important` schlägt (F-3).
     GEWÄHLTE LÖSUNG: kein Sonderfall für :hover nötig — die Auswahl auf
     die tatsächlich text-tragenden Container-Flächen zu verengen entfernt
     automatisch auch jedes hoverbare Element aus dem Geltungsbereich.
     Das ist robuster als eine :hover-Ausnahmeliste zu pflegen, die bei der
     nächsten neuen `mp-ust-*`-Klasse wieder vergessen werden könnte.
     `.mp-card-header` und die bloße `.mp-ust` entfallen ersatzlos (F-4:
     0 Vorkommen in HTML/JS außerhalb von CSS bzw. dieser Datei selbst).
     `.mp-sheet` (bloß) bewusst NICHT aufgenommen: eine sehr generische,
     mehrfach wiederverwendete Klasse (u. a. core/positions-unify.js:1169,
     modules/leads/leads.html:48) mit demselben Muster, das `.mp-ust-ov`
     zum Verhängnis wurde (position:fixed + inset:0) — zusätzlich macht
     `backdrop-filter` ein solches Element zum Containing-Block für alle
     `position:fixed`-Nachfahren (QA-Befund F-5, Mechanismus real, Schaden
     nicht belegt). Konservativ ausgelassen, bis dafür eine eigene, geprüft
     enge Regel existiert — das ist eine bewusste, über die engere QA-
     Vorgabe hinausgehende Vorsicht dieser Reparaturrunde, kein Auftrag.
     `.mp-modal` bleibt: real genutzt (legacy_styles/modules/rechnungen.css:1710,
     `.mp-modal{background:rgba(var(--mp-flaeche-rgb), .92);backdrop-filter:blur(12px);…}`),
     selbst NICHT position:fixed (das ist die separate `.mp-modal-overlay`,
     hier nicht angefasst) — kein F-5-Risiko, echte Verbesserung (Blur raus,
     Deckkraft bleibt). `.mp-ust-sheet` (dashboard.css:4228) ist die von QA
     empfohlene, tatsächlich text-tragende Fläche des Info-Fenster-Standards
     und bereits deckend (Light `var(--mp-card,#fff)`, Dark `#141922`) —
     Regel hier ist rein defensiv/gleichwertig, kein sichtbarer Unterschied. */
  body.mp-sharp-win .mp-ust-sheet,
  body.mp-sharp-win .mp-modal {
    background-color: var(--glass-bg-solid, rgba(var(--mp-flaeche-rgb), .92)) !important;
    backdrop-filter: saturate(1.05) !important;
    -webkit-backdrop-filter: saturate(1.05) !important;
  }

  /* Ausgenommen (Blur bleibt, laut Spezifikation): reine Dekorationsflächen
     ohne Text — Dock-Rahmen, Wallpaper-Vignetten, Hero-Verlaufsflächen.
     Diese Klassen stehen deshalb bewusst NICHT in der Liste oben. */

}
/* ↑ Ende @media screen. Ab hier (unterhalb dieser Zeile) steht kein
   Selektor mehr innerhalb des Screen-Gates — bewusst nur noch der
   ROLLBACK-Kommentar, kein Code. */

/* ═══════════════════════════════════════════════════════════════
   ROLLBACK (Stand 01.09. nach Verdrahtung):
   Die <link>-Zeile mp-sharpness.css?v=20260901sharp1 und die
   <script>-Zeile core/mp-sharpness-toggle.js?v=20260901sharp1 in
   index.html entfernen (der frühere @import in mp-typography.css
   wurde am 01.09. zurückgebaut, Datei ist wieder auf Vor-017-Stand).
   Kein anderer Code verweist auf mp-sharp-win-Klassen außer
   core/mp-sharpness-toggle.js, das dann folgenlos ins Leere schreibt
   (setzt nur eine Body-Klasse, keine sonstige Wirkung).
   ═══════════════════════════════════════════════════════════════ */
