/* Datenlicht: versteckt Grafana-11-Chrome die trotz ?kiosk sichtbar bleibt.
   Bekannter Regressions-Bug: github.com/grafana/grafana/issues/96627
   Mounted unter /public/datenlicht.css, injiziert via index.html-Patch im Startup. */

/* Theme-Tokens: generiert aus tokens/ via Style Dictionary.
   Quelle: tokens/*.tokens.json (W3C DTCG 2025.10).
   Regenerieren: npm run build:tokens
   Chrome-Overrides (Login, Nav, Panel-Masking) bleiben unten in dieser Datei. */
@import './datenlicht.tokens.css';

/* ===================================================================
   TYPOGRAFIE: Inter Variable self-hosted
   -------------------------------------------------------------------
   Gesamte Datenlicht-UI nutzt Inter (Rasmus Andersson). Variable Font
   liefert alle Weights 100-900 in einer Datei → 1 HTTP-Request statt 9.
   Self-hosted unter /fonts/ (Caddy liefert aus /srv/www/fonts/) — keine
   Google-Fonts-Leaks, Privacy-first.

   font-display: swap: Text erscheint sofort in system-ui, wird nach
   Inter-Load sanft ausgetauscht (vermeidet FOIT/unsichtbarer Text).

   Das format('woff2-variations')-Hint sagt dem Browser, dass es eine
   Variable-Font ist; moderne Browser (2021+) verstehen das. Alte
   Browser fallen auf format('woff2') zurueck und kriegen ebenfalls
   die Variable-Datei — verhalten sich dann wie Regular 400.
   =================================================================== */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/fonts/InterVariable.woff2') format('woff2-variations'),
       url('/fonts/InterVariable.woff2') format('woff2');
}
@font-face {
  font-family: 'Inter';
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url('/fonts/InterVariable-Italic.woff2') format('woff2-variations'),
       url('/fonts/InterVariable-Italic.woff2') format('woff2');
}

/* Global: Inter erzwingen — Grafana setzt seine Default-Font auf viele
   Elemente direkt, deshalb muessen wir mit hoher Spezifitaet dagegen
   schreiben. html-Regel + attribute-Selektor auf allen UI-Elementen.
   Tabular-Nums standardmaessig fuer Tabellen + Stat-Values, damit
   KPI-Spalten sauber ausgerichtet bleiben. */
html,
body,
button,
input,
select,
textarea,
[class*="react-grid"],
[class*="css-"] {
  font-family: var(--dl-font-sans);
}

table,
[role="table"],
[role="cell"],
[role="columnheader"],
[data-testid*="stat-panel"] [class*="value"],
[class*="big-value"],
[class*="BigValue"] {
  font-variant-numeric: var(--dl-numeric-tabular);
  font-feature-settings: "tnum", "cv11", "ss01";
}

/* Wordmark-Utility: jede Stelle die "DATENLICHT" gross-schreibt, nutzt
   dieselbe Typo. Light + gesperrte Buchstaben = technisch-nuechterner
   Ton ("Messgeraete-Beschriftung"). Drei Varianten:
   - Default: fuer E-Mail-Header, Login, kleinere Kontexte (300 / +3px)
   - --hero: fuer Landing-Hero-H1 (Thin 200 / +8px / gross)
   - --inline: fuer Fliesstext-Erwaehnungen in Artikeln (Regular / +1px)
   Logotype unterscheidet sich vom Wordmark durch Mixed Case + Bold —
   fuer Nav und kompakte Marken-Auftritte ("Datenlicht" statt "DATENLICHT"). */
.dl-wordmark {
  font-family: var(--dl-font-sans);
  font-weight: var(--dl-weight-light);
  letter-spacing: var(--dl-tracking-wordmark);
  text-transform: uppercase;
}
.dl-wordmark--hero {
  font-weight: 200;
  letter-spacing: 8px;
}
.dl-wordmark--inline {
  font-weight: var(--dl-weight-regular);
  letter-spacing: var(--dl-tracking-wide);
  text-transform: uppercase;
}
.dl-logotype {
  font-family: var(--dl-font-sans);
  font-weight: var(--dl-weight-extrabold);
  letter-spacing: var(--dl-tracking-tight);
}

/* ===================================================================
   LOGIN-SEITE: Background-Bild deaktivieren
   ---------------------------------------------------------------
   Grafana setzt den Login-Hintergrund per CSS auf public/img/g8_login_dark.svg.
   Unser Logo steht bereits prominent in der Login-Box — ein zweites im
   Hintergrund wirkt wie ein Fehler ("etwas scheint durch"). Pseudo-Element
   komplett ausblenden, Hintergrund bleibt in der Grafana-eigenen dunklen
   Flaechenfarbe.
   =================================================================== */
[class^="css-"]:has(> .login-content-box)::before,
[class*="css-"]:has(.login-content-box)::before {
  display: none !important;
}

/* ===================================================================
   LOGIN-SEITE: Footer entfremden
   ---------------------------------------------------------------
   Grafana-Login-Footer enthaelt Links zu grafana.com (Doku, Support,
   Community, Open Source). Die werden versteckt, die Grafana-Version
   am Ende bleibt stehen (Credit bleibt — wir verbergen Grafana nicht).
   Die Datenlicht-Ersatz-Links werden per JS im index.html injiziert.
   =================================================================== */
footer a[href*="grafana.com/docs"],
footer a[href*="grafana.com/products"],
footer a[href*="community.grafana.com"],
footer a[href*="grafana.com/oss"] { display: none !important; }

/* Die <li>-Parents zusammen mit dem Icon ausblenden (CSS :has wird seit 2023
   von allen modernen Browsern unterstuetzt — reicht fuer den Login-Screen). */
footer ul li:has(> a[href*="grafana.com/docs"]),
footer ul li:has(> a[href*="grafana.com/products"]),
footer ul li:has(> a[href*="community.grafana.com"]),
footer ul li:has(> a[href*="grafana.com/oss"]) { display: none !important; }

/* Versionseintrag dezenter machen — hebt sich nicht mehr von den
   Datenlicht-Eigen-Links ab, bleibt aber sichtbar als Credit. */
footer a[href*="github.com/grafana/grafana"] {
  opacity: 0.7;
  font-size: 11px;
}

/* Zusaetzliche Datenlicht-Links (werden per JS als <li class="dl-footer-link">
   injiziert) matchen den Grafana-Stil. */
footer li.dl-footer-link { margin-right: 12px; }
footer li.dl-footer-link a { color: #8db4e2; text-decoration: none; }
footer li.dl-footer-link a:hover { color: #c9ddf2; text-decoration: underline; }

/* Global Top Nav / Chrome (Breadcrumbs, Suche, User-Menu) */
[data-testid="data-testid Nav toolbar"],
[data-testid="data-testid TopBar Actions"],
header[data-testid="data-testid top nav"],
nav[aria-label="Breadcrumbs"],
[data-testid="data-testid Nav Breadcrumbs"],
[data-testid="data-testid Nav mega menu"] { display: none !important; }

/* Grafana 11.5+ SingleTopBar / Command-Palette / Sign-in-Bar
   (durchschlägt trotz ?kiosk bei anonym-Nutzern — enthält Such-Feld + "Sign in") */
header[role="banner"],
[class*="SingleTopBar"],
[class*="single-top-bar"],
[class*="TopSearchBar"],
[class*="top-search-bar"],
[class*="TopNavBarMenu"],
[data-testid="top-nav"],
[data-testid*="command-palette"],
button[aria-label*="Sign in" i],
a[href*="/login"][aria-label*="Sign" i],
[class*="TopSearchBarCommandPaletteTrigger"] { display: none !important; }

/* Dashboard-Submenu-Toolbar (TimePicker, Refresh, Add) */
[data-testid="data-testid TimePicker Open Button"],
[data-testid="data-testid RefreshPicker run button"],
[data-testid="data-testid RefreshPicker interval button"],
[data-testid="data-testid dashboard controls"],
[data-testid="data-testid Dashboard controls bar"],
.submenu-controls,
.dashboard-submenu { display: none !important; }

/* Scene-Dashboard-Header (seit 11.3 neu, Breadcrumbs + Actions) */
section[aria-label*="Page"],
.scopes-dashboards-tree-search-container,
[class*="scenes-dashboard-scene__toolbar"],
[data-testid*="Breadcrumb"] { display: none !important; }

/* Page-Toolbar komplett (oberste Zeile in der Main-Content-Area) */
[class*="page-toolbar"],
[class*="PageToolbar"] { display: none !important; }

/* Content direkt an den Rand, ohne Top-Padding */
main[aria-label="Main content"] > div:first-child,
.main-view { padding-top: 0 !important; margin-top: 0 !important; }

/* Side-Menu / Mega-Menu / Hamburger-Nav (links) — komplett verstecken */
[data-testid="data-testid dock menu button"],
[data-testid="data-testid undock menu button"],
[data-testid="data-testid navigation mega-menu"],
[data-testid="data-testid Toggle menu"],
aside[aria-label*="avigation"],
ul[aria-label*="Navigation"],
nav[aria-label*="avigation"],
[class*="MegaMenu"],
[class*="SideMenu"],
[class*="mega-menu"],
[class*="side-menu"],
[class*="dockedMegaMenu"],
[class*="AppChrome"] { display: none !important; }

/* Main-Content darf den durch Side-Menu freigewordenen Platz nutzen */
main[aria-label="Main content"],
.main-view,
[class*="AppChrome__content"] { padding-left: 0 !important; margin-left: 0 !important; }

/* Nav-Panel (9999) + Echo-Footer-Panel (9998): Grafana-Panel-Menu + Hover-Chrome
   komplett ausblenden — Einstellungen wie "View/Share/Inspect" machen hier keinen
   Sinn. Deckt Legacy-(data-panelid) und Scenes-(data-viz-panel-key) DOM ab. */
[data-viz-panel-key="panel-9999"] [data-testid*="panel menu" i],
[data-viz-panel-key="panel-9998"] [data-testid*="panel menu" i],
[data-viz-panel-key="panel-9999"] [data-testid*="menu-trigger" i],
[data-viz-panel-key="panel-9998"] [data-testid*="menu-trigger" i],
[data-viz-panel-key="panel-9999"] [aria-label*="menu" i],
[data-viz-panel-key="panel-9998"] [aria-label*="menu" i],
[data-viz-panel-key="panel-9999"] [class*="panel-menu"],
[data-viz-panel-key="panel-9998"] [class*="panel-menu"],
[data-viz-panel-key="panel-9999"] [class*="panelChrome__hoverHeader"],
[data-viz-panel-key="panel-9998"] [class*="panelChrome__hoverHeader"],
[data-panelid="9999"] [data-testid*="panel menu" i],
[data-panelid="9998"] [data-testid*="panel menu" i],
[data-panelid="9999"] [aria-label*="menu" i],
[data-panelid="9998"] [aria-label*="menu" i] { display: none !important; }

/* Hover-Header und Panel-Titel-Bereich fuer Nav + Footer vollstaendig deaktivieren,
   damit auch keine unsichtbare Klickflaeche Tab-Clicks abfaengt. */
[data-viz-panel-key="panel-9999"] header,
[data-viz-panel-key="panel-9998"] header { pointer-events: none !important; }

/* Hover-Border / Focus-Outline fuer Nav + Footer unterdruecken.
   Grafana hebt jedes Panel on-hover mit einer hellen Umrandung hervor
   (Signal "bearbeitbar"). Fuer die festverdrahteten Chrome-Panels 9999/9998
   ist das irrefuehrend — sie sind nicht editierbar. */
[data-viz-panel-key="panel-9999"],
[data-viz-panel-key="panel-9998"],
[data-viz-panel-key="panel-9999"]:hover,
[data-viz-panel-key="panel-9998"]:hover,
[data-viz-panel-key="panel-9999"] [class*="panel-container"],
[data-viz-panel-key="panel-9998"] [class*="panel-container"],
[data-viz-panel-key="panel-9999"] [class*="panelChrome"],
[data-viz-panel-key="panel-9998"] [class*="panelChrome"],
[data-panelid="9999"] [class*="panel-container"],
[data-panelid="9998"] [class*="panel-container"] {
  border-color: transparent !important;
  box-shadow: none !important;
  outline: none !important;
}
[data-viz-panel-key="panel-9999"] [class*="panel-container"]:hover,
[data-viz-panel-key="panel-9998"] [class*="panel-container"]:hover,
[data-viz-panel-key="panel-9999"] [class*="panelChrome"]:hover,
[data-viz-panel-key="panel-9998"] [class*="panelChrome"]:hover,
[data-panelid="9999"] [class*="panel-container"]:hover,
[data-panelid="9998"] [class*="panel-container"]:hover {
  border-color: transparent !important;
  box-shadow: none !important;
  outline: none !important;
}

/* ===================================================================
   MOBILE-Tweaks (<=640px). Betreffen NUR Grafana-native DOM-Elemente.
   Panel-Inhalte in htmlgraphics-Shadow-DOMs muessen im jeweiligen
   nav.py / build_*.py selbst Media-Queries mitbringen.
   Ziel: Desktop unveraendert, Handy wird lesbar.
   =================================================================== */
@media (max-width: 640px) {

  /* Echo-Widget (💭+Emoji-Popover) pro Panel ausblenden — ueberlappte
     den Panel-Titel. Der gemeinsame Echo-Footer am Dashboard-Ende
     (id=9998) liegt in einem eigenen Grid-Item und bleibt. */
  .dl-panel-echo { display: none !important; }

  /* Panel-Header: kleinere Typografie gibt dem Titel ~40% mehr Platz */
  [data-testid*="header-container"] h2,
  [data-testid*="header-container"] h6,
  [class*="panel-header-title"] {
    font-size: 13px !important;
    line-height: 1.3 !important;
    letter-spacing: 0 !important;
  }

  /* Tabellen: eng + Umbruch statt clippend.
     "Versprochen"-Spalte mit "Stimme abgelehnt" bricht jetzt mehrzeilig
     statt ausgeblendet zu werden. */
  [data-viz-panel-key] table td,
  [data-viz-panel-key] table th,
  [data-viz-panel-key] [role="cell"],
  [data-viz-panel-key] [role="columnheader"],
  .scene-panel table td,
  .scene-panel table th {
    padding: 4px 6px !important;
    font-size: 12px !important;
    white-space: normal !important;
    word-break: break-word !important;
    line-height: 1.3 !important;
  }

  /* Collapsed-Row-Header: fett, gross genug fuers Touch-Target */
  [class*="CollapsedRow"] [class*="title"],
  [class*="dashboard-row__title"] {
    font-size: 14px !important;
    padding: 10px 8px !important;
  }
}

/* ──────────────────────────────────────────────────────────────────────── */
/* Info-i per Touch erreichbar (Feinschliff-Skill Regel 4).                */
/* Grafana 11 Scenes rendert das Info-i als <span class="...panel-header-  */
/* item" tabindex="0"> mit SVG. Auf Touch-Geraeten muss der Hit-Bereich    */
/* mindestens 32x32px sein, und der Tooltip muss beim Tap oeffnen          */
/* (nicht nur Hover).                                                       */
/* ──────────────────────────────────────────────────────────────────────── */
@media (hover: none) {
  /* Panel-Header-Items (Info-i, Time-Range-Indikator): touch-friendly     */
  [class*="panel-header-item"][tabindex="0"],
  [class*="title-items-container"] > span[tabindex="0"],
  button[aria-label*="description" i],
  button[aria-label*="Description" i] {
    min-width: 32px !important;
    min-height: 32px !important;
    padding: 6px !important;
    opacity: 1 !important;
    visibility: visible !important;
    pointer-events: auto !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
  }
  /* SVG innerhalb: nicht pointer-events blockieren (sonst landet der Tap
     auf SVG, nicht auf dem Span-Wrapper → Tooltip oeffnet nicht). */
  [class*="panel-header-item"] svg,
  [class*="title-items-container"] svg {
    pointer-events: none !important;
  }
  /* Tooltip-Popover bei Tap/Focus sichtbar halten (Grafana nutzt Radix +
     Floating-UI, die Tooltips an document.body haengen). */
  [data-state="open"][role="tooltip"],
  [data-state="open"][data-radix-popper-content-wrapper],
  [class*="tooltip"][data-state="open"],
  [class*="Tooltip"][data-state="open"] {
    display: block !important;
    opacity: 1 !important;
    pointer-events: auto !important;
    z-index: 9999 !important;
  }
}

/* ──────────────────────────────────────────────────────────────────────── */
/* Mobile-Layout: Tabellen-Panels duerfen vertikal wachsen statt innen      */
/* zu scrollen. Sonst faengt der innere Scrollbar jedes Daumen-Swipe ab     */
/* und der User bleibt im Panel haengen (Feinschliff-Skill Regel 8).       */
/* ──────────────────────────────────────────────────────────────────────── */
@media (max-width: 640px) {
  /* Scroll-Chaining: wenn ein Panel-interner Scroller am Rand ankommt,
     scrollt die Dashboard-Seite weiter. Verhindert, dass Daumen-Swipes
     im Panel haengenbleiben. Grafana nutzt react-custom-scrollbars mit
     inline-styles, deshalb greift overscroll-behavior statt overflow.  */
  .scrollbar-view,
  [data-viz-panel-key] .scrollbar-view {
    overscroll-behavior: contain !important;
    scroll-behavior: smooth;
  }
  /* Scroll-Chaining auch fuer htmlgraphics-Panels (css-l8ieyt). */
  [data-viz-panel-key] [class^="css-"][class*="panel"] {
    overscroll-behavior-y: contain;
  }
  /* Tabellen-Zellen umbrechen statt clippen (Bundeslaender-Namen in 10w
     Spalten brauchen das auf 375px-Display). */
  [data-viz-panel-key] [role="cell"],
  [data-viz-panel-key] [role="row"] > div {
    white-space: normal !important;
    word-break: break-word !important;
  }
}

/* ===================================================================
   TABLET-Tweaks (641–1024px). Zwischenstufe fuer iPad/kleine Laptops.
   Panels bleiben in Grafanas 24er-Grid, aber Typografie + Inline-Grids
   werden kompakter. Konkretes: Info-i auf 32px, Panel-Header kleinere
   Typo als 3K/FullHD, Tabellen-Padding knapper.
   =================================================================== */
@media (min-width: 641px) and (max-width: 1024px) {

  /* Panel-Header: Tablet-Typografie zwischen Desktop (16px) und Mobile (13px) */
  [data-testid*="header-container"] h2,
  [data-testid*="header-container"] h6,
  [class*="panel-header-title"] {
    font-size: 14px !important;
    line-height: 1.3 !important;
  }

  /* Tabellen-Zellen: 13px + normales Wrapping */
  [data-viz-panel-key] table td,
  [data-viz-panel-key] table th,
  [data-viz-panel-key] [role="cell"],
  [data-viz-panel-key] [role="columnheader"] {
    padding: 5px 8px !important;
    font-size: 13px !important;
    white-space: normal !important;
    word-break: break-word !important;
  }
}

/* ──────────────────────────────────────────────────────────────────────── */
/* Touch-Targets auf Tablet + Mobile auf 44px hochziehen                   */
/* (WCAG 2.5.5 + Grafana-Responsive-Richtlinie 2026).                      */
/* Greift nur auf Geraeten ohne Hover + grobem Pointer — also Touch-Only. */
/* Desktop-Hover-User bleibt kompakt, Tablet-Tap wird komfortabel.        */
/* ──────────────────────────────────────────────────────────────────────── */
@media (hover: none) and (pointer: coarse) {
  /* Nav-Tabs: 44px Hit-Area (Grafana-Recht der Ersatz-Nav) */
  .dl-nav-tabs > a,
  .dl-nav-right a,
  .dl-nav-right button,
  #dl-theme-toggle {
    min-height: var(--touch-target) !important;
    display: inline-flex !important;
    align-items: center !important;
  }

  /* Datenlicht-eigene Info-i + Action-Chips + Geo-Buttons */
  .dl-info-btn,
  .dl-action-chip,
  [data-dl-touch] {
    min-width: var(--touch-target) !important;
    min-height: var(--touch-target) !important;
  }
}
