/*
vereto-app.css — Design-System-Angleichung an www.vereto.de (DESIGN-SYSTEM.md)
Neu angelegt fuer php-design (Staging), NICHT Teil der Original styles.css.
Wird ZUSAETZLICH nach styles.css geladen (Override per Ladereihenfolge + gezielte
Spezifitaet, moeglichst wenig !important).
Rundes 1 -- 2026-07-22.
*/

:root {
  --accent: #2d7a3e;
  --accent-dark: #1f5b2c;
  --accent-soft: #5a8020;
  --bg: #ffffff;
  --card-bg: #f7f8f7;
  --fg: #1a1a1a;
  --muted: #666666;
  --border: #b3b8bd; /* dekorativ: Tabellen-Trennlinien. 23.07.2026 (Uwe: "Randlinien um Eingabefelder und Tabellen sind viel zu duenn und daher schlecht zu erkennen") -- war #e2e2e2 (Kontrast ~1.2:1, praktisch unsichtbar). Nachgerechnet 25.07.2026: exakt 2.00:1 auf Weiss, nicht die frueher notierten 2.4:1. */
  /* 25.07.2026 (Code-Check): Rahmen von BEDIENELEMENTEN sind nach WCAG 1.4.11 (Non-text
     Contrast) 3:1-pflichtig -- --border erfuellt das mit 2.00:1 nicht. Eigener, dunklerer
     Token nur fuer Eingabefelder/Selects/Textareas: #8b9199 = 3.18:1 auf Weiss. Die
     dekorativen Tabellenlinien bleiben bewusst heller (dort gilt die Regel nicht). */
  --border-control: #8b9199;
  --menu-height: 36px; /* 23.07.2026 (Uwe: "Menuebalken im Verhaeltnis zur Schrift zu dick"), von 44px verkleinert */
}

/* ---------- Grundlayout / Typografie ---------- */

body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  color: var(--fg);
  background: var(--bg);
  min-height: 100vh;
}

/* 24.07.2026 (Barrierefreiheits-Audit, WCAG 2.4.1 Bypass Blocks): Skip-Link, von
   hi_head.php als erstes Element nach <body> ausgegeben. Visuell komplett unsichtbar
   (aus dem sichtbaren Bereich geschoben) bis er per Tab fokussiert wird -- Standardmuster,
   keine Aenderung am Erscheinungsbild fuer Maus-/Touch-Nutzer. position:fixed statt
   absolute, damit die Positionierung unabhaengig davon funktioniert, ob das Element (durch
   setupPageCenterWrapper(), s.u.) spaeter in den .vereto-page-center-Wrapper verschoben wird. */
.vereto-skip-link {
  position: fixed;
  top: -40px;
  left: 0;
  background: var(--accent);
  color: #ffffff;
  padding: 8px 16px;
  text-decoration: none;
  z-index: 1100001; /* ueber #head (1000001) und Dropdowns (1000002), unter flatpickr (1100000)+1 */
  transition: top 0.1s;
}
.vereto-skip-link:focus {
  top: 0;
}

/* 23.07.2026 (Thomas: "footer soll immer unten am Seitenende sein, so etwas wie full
   height"): auf kurzen Seiten (z.B. h_login.php) schwebte der Footer bisher mittig statt am
   unteren Bildschirmrand zu kleben. .vereto-page-center (per JS um den kompletten
   Body-Inhalt gelegt, s.u. setupPageCenterWrapper) wird zur Flex-Spalte auf volle
   Viewport-Hoehe; main bekommt flex:1 und wächst, um die restliche Hoehe zu fuellen und
   den Footer nach unten zu druecken. Kopfzeilen-Tabelle/Footer selbst bleiben bei ihrer
   natuerlichen Groesse (kein flex-grow). */
.vereto-page-center {
  /* 23.07.2026 (Thomas-Entscheidung nach Abwaegen): 100vh statt 60vh-Kompromiss -- Footer
     soll garantiert auf JEDER Seite am unteren Fensterrand kleben (klassisches Sticky-
     Footer-Pattern), auch wenn das auf mittellangen Content-Seiten (z.B. Rechnung) eine
     sichtbare Luecke vor dem Footer erzeugt.
     23.07.2026 Fund (Thomas: "im body ist ein padding, das ist der bug"): Legacy-styles.css
     setzt body{padding:20px 10px 0px}. Body-eigenes padding-top ADDIERT sich zur 100vh
     dieses Wrappers (Kind-Element), macht die Seite insgesamt 20px hoeher als der
     Viewport -> erzwang einen unnoetigen Mini-Scroll bis ganz ans Ende. Fix: body-
     padding-top unten neutralisieren, stattdessen HIER als box-sizing:border-box-Padding
     setzen, damit es Teil der 100vh-Boxgroesse ist statt zusaetzlich draufzukommen. */
  box-sizing: border-box;
  padding-top: 20px;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
/* 27.07.2026: :not(.vereto-hilfe-body) ergaenzt. Diese Regel gilt dem Hauptlayout, traf
   per !important aber auch das Hilfe-Fenster im iframe (h_hilfe.php setzt dieselbe
   body-Ebene) und loeschte dort den oberen Innenabstand -- die Ueberschrift klebte bei
   top:0 an der Kante und wirkte abgeschnitten (Rueckmeldung Thomas). */
body:not(.vereto-hilfe-body) {
  padding-top: 0 !important;
}
.vereto-page-center > main {
  flex: 1 0 auto;
}

/* 2026-07-23 Mobile-Scan-Fund (h_sys_session.php print_r()-Dump): <pre>-Bloecke mit langen
   unbeugsamen Zeilen (white-space:pre) sprengen auf schmalen Screens die Seitenbreite, ohne
   dass die eigene Box breiter wird -- daher greift der table[width=1000]-Ansatz hier nicht.
   Eigener Scroll-Container statt Seitenweitem Overflow. */
pre {
  max-width: 100%;
  overflow-x: auto;
  box-sizing: border-box;
}

/* 23.07.2026 (Thomas: "die App ist nach links verschoben, die Webseite ist zentriert --
   mach einen Div um alles und zentriere den Div"): EIN gemeinsamer Wrapper (per JS um den
   gesamten Body-Inhalt gelegt, siehe vereto-app.js setupPageCenterWrapper) statt einzelner
   Centering-Regeln nur auf #cssmenu/einzelnen Tabellen -- deckt automatisch auch vorher
   ungecappte Elemente ab (z.B. die Logo/"Anwendung verlassen"-Kopfzeilen-Tabelle aus
   hi_wp_header.php, die nur inline width:100% ohne jede Obergrenze hatte).
   Bewusst KEIN overflow:hidden hier -- echte breite Datentabellen (bis 1856px, Tabpflege)
   behalten ihren eigenen horizontalen Scroll-Container (.vereto-table-wrap) und duerfen
   weiterhin ueber die 1200px-Grenze hinaus INHALTLICH breiter sein; nur die sichtbare
   Ausgangsbreite ohne Scroll ist wie zuvor auf 1200px gekoppelt (unveraendert ggue. der
   vorherigen main-Regel). */
.vereto-page-center {
  max-width: 1200px;
  margin: 0 auto;
}

main {
  /* Bugfix 2026-07-22 (Thomas: 'kleiner Balken links'): urspruengliche 100px linker Margin
     reservierte einen leeren Streifen, den die WP-Hauptseite nicht hat -- ersatzlos entfernt. */
  margin-left: 0;
  padding: 0 16px 40px 16px;
}
@media (max-width: 767px) {
  main { margin-left: 0; padding: 0 12px 32px; }
}

h1 {
  color: var(--fg);
  font-family: inherit;
  font-weight: 700;
  font-size: 22px;
  padding-bottom: 8px;
  border-bottom: 2px solid var(--border);
  margin-bottom: 14px;
}

a { color: var(--accent); }
a:visited { color: var(--accent); }
a:hover { color: var(--accent-dark); }

/* ---------- Buttons ---------- */
/* Legacy-Layout hat viele dichte Tabellenformulare -- volle Design-System-Pille
   (25px/13px 28px) wuerde dort umbrechen/ueberlaufen. Kompromiss: klar erkennbare
   Pillen-Form, aber kompaktere Masse. */

button,
input[type="button"],
input[type="submit"],
input[type="reset"] {
  background-color: var(--accent);
  color: #fff;
  border: none;
  /* 23.07.2026 (Uwe: "Buttons sind im Verhaeltnis zur Schrift zu dick"): Polsterung/
     Mindesthoehe verkleinert (7px 18px/36px -> 5px 16px/30px), damit die Buttons enger am
     13px-Schrifttext sitzen statt wuchtig zu wirken. */
  padding: 5px 16px;
  border-radius: 18px;
  font-family: inherit;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.15s ease;
  /* 22.07.2026: Mindestabstand -- Legacy-PHP gibt oft mehrere Buttons ohne eigenes
     Spacing hintereinander aus (z.B. Terminkalender-Navigation, Tabpflege-Blaettern) --
     ohne margin standen sie pixelgenau aneinander ("aneinandergeklebt").
     23.07.2026: margin-top testweise auf 14px erhoeht, aber dadurch rutschte z.B. der
     "Hilfe"-Button direkt neben der Seitenueberschrift sichtbar nach unten (globale
     Button-Regel trifft JEDEN Button, nicht nur die nach einer Tabelle). Zurueckgesetzt auf
     6px; der "Platz zur Tabelle"-Fall wird bereits ueber .vereto-table-wrap margin-top
     (s.u.) abgedeckt. */
  margin: 6px 10px 6px 0;
  min-height: 30px;
}

button:hover,
input[type="button"]:hover,
input[type="submit"]:hover,
input[type="reset"]:hover {
  background-color: var(--accent-dark);
}

/* 23.07.2026 (Thomas: "die X Buttons sehen nicht schoen aus" -- h_d_rechnung1.php/
   h_d_rechnungu1.php Leistungszeilen-Loeschen-Button): PHP setzt inline style="padding:0px"
   auf diese Ein-Zeichen-"x"-Buttons, das schlaegt die allgemeine Button-Regel oben (inline
   gewinnt immer gegen externes Stylesheet) -- kombiniert mit deren min-height:36px UND
   praktisch keiner Breite (Inhalt nur "x", kein eigenes padding mehr) ergab das einen sehr
   schmalen, hohen gruenen Balken statt eines Buttons. Eigene kompakte, quadratische/runde
   Form statt der Pillenform fuer alle Ein-Zeichen-"x"-Buttons. */
input[type="button"][value="x"] {
  min-height: 26px;
  height: 26px;
  width: 26px;
  min-width: 26px;
  max-width: 26px;
  padding: 0 !important;
  border-radius: 50%;
  font-size: 13px;
  line-height: 24px;
  text-align: center;
  vertical-align: middle;
}

/* 23.07.2026 (Thomas: "h_d_rechnung2.php looks bad with the icons"): hi_anz_rechnung.php
   setzt die "aendern"/"x"-Buttons per <br> direkt unter das Behandlungsdatum in derselben
   Tabellenzelle -- ohne jeden Abstand wirkt das zusammengequetscht. */
td br + input[type="button"] {
  margin-top: 8px;
}
td input[type="button"] + input[type="button"] {
  margin-left: 6px;
}

button:disabled,
input[type="button"]:disabled,
input[type="submit"]:disabled {
  /* 25.07.2026 (Code-Check): vorher --border (#b3b8bd) als Flaeche + --muted (#666) als Schrift
     = 2.87:1, praktisch unlesbar. Hellere Flaeche + dunklere Schrift ergibt 5.4:1 und bleibt
     durch die fehlende Akzentfarbe trotzdem klar als "deaktiviert" erkennbar. */
  background-color: #e6e8ea;
  color: #5a5f63;
  cursor: default;
}

/* ---------- Formularfelder ---------- */

.textfield,
input[type="text"],
input[type="password"],
input[type="email"],
input[type="number"],
input[type="date"],
/* 23.07.2026 Fund (Thomas: "leistung nothing i can see" -- h_d_rechnungu1.php/
   h_d_rechnung1.php Leistungsfeld): dieses und mehrere andere Legacy-Awesomplete-Felder
   haben GAR KEIN type-Attribut (HTML faellt implizit auf "text" zurueck, aber
   input[type="text"] matcht NUR bei explizit gesetztem Attribut) -- ohne Attribut-Selektor-
   Treffer blieb der native, graue 3D-Inset-Rahmen des Browsers stehen statt unseres
   Formularfeld-Stils. input:not([type]) faengt jedes untypisierte Legacy-Feld sitewide ab. */
input:not([type]),
select,
textarea {
  font-size: 13px;
  color: var(--fg);
  background: #ffffff;
  border: 1px solid var(--border-control);
  border-radius: 5px;
  padding: 5px 8px;
  max-width: 100%;
  box-sizing: border-box;
}
.textfield:focus,
input[type="text"]:focus,
input[type="password"]:focus,
input:not([type]):focus,
select:focus,
textarea:focus {
  outline: none;
  border-color: var(--accent);
  /* 23.07.2026 (Barrierefreiheits-Audit): 0.15 Alpha ergab nur ~1.1:1 Kontrast gegen weissen
     Hintergrund -- fuer Nutzer mit Sehschwaeche praktisch unsichtbar (WCAG 2.2 SC 2.4.11
     empfiehlt >=3:1). Auf 0.7 angehoben.
     25.07.2026 (Code-Check, nachgerechnet): 0.7 Alpha ueber Weiss ergibt effektiv #6ca278 =
     2.97:1 -- knapp UNTER den geforderten 3:1, ohne dass die Transparenz einen Nutzen haette.
     Deckende Akzentfarbe #2d7a3e liefert 5.30:1. */
  box-shadow: 0 0 0 2px var(--accent);
}
/* iOS-Autozoom-Fix: 16px Mindestschrift auf schmalen Screens */
@media (max-width: 767px) {
  .textfield, input[type="text"], input[type="password"], input[type="email"],
  input[type="number"], input[type="date"], select, textarea {
    font-size: 16px;
  }
}

/* ---------- Tabellen ---------- */

table[border="1"] {
  border-collapse: collapse;
  border: none;
}
table[border="1"] th {
  background-color: var(--card-bg);
  color: var(--fg);
  font-weight: 600;
  border: none;
  border-right: 1px solid rgba(0, 0, 0, 0.06);
  border-bottom: 2px solid var(--border);
  padding: 8px 10px;
  text-align: left;
}
table[border="1"] td {
  border: none;
  border-bottom: 1px solid var(--border);
  /* 23.07.2026 (Uwe: "keine senkrechten Linien -- finde ich mit Linien besser"; Thomas-
     Kompromiss: "ganz ganz ganz leichte Linien"): sehr helle vertikale Trennlinie statt der
     vollen Gitter-Optik -- deutlich dezenter als --border, aber als Orientierung erkennbar. */
  border-right: 1px solid rgba(0, 0, 0, 0.06);
  padding: 7px 10px;
  /* 23.07.2026 (Thomas-Screenshot: Sticky-Aktionsspalten ueberlappten sichtbaren Zelleninhalt
     bei h_tabpflege.php?tabelle=ve_ticket): Tabellenzellen clippen Inhalt standardmaessig NICHT
     (overflow:visible), lange unwrapped Inhalte konnten dadurch ueber die eigene Zellgrenze
     hinaus in Nachbarspalten (inkl. der sticky Aktionsspalten) hineinragen. Erzwingt Umbruch
     UND Clipping an der eigenen Zellgrenze -- jede Zelle bleibt visuell in ihrer eigenen Spalte. */
  overflow: hidden;
  overflow-wrap: break-word;
  word-break: break-word;
}
table[border="1"] td:last-child,
table[border="1"] th:last-child {
  border-right: none;
}
th { background-color: var(--card-bg); }

/* 23.07.2026 (Thomas: "h_tabpflege.php Formular besser designen"): generelles Update fuer
   ALLE border=1-Datentabellen (nicht mehr nur .tab_termin, s.u.) -- dichtes Vollgitter durch
   weicheres Zeilen-Design ersetzt (nur horizontale Trennlinien, kein Kaestchen-Look mehr),
   Kartenoptik (Rahmen+Schatten) um die gesamte Tabelle, Zeilen-Hover, dezente
   "neue-Zeile"-Hervorhebung fuer die Formular-Zeile am Tabellenanfang (erkennbar an
   input/select-Feldern, unabhaengig davon welche konkrete Tabelle/Seite). */
table[border="1"] tbody tr:hover td {
  background-color: rgba(45, 122, 62, 0.06);
}
table[border="1"] tr:has(> td > input, > td > select):not(:hover) td {
  background-color: rgba(45, 122, 62, 0.03);
}
.vereto-table-wrap:has(> table[border="1"]) {
  border: 1px solid var(--border);
  border-radius: 10px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
  /* NICHT overflow:hidden (Shorthand) -- das setzt auch overflow-x auf hidden und
     ueberschreibt (dank :has() hoeherer Spezifitaet) das overflow-x:auto der Basisregel
     weiter oben, wodurch breite Tabellen (>Container) gar nicht mehr horizontal scrollbar
     waren -- nur clipped, kein Scrollbalken erreichbar (2026-07-23 Thomas-Fund: "table
     smaller, cannot see other entries"). overflow-y:hidden reicht fuer die Eckenrundung. */
  overflow-x: auto;
  overflow-y: hidden;
}
.vereto-table-wrap:has(> table[border="1"]) table[border="1"] {
  border-radius: 0;
}

/* 23.07.2026 (Thomas: "modernize h_terminkalender.php, layout of the table looks so old"):
   dichtes Vollgitter (jede Zelle einzeln umrandet) + kein Kartenrahmen/Schatten wirkt wie
   eine reine Tabellenkalkulation. Weicheres, moderneres Grid speziell fuer den
   Terminkalender: nur noch horizontale Zeilentrenner (keine harten vertikalen Linien
   zwischen jeder Spalte), dezenter Hover-Zustand pro Zeile, Karten-Optik (Rahmen + Schatten)
   um die gesamte Tabelle statt um jede einzelne Zelle. Bewusst NICHT die generelle
   table[border=1]-Regel oben veraendert (betrifft zu viele andere Datentabellen), sondern
   gezielt nur .tab_termin. */
.tab_termin th,
.tab_termin td {
  border-left: none;
  border-right: none;
  border-top: none;
  border-bottom: 1px solid var(--border);
}
.tab_termin tbody tr:hover td {
  background-color: rgba(45, 122, 62, 0.06);
}
.vereto-table-wrap:has(> .tab_termin) {
  border: 1px solid var(--border);
  border-radius: 10px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
}
.vereto-table-wrap:has(> .tab_termin) .tab_termin {
  border: none;
}

/* Wrapper, den vereto-app.js um breite/scrollende Content-Tabellen legt */
.vereto-table-wrap {
  overflow-x: auto;
  max-width: 100%;
  margin-top: 14px; /* 2026-07-23 (Thomas: "zwischen Buttons und Tabelle bisschen Platz") --
                        Buttons (z.B. Blaettern-Leiste in h_tabpflege.php) stiessen direkt an
                        den Tabellenrand. */
  margin-bottom: 8px;
  -webkit-overflow-scrolling: touch;
  /* 2026-07-23 Desktop-Scan-Fund: macOS/moderne Browser blenden Scrollbalken standardmaessig
     nur bei Hover/Interaktion ein -- bei breiten Auto-Layout-Tabellen ohne width=1000
     (z.B. ve_leistungskette/ve_person auf ~1440px-Laptops) sah das wie abgeschnittener
     Inhalt aus, ohne jeden Hinweis, dass die Ändern/Löschen-Spalte per Scroll erreichbar
     ist. Dauerhaft sichtbarer, dezenter Scrollbalken statt geänderter Tabellen-Groessenlogik. */
  scrollbar-width: thin;
}
.vereto-table-wrap::-webkit-scrollbar {
  height: 10px;
}
.vereto-table-wrap::-webkit-scrollbar-thumb {
  background: var(--border);
  border-radius: 4px;
}

/* 23.07.2026 (Thomas: "Scrollbalken oben an der Tabelle"): zusaetzlicher, per JS mit dem
   eigentlichen .vereto-table-wrap synchronisierter Scrollbalken direkt ueber breiten
   Tabellen, damit man bei langen Tabellen nicht erst ans untere Ende scrollen muss, um den
   Scrollbalken zu erreichen. Nur ein 1px hoher Platzhalter mit der echten scrollWidth der
   Tabelle darin -- die sichtbare Scrollbar selbst kommt vom Browser (::-webkit-scrollbar
   greift auch hier). */
.vereto-table-topscroll {
  overflow-x: auto;
  overflow-y: hidden;
  height: 16px;
  margin-top: 14px;
  margin-bottom: -8px; /* der eigentliche .vereto-table-wrap bringt bereits margin-top:14px mit */
  scrollbar-width: thin;
}
.vereto-table-topscroll > div {
  height: 1px;
}
.vereto-table-topscroll::-webkit-scrollbar {
  height: 10px;
}
.vereto-table-topscroll::-webkit-scrollbar-thumb {
  background: var(--border);
  border-radius: 4px;
}
.vereto-table-wrap table {
  margin-bottom: 0;
}

/* ---------- Mobile-Sweep (2026-07-23, 10 Agents): border="0"-Formular-/Prosa-Tabellen
   reflowen statt in den Scroll-Wrapper zu zwingen ----------
   vereto-app.js wrapt JEDE Tabelle unconditional in .vereto-table-wrap, auch reine
   Formular-/Fliesstext-Tabellen mit fest verdrahtetem width-Attribut (z.B. h_login.php
   width=500, h_herunterladen.php/h_sysprax_upload.php width=$app_width als reiner
   Hinweistext-Container) -- das erzwingt horizontales Scrollen fuer Inhalte, die eigentlich
   umbrechen sollten (Login-Formular teilweise unbrauchbar auf Mobile, Hilfetext mitten im
   Wort abgeschnitten). ECHTE Datentabellen nutzen im gesamten Code konsequent border="1"
   (siehe table[border="1"] weiter oben) -- daher hier gezielt nur border="0"-Tabellen
   reflowen, border="1" bleibt unangetastet (horizontales Scrollen dort weiterhin gewollt). */
/* 2026-07-23 Desktop-Scan-Fund: diese Regel fehlte urspruenglich eine Media-Query, obwohl
   der Kommentar oben ausdruecklich ein Mobile-Problem beschreibt (Login-Formular auf dem
   Handy). Ungated stretchte sie auch auf Desktop JEDE border=0-Formulartabelle auf die volle
   Wrap-Breite (~1200px) -- bei zweispaltigen Label/Feld-Tabellen ohne feste Spaltenbreite
   floss die zusaetzliche Breite in die Label-Spalte, wodurch Label und Eingabefeld/Button
   teils >600px auseinanderrissen (h_kennwort.php, h_rechnungsjournal_such.php,
   h_patient_import.php u.a.). Auf Mobile bleibt die Reflow-Absicht (s.o.) erhalten, auf
   Desktop behalten diese Tabellen wieder ihre natuerliche/kompakte Breite. */
@media (max-width: 767px) {
  .vereto-table-wrap > table[border="0"] {
    width: 100% !important;
    max-width: 100%;
  }
}

/* 23.07.2026 (Breiten-Konsistenz-Check): einige echte Datentabellen (Terminkalender,
   Ablage) sind fest auf width="1000" (SESS_APP_WIDTH) verdrahtet -- seit #cssmenu auf
   1200px verbreitert wurde (s.u.), liess das auf breiten Bildschirmen einen leeren
   ~150-200px-Gap rechts neben der Tabelle entstehen. Nur diese exakte Breite auf Desktop
   (>767px, Mobile-Scroll-Verhalten bleibt unberuehrt) auf 100% des Wrap-Containers
   strecken -- betrifft NICHT breitere Tabellen (z.B. 1856px-Tabpflege-Tabellen), die
   weiterhin unveraendert horizontal scrollen. */
@media (min-width: 768px) {
  .vereto-table-wrap table[width="1000"] {
    width: 100% !important;
    max-width: 1200px; /* an #cssmenu-Breite gekoppelt, s.u. -- main selbst ist unbegrenzt */
  }
  /* 23.07.2026 Nachtrag (Thomas: "dont center the content within the container, they
     should be on the right side and using the full size" -- ein erster Versuch mit
     margin:auto allein liess schmale Formulartabellen als kompakten Block MITTIG im
     breiten 1200px-Container schweben, statt ihn auszufuellen. border=0-Formulartabellen
     sind IMMER reiner Fliesstext/Formularinhalt (nie echte mehrspaltige Datentabellen),
     daher hier bedenkenlos width:100%. */
  .vereto-table-wrap > table[border="0"] {
    width: 100%;
    max-width: 1200px;
  }
  /* border="1"-Datentabellen NICHT hier pauschal auf width:100% strecken (frueherer
     Versuch, per Live-Test widerlegt: table-layout:auto WEICHT eine zu kleine width-Vorgabe
     NICHT automatisch auf -- stattdessen wird Zellinhalt in mehrere Zeilen umgebrochen, um
     die vorgegebene Breite doch einzuhalten. Fund: ve_person (13 Spalten, natuerlich
     >1600px) wurde dadurch auf 880px zusammengequetscht statt zu scrollen). Stattdessen
     JS-gesteuert (vereto-app.js setupTableWrap): nur Tabellen, die von Natur aus SCHMALER
     als der Container sind, bekommen die Klasse .vereto-table-stretch und damit width:100%
     -- echte breite Tabellen bleiben unangetastet und scrollen weiterhin. */
  .vereto-table-wrap > table[border="1"].vereto-table-stretch {
    /* !important noetig: Legacy-PHP schreibt ein festes inline style="width:1000px"
       (SESS_APP_WIDTH aus pi_login-exec.php) auf viele Tabpflege-Tabellen -- eine
       Klassenregel ohne !important verliert gegen ein inline style, egal wie schmal
       die Tabelle von Natur aus waere (2026-07-23 Uwe/Thomas-Fund: ve_rechnungsjournal
       blieb bei 1000px statt volle Containerbreite zu nutzen). */
    width: 100% !important;
    max-width: 1200px;
  }
  /* 28.07.2026 (Kundenfeedback Scheele, Root Cause gefunden): h_tabpflege.php setzt die
     Tabellenbreite NICHT als HTML-Attribut width="1000" (das obige [width="1000"]
     traefe), sondern als Inline-Style style="width:1000px;" ($tab_width, s. h_tabpflege.php
     Zeile ~1258) -- ein voellig anderer Selektor. Die o.g. table[width="1000"]-Regel lief
     dadurch bei JEDER Tabpflege-Tabelle (u.a. ve_akte/Patientenakte) ins Leere. Attribut-
     Contains-Selektor faengt das ab, unabhaengig davon, ob vereto-app.js die Tabelle
     zusaetzlich als .vereto-table-stretch einstuft. */
  .vereto-table-wrap table.sticky[style*="width:1000px"] {
    width: 100% !important;
    max-width: 1200px;
  }
}

/* 28.07.2026 (Kundenfeedback Scheele, sehr breiter Monitor): der 1200px-Cap oben ist eine
   bewusste Design-Entscheidung vom 23.07. (Menue+Inhalt synchron begrenzt, an Bootstraps
   xl-Breakpoint angelehnt) und bleibt fuer normale/mittlere Breitbild-Monitore unveraendert.
   Auf SEHR breiten Viewports (>=1600px, deutlich ueber gaengigen 1440px-Notebook-Displays)
   bekommen Menue UND die o.g. Tabellen-Regeln stattdessen 1450px -- Menue und Inhalt bleiben
   dabei synchron (kein Auseinanderlaufen), es wird aber mehr vom vorhandenen Platz genutzt.
   Bewusst kein Cap-Entfernen (volle Fensterbreite) -- reine Datentabellen mit sehr langem
   Freitext wuerden bei unbegrenzter Breite unleserlich lange Zeilen bekommen. */
@media (min-width: 1600px) {
  #cssmenu {
    max-width: 1450px;
  }
  .vereto-table-wrap table[width="1000"],
  .vereto-table-wrap > table[border="0"],
  .vereto-table-wrap > table[border="1"].vereto-table-stretch,
  .vereto-table-wrap table.sticky[style*="width:1000px"] {
    max-width: 1450px;
  }
}

/* 2026-07-23 Mobile-Scan-Fund (h_sysprax_upload.php): Hinweistext-Box (bgcolor=#d8ddca,
   width=$app_width=1000) ist reiner Fliesstext in Tabellenform, kein Datentabellen-Raster --
   erzwang bisher auch auf Mobile horizontales Scrollen mitten im Satz/Wort, statt wie Prosa
   umzubrechen. Anders als echte breite Datentabellen (Terminkalender/Tabpflege) soll dieses
   Muster auch unterhalb 768px auf 100% reflowen. */
@media (max-width: 767px) {
  .vereto-table-wrap table[width="1000"][bgcolor="#d8ddca"] {
    width: 100% !important;
  }
  /* Trotz width:100% auf der Tabelle blieb sie durch ein hart auf width="380" verdrahtetes
     Beispielbild breiter als der Viewport -- Tabellen-Auto-Layout wird durch ein Bild ohne
     Breitenbegrenzung trotzdem auf dessen Breite aufgezogen. */
  .vereto-table-wrap table[width="1000"][bgcolor="#d8ddca"] img {
    max-width: 100%;
    height: auto;
  }
}

/* 23.07.2026 (Thomas: "modernize h_sysprax_upload.php"): Hinweisbox wirkte durch flaches
   Khaki (#d8ddca) ohne Rundung + harte schwarze 2px-Bildrahmen (inline style="border:2px
   solid black", laesst sich nur mit !important uebersteuern) sehr altbacken. Sanftere
   Kartenoptik + Design-System-Rahmenfarbe statt hartem Schwarz. */
.vereto-table-wrap:has(> table[bgcolor="#d8ddca"]) {
  border: 1px solid var(--border);
  border-radius: 10px;
  overflow: hidden;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
}
.vereto-table-wrap table[bgcolor="#d8ddca"] {
  /* 23.07.2026 Nachtrag (Thomas: "sieht nicht mehr passend aus"): Radius/Bildrahmen allein
     reichten nicht -- das satte Khaki (#d8ddca) selbst wirkte neben dem cleanen
     Design-System noch altbacken. Helle Kartenfarbe statt hartem Farbton. */
  background-color: var(--card-bg) !important;
}
/* 23.07.2026 Nachtrag (h_sysprax_upload.php Datei-Auswahl-Zeile): die generelle
   border=0-width:100%-Regel (s.u.) ist fuer normale Label+Eingabefeld-Formulare gedacht,
   riss hier aber Datei-Input und "Hochladen"-Button weit auseinander -- die
   setupPhantomColumnFix()-Spaltenbreite fuer den Button war zwar jetzt korrekt schmal,
   aber die verbleibende (uebrig breite) erste Spalte schob den Button trotzdem an den
   rechten Rand. Diese kleine 2-Elemente-Formularzeile braucht schlicht keine 1200px
   Breite -- natuerliche/kompakte Tabellenbreite behalten. */
.vereto-table-wrap:has(> table[border="0"] input[type="file"]) > table[border="0"] {
  width: auto !important;
  max-width: none !important;
}
.vereto-table-wrap table[bgcolor="#d8ddca"] img {
  border: 1px solid var(--border) !important;
  border-radius: 6px;
}
/* Datei-Auswahl + Hochladen-Button: native "Datei auswaehlen" bekommt denselben
   Button-Look wie der Rest der App (::file-selector-button), Zeile flexibel statt
   default-inline mit ungleicher Hoehe/Abstand zum "Hochladen"-Button. */
input[type="file"] {
  font-size: 13px;
  color: var(--fg);
}
input[type="file"]::file-selector-button {
  background-color: var(--accent);
  color: #fff;
  border: none;
  padding: 7px 18px;
  border-radius: 20px;
  font-family: inherit;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  margin-right: 10px;
  transition: background 0.15s ease;
}
input[type="file"]::file-selector-button:hover {
  background-color: var(--accent-dark);
}
/* 2026-07-23 Mobile-Scan-Fund (h_praxis.php): urspruenglich als Nachfahren-Selektor
   (".vereto-table-wrap table[border=0] td") formuliert -- das traf auch Zellen einer
   VERSCHACHTELTEN Compact-Preview-Tabelle (z.B. renr_gebueh_formatiert-Vorschau), die
   absichtlich kompakt/inline bleiben soll. ">"-Direktkind-Ketten (table > tbody > tr > td)
   beschraenken die Regel auf die AEUSSERE Tabelle, verschachtelte Tabellen bleiben
   unberuehrt. */
.vereto-table-wrap > table[border="0"] > tbody > tr > td,
.vereto-table-wrap > table[border="0"] > tbody > tr > th {
  width: auto !important;
  white-space: normal !important;
}
@media (max-width: 600px) {
  .vereto-table-wrap > table[border="0"] > tbody > tr {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .vereto-table-wrap > table[border="0"] > tbody > tr > td {
    display: block;
    width: 100% !important;
    box-sizing: border-box;
  }
}

/* Einzelne Formularfelder mit fest verdrahteter Breite (Legacy-HTML-size/cols-Attribute) an
   die Viewport-Breite binden -- betrifft u.a. h_praxis.php, h_patient_mit_akte.php
   (#ordner_akte), h_patient_import.php. */
@media (max-width: 600px) {
  input[type="text"], input[type="email"], input[type="password"],
  input[type="tel"], input[type="date"], select, textarea {
    max-width: calc(100vw - 40px);
    box-sizing: border-box;
  }
}

/* 23.07.2026 (Thomas: "obere Buttons besser gestalten"): das aktive-Klient-Banner
   (hi_patient_print.php, table.vereto-patient-banner) hat 2 nebeneinander stehende
   Tabellenzellen (Klient-Button+Infotext | Akte-Button). Die generelle Mobile-Regel
   "Buttons werden vollbreit" presste den 2. Button dadurch auf die Breite seiner eigenen,
   sehr schmalen Zelle zusammen ("Ax" statt "Akte"). Zellen stattdessen komplett stapeln. */
@media (max-width: 600px) {
  table.vereto-patient-banner tr {
    display: flex;
    flex-direction: column;
  }
  table.vereto-patient-banner td {
    display: block;
    width: 100% !important;
    text-align: left !important;
  }
}

/* Kleine Touch-Targets vergroessern (Apple/Google-Richtwert 8px Mindestabstand, siehe
   button-margin-Kommentar weiter oben) -- Checkboxen (u.a. SEPA-Einwilligung
   h_concreativ_sepa.php, Dokumentenauswahl h_ablage.php) waren nur ~13x13px klickbar. */
@media (max-width: 600px) {
  input[type="checkbox"], input[type="radio"] {
    /* 25.07.2026 (Code-Check): 20px lagen unter den 24x24 CSS-px, die WCAG 2.2 AA
       (2.5.8 Target Size Minimum) fordert -- gerade bei SEPA-Einwilligung und
       Dokumentenauswahl ist ein Fehlklick teuer. */
    width: 24px;
    height: 24px;
  }
}

/* Praxislogo-Link im Kopfbereich war nur ~22px hoch -- unter der 32px-Mindestklickflaeche.
   25.07.2026 (Code-Check): der fruehere Zusatzfilter img[src*="praxislogo"] traf nur Praxen
   MIT hochgeladenem Logo -- im Standardfall zeigt SESS_APP_LOGO auf ein Bild unter
   /vereto/images/, dort griff weder die Mindestklickflaeche noch der Ueberlaufschutz. */
a[href="hm_main.php"] img {
  min-height: 32px;
  padding: 6px 4px;
  box-sizing: content-box;
  /* 2026-07-23 CI-Fund: die umgebende <td width="50"> ist nur eine HTML-Breitenangabe,
     kein hartes Limit -- ein sehr breites Logo (Seitenverhaeltnis >3, von der App an
     anderer Stelle bereits als Sonderfall behandelt, z.B. zentrierte Ausgabe auf
     Dokumenten) sprengt die Kopfzeile, da das <img> selbst keine Breitenbegrenzung hatte.
     max-width gilt wegen box-sizing:content-box NUR fuer den Bildinhalt, das horizontale
     Padding (4px+4px) kommt oben drauf -- 152px Inhalt + 8px Padding = 160px Gesamtbreite
     (CI-Lauf 2026-07-23 hatte hier zunaechst 160px angesetzt und damit 168px Gesamtbreite
     gemessen, s. DesignAccessibilityRegressionCest). */
  max-width: 152px;
  width: auto;
  height: auto;
}

/* ---------- Kopfbereich (hi_wp_header.php) ---------- */

/* 25.07.2026 (Code-Check): hm_main.php gab denselben id="head_top" ein zweites Mal aus
   (doppelte id = invalides HTML, und document.getElementById trifft immer nur das erste
   Element). Dort jetzt .vereto-head-top; die Optik bleibt ueber diese Sammelregel gleich. */
#head_top,
.vereto-head-top {
  font-family: inherit;
  font-weight: 600;
  color: var(--fg);
}

/* Logo-/Verlassen-Leiste (Times-New-Roman-Tabelle aus hi_wp_header.php).
   25.07.2026 (Code-Check): die frueheren Selektoren "main + table" und
   "body > table:first-of-type" konnten strukturell nie treffen -- <main> umschliesst die
   gesamte Seite bis zum Footer (kein table-Geschwister danach), und setupPageCenterWrapper()
   haengt alle body-Kinder in .vereto-page-center um (kein table mehr direkt unter body).
   Die Tabelle traegt ihr font-family inline, daher der Attribut-Selektor. */
.vereto-page-center > table[style*="Times New Roman"],
main > table[style*="Times New Roman"] {
  font-family: inherit !important;
}

/* ---------- Hauptmenue #cssmenu ---------- */

#cssmenu {
  height: auto;
  min-height: var(--menu-height);
  border-radius: 8px;
  background: var(--accent);
  border-bottom: none;
  display: flex;
  align-items: stretch;
  position: relative;
  z-index: 1000001;
  /* 23.07.2026: Menue an eine feste Breite binden, statt unbegrenzt die volle Fensterbreite
     zu fuellen -- vorher wirkte die Seite darunter auf breiten Bildschirmen schmaler als
     das Menue. Bewusst NUR hier (nicht auf main, s.o.), damit einzelne breitere Elemente
     (z.B. 1856px-Tabpflege-Tabellen) trotzdem ihre volle Breite behalten koennen.
     1200px (Thomas-Wunsch, entspricht dem recherchierten Web-Standard-Container, siehe
     Bootstrap xl-Breakpoint 1140-1200px) statt der urspruenglichen 1000px (SESS_APP_WIDTH).
     23.07.2026 Nachtrag (Thomas: "die App ist nach links verschoben, die Webseite ist
     zentriert" -- Vergleich mit der echten WordPress-Seite, deren Hauptcontainer zentriert
     ist): margin:auto ergaenzt, um auf breiten Bildschirmen wie die Webseite mittig zu
     sitzen statt linksbuendig mit Leerraum nur rechts. Die zuvor hier dokumentierte Sorge
     ("Menue und Inhalt laufen auseinander") wird durch die begleitend ergaenzte Zentrierung
     der width=1000-Tabellen (s.u.) und der border=0-Formulartabellen aufgeloest -- beide
     zentrieren sich jetzt im Gleichschritt mit dem Menue, nur echte UEBERBREITE Tabellen
     (>1200px, z.B. 1856px-Tabpflege) bleiben bewusst linksbuendig/scrollend. */
  max-width: 1200px;
  margin-left: auto;
  margin-right: auto;
}
#cssmenu:after,
#cssmenu ul:after { content: none; }

#cssmenu > ul {
  display: flex;
  flex-wrap: wrap;
  /* 23.07.2026 (Nachtrag "abmelden" rechtsbuendig): das <ul> selbst schrumpfte bisher auf
     seine Inhaltsbreite (kein width-Wert vorhanden) -- die "leere" Flaeche rechts war
     tatsaechlich AUSSERHALB des Flex-Containers (nur #cssmenu-Hintergrundfarbe), nicht
     Slack INNERHALB der Flex-Zeile. margin-left:auto auf dem letzten <li> hatte dadurch
     nichts zum Verbrauchen. Erst width:100% gibt der Flex-Zeile echten Restraum. */
  width: 100%;
  float: none; /* Original styles.css setzt "float:left" auf #cssmenu > ul; bei display:flex
                  wird das ignoriert, aber sobald mobil auf display:block umgeschaltet wird,
                  greift das Float wieder und der Menue-Container kollabiert (klassischer
                  Float-Collapse-Bug) -- daher hier explizit zuruecksetzen. */
}
#cssmenu > ul > li { float: none; }

/* 23.07.2026 (Thomas: "abmelden" soll immer als letztes im Menue stehen, rechtsbuendig):
   hi_head.php haelt den "abmelden"-Link ohnehin bereits als strukturell letzten Top-Level-
   <li> -- margin-left:auto im Flex-Container schiebt ihn zusaetzlich sichtbar an den
   rechten Rand statt direkt links neben "Downloads" zu kleben. Wirkt nur im horizontalen
   Desktop-Menue (display:flex); in der mobilen Drawer-Ansicht (display:block) ohne Effekt. */
#cssmenu > ul > li:last-child {
  margin-left: auto;
}

#cssmenu a {
  background: none;
  filter: none;
  color: #ffffff;
  font-family: inherit;
  font-size: 13px;
  font-weight: 600;
  line-height: var(--menu-height);
  padding: 0 16px;
}

#cssmenu > ul > li:first-child > a,
#cssmenu > ul > li:last-child > a {
  border-radius: 0;
}

#cssmenu > ul > li:hover > a,
#cssmenu > ul > li.active > a {
  background: var(--accent-dark) !important;
  color: #fff;
  box-shadow: none;
}
#cssmenu > ul > li:hover:after { display: none; }

#cssmenu .has-sub ul {
  background: #ffffff;
  border: 1px solid var(--border);
  border-radius: 6px;
  box-shadow: 0 6px 18px rgba(0,0,0,0.12);
  min-width: 210px;
  padding: 4px 0;
  margin-top: 0; /* Bugfix 2026-07-22 (Thomas: Dropdown verschwindet beim Reinbewegen der Maus) --
                    4px margin-top riss eine tote Zone zwischen Menuepunkt und Dropdown auf; die
                    Sichtbarkeit haengt an #cssmenu .has-sub:hover (reines CSS-:hover auf der LI),
                    ein absolut positioniertes Kind mit Gap dazwischen verliert den Hover-Zustand
                    genau in dieser Luecke -- Dropdown flackert/verschwindet, bevor man klicken kann.
                    Fix: Dropdown buendig ohne Gap, Hover-Bereich bleibt durchgehend. */
  overflow: visible;
  z-index: 1000002;
}
#cssmenu .has-sub ul li a {
  background: none;
  border-bottom: none;
  color: var(--fg);
  font-weight: 400;
  line-height: 1.3;
  padding: 8px 14px;
}
#cssmenu .has-sub ul li:hover a,
#cssmenu .has-sub ul li a:hover {
  background: var(--card-bg);
  color: var(--accent-dark);
}

/* 28.07.2026 (Benutzersymbol statt "<Name> abmelden"-Textlink, letzter Menuepunkt rechts):
   #cssmenu > ul > li:last-child bleibt rechtsbuendig (siehe margin-left:auto oben), das
   Untermenue selbst ist aber weiterhin von Haus aus links (styles.css: position:absolute,
   kein right/left-Reset) -- bei diesem Menuepunkt ganz am rechten Rand wuerde es damit ueber
   den Viewport-Rand hinausragen. left:auto+right:0 haengt es stattdessen am rechten statt am
   linken Rand des Symbols auf. */
#cssmenu > ul > li.vereto-user-menu > ul {
  left: auto;
  right: 0;
}
.vereto-user-icon {
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
}
.vereto-user-icon svg {
  display: block;
  fill: currentColor;
}
#cssmenu > ul > li.vereto-user-menu > a {
  padding-left: 14px;
  padding-right: 14px;
}
#cssmenu .has-sub .has-sub ul {
  margin-top: 0; /* siehe Bugfix-Kommentar oben -- gleicher Grund, kein Gap fuer Untermenues */
  /* 23.07.2026 Nachtrag (Thomas-Screenshot: "immer geht das Menue zu wenn man zu langsam ist"
     -- Patient > Patienten-Uebersicht > alle/in Behandlung): DIESE Desktop-Regel hatte noch
     die alten 2px (die Mobile-@media-Variante derselben Selektorkette wurde bereits auf 0
     gefixt, diese hier wurde uebersehen -- zwei separate Deklarationen, gleiches Problem). */
  margin-left: 0;
}

/* Klick-basiertes Aufklappen fuer Touch (vereto-app.js setzt .vereto-open) */
#cssmenu .has-sub.vereto-open > ul { display: block; }

/* 24.07.2026 (Barrierefreiheits-Audit, WCAG 2.1.1 Keyboard): Untermenues oeffnen bisher nur
   per :hover (styles.css) oder per Klick auf Touch/Mobile (.vereto-open, s.o.) -- reine
   Tastaturnutzer, die per Tab auf den has-sub-Trigger kommen, hatten keinen Weg, das
   Untermenue zu oeffnen. :focus-within zeigt es zusaetzlich, sobald der Trigger-Link selbst
   ODER eines seiner (dann bereits sichtbaren) Kind-Links den Fokus haelt -- rein additiv,
   aendert nichts am bestehenden Hover-/Klick-Verhalten fuer Maus/Touch. */
#cssmenu .has-sub:focus-within > ul { display: block; }

/* Sichtbarer Fokusring auf den Menuelinks selbst -- ohne diesen ist beim reinen Tabben durch
   das Menue (bevor irgendein Untermenue offen ist) ueberhaupt nicht erkennbar, welcher
   Menuepunkt gerade fokussiert ist (WCAG 2.4.7 Focus Visible). */
#cssmenu a:focus-visible {
  outline: 2px solid #ffffff;
  outline-offset: -2px;
}
#cssmenu .has-sub ul li a:focus-visible {
  outline: 2px solid var(--accent-dark);
  outline-offset: -2px;
}

/* ---------- Mobiles Menue ---------- */

.vereto-menu-toggle {
  display: none;
}

@media (max-width: 767px) {
  /* 23.07.2026 (Thomas: "Menue-Button an die Webseite anpassen"): reines Icon wie auf der
     echten WordPress-Seite -- kein gruener Kasten/keine Pillenform, kein Text mehr (nur noch
     das Hamburger-Symbol selbst), rechtsbuendig neben dem Hilfe-Button (siehe vereto-app.js,
     der den Button jetzt in die Kopfzeile statt vor #cssmenu einfuegt). */
  .vereto-menu-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: none;
    color: var(--fg);
    border: none;
    border-radius: 6px;
    padding: 4px 8px;
    /* 2026-07-23 Mobile-Scan-Fund: ohne margin-left stand der Toggle nur 4px neben dem
       Hilfe-Button (Tabellenzellen-Padding allein reicht nicht) -- unter dem 8px-Touch-
       Target-Mindestabstand. */
    margin-left: 8px;
    font-size: 28px;
    line-height: 1;
    cursor: pointer;
    /* 23.07.2026 (Thomas: "sieht komisch aus wenn man draufsrueckt"): mobile Browser zeigen
       auf Tap standardmaessig ein graues Rechteck ueber Buttons ohne eigenen Hintergrund --
       wirkt bei einem reinen Icon ohne sichtbare Button-Flaeche besonders unpassend.
       Tap-Highlight deaktiviert, eigener dezenter Pressed-Zustand stattdessen. */
    -webkit-tap-highlight-color: transparent;
    /* 25.07.2026 (Code-Check): hier stand zusaetzlich outline:none. Gegen den grauen
       Tap-Highlight reicht -webkit-tap-highlight-color allein -- outline:none entfernte
       zusaetzlich den Tastatur-Fokusring, und der Ersatz (background: #f7f8f7 auf weisser
       Seite = 1.03:1) war praktisch unsichtbar. Damit war der Menue-Button auf schmalen
       Viewports fuer Tastaturnutzer nicht mehr auffindbar (WCAG 2.4.7). */
  }
  .vereto-menu-toggle:active {
    background: var(--card-bg);
  }
  .vereto-menu-toggle:focus-visible {
    background: var(--card-bg);
    outline: 2px solid var(--accent);
    outline-offset: 2px;
  }
  #cssmenu { display: none !important; }
  /* 23.07.2026 (Thomas: "App-Menue an das Menue der Webseite anpassen"): die echte
     WordPress-Seite zeigt ihr aufgeklapptes Mobilmenue als flache, helle Liste (weisser/
     hellgrauer Hintergrund, dunkler Text, duenne Trennlinien zwischen den Punkten) --
     kein massiver gruener Block mit weissem Text wie bisher in der App. Hintergrund/
     Textfarbe hier gezielt ueberschrieben, Struktur (Aufklapp-Mechanik) unveraendert. */
  #cssmenu.vereto-menu-open {
    display: block !important;
    height: auto !important;
    overflow: visible !important;
    border-radius: 8px;
    background: #ffffff;
    border: 1px solid var(--border);
  }
  #cssmenu.vereto-menu-open > ul {
    display: block !important;
    height: auto !important;
    flex-direction: column;
  }
  #cssmenu.vereto-menu-open > ul > li {
    display: block !important;
    width: 100% !important;
    float: none !important;
    height: auto !important;
    border-bottom: 1px solid var(--border);
  }
  #cssmenu.vereto-menu-open > ul > li:last-child { border-bottom: none; }
  #cssmenu.vereto-menu-open a { color: var(--fg); }
  #cssmenu.vereto-menu-open > ul > li:hover > a,
  #cssmenu.vereto-menu-open > ul > li > a:hover { background: var(--card-bg); color: var(--fg); }
  #cssmenu a { display: block; line-height: 1.4; padding: 12px 16px; }
  #cssmenu .has-sub ul {
    position: static;
    box-shadow: none;
    border: none;
    border-radius: 0;
    background: var(--card-bg);
    margin: 0;
    width: 100%;
    min-width: 0;
  }
  #cssmenu .has-sub ul li { border-bottom: 1px solid var(--border); }
  #cssmenu .has-sub ul li:last-child { border-bottom: none; }
  #cssmenu .has-sub ul li a { color: var(--fg); padding: 10px 28px; font-weight: 500; }
  #cssmenu .has-sub ul li:hover a,
  #cssmenu .has-sub ul li a:hover { background: var(--border); color: var(--fg); }
  #cssmenu .has-sub .has-sub ul { margin-left: 0; }
  #cssmenu.vereto-menu-open .has-sub.vereto-open > ul {
    display: block !important;
    height: auto !important;
  }
  #cssmenu.vereto-menu-open .has-sub:not(.vereto-open) > ul { display: none !important; }
}

/* ---------- Footer (hi_wp_footer.php) ---------- */

#main-footer table {
  background-color: var(--card-bg) !important;
  color: var(--fg);
  border-top: 1px solid var(--border);
}
#main-footer table a { color: var(--accent); }
#main-footer table tr:last-child td {
  background-color: transparent !important;
  color: var(--muted) !important;
}

/* 23.07.2026 (E2E-Fund: Login-Seite ueberlaeuft bei 375px Breite vertikal um bis zu
   ~280px): der eigentliche Footer (nicht die obige Tabellen-Variante, sondern die neuere
   Div/Flex-Version mit INLINE styles fuer die 2 Spalten "Rechtliches"/"Services") legt
   beide Spalten mit flex:1 1 220px + gap:32px an -- bei <440px passen 2x220px nicht mehr
   nebeneinander, flex-wrap wirft sie untereinander UND behaelt den vollen 32px-Gap auch
   vertikal bei. Auf kurzen Seiten (z.B. Login) reisst das die Gesamthoehe klar ueber die
   100vh des Sticky-Footer-Wrappers. Inline-Styles brauchen !important zum Overriden. */
@media (max-width: 480px) {
  #main-footer { margin-top: 8px !important; }
  #main-footer > div:first-child {
    padding: 10px 16px 4px !important;
    gap: 4px !important;
  }
  #main-footer > div:first-child > div {
    flex-basis: 100% !important;
  }
  #main-footer > div:first-child > div > div:first-child {
    margin-bottom: 2px !important;
  }
  #main-footer > div:first-child > div > div:last-child {
    gap: 2px !important;
  }
  #main-footer > div:last-child {
    line-height: 20px !important;
  }
  /* Kopfzeilen-Logo hat ein festes HTML-width="235" -- auf 375px-Screens allein durch die
     img-Breite ~80px hoch, traegt spuerbar zum Vertikal-Overflow bei (s.o. Footer-Fund). */
  .vereto-table-wrap img[src*="vereto-logo"] {
    max-width: 160px !important;
    height: auto !important;
  }
}

/* ---------- Scroll-Buttons ---------- */

#btn-up, #btn-down {
  background: var(--accent);
  color: #fff !important;
  border: none;
  border-radius: 50%;
  width: 40px;
  height: 40px;
}
#btn-up:hover, #btn-down:hover { background: var(--accent-dark); }

/* ---------- Login-Formular ---------- */

form[action="h_login-exec.php"] input[type="text"],
form[action="h_login-exec.php"] input[type="password"] {
  width: auto;
  max-width: 100%;
  box-sizing: border-box;
}
@media (max-width: 480px) {
  /* "Zugangscode"-Feld ist per size-Attribut recht breit (Platzhalter
     "Passwort+Schluessel") und lief auf sehr schmalen Screens ueber den
     Rand hinaus. WICHTIG: hier NICHT width:100% verwenden -- die Login-Tabelle
     hat kein table-layout:fixed, ein 100%-Input in einer Zelle treibt dort die
     Spalten-/Tabellenbreite immer weiter auf (Feedback-Loop, kompletter
     horizontaler Seiten-Overflow). Fester max-width haelt es dagegen sicher
     innerhalb des Viewports. */
  form[action="h_login-exec.php"] input[type="text"],
  form[action="h_login-exec.php"] input[type="password"] {
    width: auto;
    max-width: 62vw;
  }
}

/* ---------- Praxis/Termine-Domaene (Agent 2026-07-22) ----------
   Radio-/Checkbox-Akzentfarbe: native Browser-Controls (z.B. Taetigkeitsart-Radios
   in h_praxis.php) rendern sonst im Browser-Default-Blau, klar Off-Brand gegen das
   gruene Farbschema. accent-color ist eine reine Praesentations-Eigenschaft (keine
   Layout-Aenderung), breite Browser-Unterstuetzung. */
input[type="radio"],
input[type="checkbox"] {
  accent-color: var(--accent);
}

/* h_praxis.php/h_praxis_sicher01.php: "Archiv + Akte einschalten"-Zelle nutzt inline
   style="background-color:LawnGreen" als Aufmerksamkeits-Hinweis (nur sichtbar, wenn
   Archivierung aktuell aus ist) -- reines Neongruen, klarer Off-Brand-Ausreisser gegen
   die gruene Markenfarbe. Ueberschreibung per Attribut-Selektor (kein PHP-Edit noetig,
   !important noetig um Inline-Style zu schlagen). */
td[style*="LawnGreen"] {
  background-color: rgba(45, 122, 62, 0.14) !important;
  color: var(--fg) !important;
}

/* ---------- Briefe/Hilfe-Domaene (Agent 2026-07-22): CKEditor Mobile-Overflow-Fix ----------
   h_d_brief_kunde.php (Brief an Klienten/Blanko-Dokument/andere Person) bindet CKEditor 4
   klassisch an eine <textarea> -- CKEditor berechnet daraus eine FESTE Pixelbreite (hier
   667px, aus dem urspruenglichen textarea cols/width-Attribut), die NICHT mit dem Viewport
   mitschrumpft. Auf 390px-Mobilviewports trieb das den gesamten Seiten-scrollWidth auf 689px
   (horizontaler Seiten-Scroll ueber die ganze Seite, nicht nur den Editor). Fix: CKEditors
   Chrome-Rahmen an die verfuegbare Breite binden statt an die urspruengliche Inline-Breite. */
.cke_chrome, .cke, .cke_inner {
  max-width: 100% !important;
  width: auto !important;
  box-sizing: border-box !important;
}
/* 23.07.2026 (Thomas: "Dokument groesser und besser ausrichten", gilt fuer alle Dokumente/
   CKEditor-Instanzen sitewide -- Brief an Kunde, Textvorlagen, etc.): Editor auf eine
   grosszuegige, aber begrenzte Breite bringen (statt der von CKEditor urspruenglich
   berechneten schmalen Textarea-Breite) und die Schreibflaeche deutlich vergroessern.
   Nachtrag 23.07.2026 (Thomas: "use for the editor also the full width"): 960px-Deckel
   entfernt -- der Editor soll wie die uebrigen Formulartabellen die volle 1200px-
   Containerbreite ausnutzen, statt mittig/schmal zu wirken. */
.cke_chrome {
  width: 100% !important;
  max-width: 1200px !important;
}
.cke_contents {
  height: 520px !important;
}
@media (max-width: 767px) {
  .cke_toolbox, .cke_toolbar, span.cke_toolgroup {
    flex-wrap: wrap;
  }
}

/* ---------- Mobile-QA-Sweep-Agent (2026-07-22): 3.-Menueebene-Flyout-Overflow-Fix ----------
   Original styles.css definiert eine spezifischere Desktop-Flyout-Regel fuer die 3. Menue-
   ebene (`#cssmenu .has-sub .has-sub ul { position:absolute; left:100%; top:0; }`, 3 Klassen)
   als die vorhandene mobile Akkordeon-Ueberschreibung (`#cssmenu .has-sub ul`, nur 2 Klassen)
   -- per CSS-Spezifitaet gewinnt die Desktop-Regel, daher blieb die 3. Ebene (z.B. Klient >
   Klienten-Uebersicht > alle/in Behandlung/nicht in Behandlung; Abrechnung > Rechnungsjournal >
   ...) auf Mobilviewports absolut positioniert und schoss weit ueber den rechten Rand hinaus
   (gemessen: 714px Scrollbreite bei 390px Viewport, kompletter horizontaler Seiten-Scroll).
   Fix: gleiche Selektor-Tiefe (3 Klassen) mit expliziter Positionierung, nur im Mobile-Breakpoint. */
@media (max-width: 767px) {
  #cssmenu.vereto-menu-open .has-sub .has-sub ul {
    position: static !important;
    left: auto !important;
    top: auto !important;
    width: 100% !important;
    margin-left: 12px;
  }
}

/* ---------- Mobile: Buttons generell als volle-Breite-Liste stapeln (2026-07-23) ----------
   Legacy-PHP trennt mehrere nebeneinander stehende Buttons oft mit unterschiedlich langen
   &nbsp;-Sequenzen statt echtem CSS-Spacing -- das ergibt auf schmalen Bildschirmen einen
   willkuerlich wirkenden Umbruch (mal grosse, mal kleine Luecken), selbst mit dem oben
   ergaenzten Button-margin. Statt seitenweise HTML zu aendern: auf Mobile werden ALLE Buttons
   zu einer sauberen, vollbreiten, senkrecht gestapelten Liste -- ignoriert das nbsp-Chaos
   komplett, kein PHP-Aenderungsbedarf, wirkt sitewide. */
@media (max-width: 600px) {
  button,
  input[type="button"],
  input[type="submit"],
  input[type="reset"] {
    display: block;
    width: 100%;
    max-width: 100%;
    box-sizing: border-box;
    margin: 3px 0; /* 23.07.2026 (Thomas: "Luecken kleiner machen"): von 8px auf 3px verkleinert */
  }
}

/* ---------- Terminkalender: Mobile Tagesansicht (2026-07-23, Thomas: "modernisieren...
   mobile Option") ----------
   Die Wochentabelle (bis zu 7 Tagesspalten) ist auf schmalen Screens nur per horizontalem
   Scrollen nutzbar und zeigt ohne jeden Hinweis nur die erste Spalte. vereto-app.js baut
   dynamisch (Spaltenzahl variiert je Praxis-Einstellung Sa/So) einen Tages-Umschalter und
   blendet alle Spalten bis auf den gewaehlten Tag aus -- Desktop bleibt unveraendert die
   volle Wochenansicht (Umschalter + Ausblendung greifen nur unterhalb des mobilen
   Breakpoints). */
.vereto-termin-daypicker {
  display: none;
}
@media (max-width: 767px) {
  .vereto-termin-daypicker {
    display: flex;
    /* 23.07.2026: 6px unterschritt den generellen "Buttons mind. 8px auseinander"-Smoke-Test
       (MobileLayoutSmokeCest) knapp -- keine kosmetische Korrektur, echter Mindestabstand. */
    gap: 8px;
    overflow-x: auto;
    padding: 4px 2px 10px;
    margin-top: 8px;
    -webkit-overflow-scrolling: touch;
  }
  .vereto-termin-daypicker-btn {
    /* generische Mobile-Regel (weiter oben) macht ALLE <button> zu vollbreiten,
       block-gestapelten Elementen -- hier explizit fuer die Tages-Pillen aufheben. */
    display: inline-flex !important;
    width: auto !important;
    flex: 0 0 auto;
    min-width: 52px;
    padding: 6px 10px;
    border-radius: 10px;
    border: 1px solid var(--border);
    background: var(--card-bg);
    color: var(--fg);
    font-size: 12px;
    font-weight: 600;
    line-height: 1.4;
    text-align: center;
    cursor: pointer;
    margin: 0 !important;
  }
  .vereto-termin-daypicker-btn.active {
    background: var(--accent);
    color: #ffffff;
    border-color: var(--accent);
  }
  .tab_termin .vereto-termin-hidden-mobile {
    display: none;
  }
  /* table.tab_termin traegt ein hartes HTML-width="1000"-Attribut (SESS_APP_WIDTH) --
     bleibt trotz ausgeblendeter Spalten bestehen und erzwingt unnoetiges horizontales
     Scrollen fuer die verbleibenden 2 sichtbaren Spalten (Zeit + gewaehlter Tag). In der
     Tagesansicht ist die Tabelle IMMER aktiv (s.o.), daher hier unbedingt auf die
     tatsaechlich benoetigte Breite zuruecksetzen. */
  .tab_termin {
    width: auto !important;
  }
}

/* ---------- Styled confirm()/alert()-Modal (23.07.2026) ---------- */
/* Ersetzt native OS-confirm()/alert()-Popups; Logik/Replay-Trick siehe vereto-app.js
   setupConfirmAlertOverride(). Keine PHP-Callsite-Aenderung noetig. */
.vereto-modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.45);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 2000000;
  animation: vereto-modal-fade-in 0.15s ease-out;
}
@keyframes vereto-modal-fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}
.vereto-modal {
  background: #ffffff;
  border: 1px solid var(--border);
  border-radius: 12px;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);
  width: min(420px, 90vw);
  padding: 22px 24px;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}
.vereto-modal-message {
  font-size: 14px;
  color: var(--fg);
  line-height: 1.5;
  margin-bottom: 18px;
  white-space: pre-line;
}
.vereto-modal-buttons {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
}
.vereto-modal-btn {
  border: none;
  border-radius: 18px;
  padding: 7px 18px;
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
}
.vereto-modal-btn-cancel {
  background: #eeeeee;
  color: var(--fg);
}
.vereto-modal-btn-cancel:hover {
  background: #e0e0e0;
}
.vereto-modal-btn-ok {
  background: var(--accent);
  color: #ffffff;
}
.vereto-modal-btn-ok:hover {
  background: var(--accent-dark);
}
.vereto-modal-btn-ok.vereto-modal-danger {
  background: #a3311a;
}
.vereto-modal-btn-ok.vereto-modal-danger:hover {
  background: #7e2513;
}

/* ---------- Diagnose-/Leistungs-Awesomplete-Felder volle Breite (23.07.2026) ---------- */
/* Uwe: "Eingabefelder Diagnose und Leistung sind viel zu kurz" (h_d_rechnung1.php,
   id="awe_diag$i"/"awe_leist$i", Legacy-Inline-Cap max-width:585px) + Thomas: "hier bitte
   volle Breite wir haben Platz" (h_d_rechnungu1.php, id="awe$i", Cap 500px). Container ist
   inzwischen 1200px breit -- die alten Caps stammen aus der Zeit der schmalen 1000px-Tabellen.
   !important noetig, da es ein Inline-style-Attribut im PHP ueberschreibt. */
input[id^="awe"] {
  max-width: 100% !important;
}
/* Awesomplete (JS-Lib) wrappt das Input in <div class="awesomplete"> mit
   display:inline-block (shrink-to-fit) -- das Input-eigene width:100% hat dadurch keinen
   echten Elternbreite-Bezug und der Browser faellt auf die intrinsische Default-Breite
   zurueck (~186px). Wrapper braucht selbst eine echte Breite. */
.awesomplete {
  display: block !important;
  width: 100% !important;
}

/* 23.07.2026 (Thomas: "hier ist auch nicht volle breite" -- h_d_rechnungu1.php): die
   Loesch-Button-Spalte hat KEIN <td> im Kopfzeilen-<tr> (5 Kopf- vs. 6 Datenspalten) und
   keinerlei Breitenangabe -- als einzige voellig unbeschraenkte Spalte saugt sie sich durch
   das erzwungene table-width:100% die komplette Rest-Breite, sichtbar als leere Flaeche
   rechts neben "Gesamt". Reines CSS (width, :has(), width:1%+nowrap) wird von
   table-layout:auto dabei NICHT respektiert (empirisch getestet) -- echter Fix ist
   setupPhantomColumnFix() in vereto-app.js (fuegt ein echtes <col>-Element ein). */

/* ---------- Hilfe-Popup (#iFr) Modernisierung (23.07.2026) ---------- */
/* Uwe: "Hilfe hat noch einen Bug" -- die wiederhergestellte Legacy-Iframe-Positionierung
   (top:90px;left:150px;width:570px;height:400px, inline im PHP) war fuer das alte, schmalere
   Layout gedacht und ueberlappte im neuen Design das gruene Menue (kein eigener Backdrop,
   kein hoher z-index). Modernisiert: zentriertes, festes Panel oberhalb von allem (inkl.
   Menue), mit Karten-Optik + unscharfem, abgedunkeltem Hintergrund (Klick daneben schliesst,
   siehe show()/hide()-Erweiterung in hi_head.php). */
#iFr {
  position: fixed !important;
  top: 50% !important;
  left: 50% !important;
  transform: translate(-50%, -50%) !important;
  width: min(760px, 92vw) !important;
  height: min(620px, 86vh) !important;
  z-index: 2000000 !important;
  border: 1px solid var(--border) !important;
  border-radius: 12px !important;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3) !important;
  background: #ffffff !important;
}
.vereto-hilfe-backdrop {
  display: none;
  position: fixed;
  inset: 0;
  background: rgba(20, 20, 20, 0.35);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  z-index: 1999999;
}
.vereto-hilfe-body {
  padding: 24px 28px 20px;
  box-sizing: border-box;
  overflow-y: auto;
  height: 100%;
}
.vereto-hilfe-body h3 {
  margin-top: 0;
  color: var(--accent-dark);
}
.vereto-hilfe-body form {
  margin-top: 20px;
  text-align: right;
}

/* ---------- Tabellen-Suche (23.07.2026, "gerne mit Suche") ---------- */
.vereto-table-search {
  display: block;
  width: 100%;
  max-width: 320px;
  margin: 0 0 12px;
  padding: 7px 12px;
  font-size: 13px;
  border: 1px solid var(--border);
  border-radius: 18px;
  box-sizing: border-box;
  background: #ffffff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") no-repeat 10px center;
  background-size: 14px;
  padding-left: 32px;
}
.vereto-table-search:focus {
  outline: none;
  border-color: var(--accent);
}

/* ---------- Farb-Legenden modernisieren (23.07.2026, h_anz_leistungskette.php) ---------- */
/* Legende fuer Praxis-/Standard-/inaktive Leistungsketten war eine rohe, hart eingefaerbte
   Tabelle (bgcolor="#daffff"/"#ffddb1") -- wirkt neben dem cleanen Design altbacken. Chip-Optik
   ueber Attribut-Selektor (kein PHP-Edit noetig, gleiches Muster wie andere bgcolor-Faelle). */
td[bgcolor="#daffff"],
td[bgcolor="#ffddb1"] {
  border-radius: 999px !important;
  padding: 5px 16px !important;
  font-size: 12px !important;
  font-weight: 600;
}
/* 25.07.2026 (Code-Check): die jeweils zweite Variante "table:has(> tr > td[...])" konnte nie
   treffen -- der HTML-Parser fuegt immer ein <tbody> ein, ein <tr> ist also nie Direktkind
   von <table>. Entfernt: das waren drei der teuersten Selektoren der Datei (jeder :has()-
   Selektor wird gegen JEDE Tabelle im Dokument evaluiert, inkl. der grossen Datentabellen). */
table:has(> tbody > tr > td[bgcolor="#daffff"]) {
  border: none !important;
  background: transparent !important;
}
table:has(> tbody > tr > td[bgcolor="#daffff"]) tr {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}
table:has(> tbody > tr > td[bgcolor="#daffff"]) td {
  border: none !important;
}

/* ---------- h_tabpflege.php Aktionsspalte (23.07.2026, echtes Redesign statt JS-Patch) ---------- */
/* Auf Thomas' Wunsch direkt im PHP umstrukturiert: Aendern+Loeschen (und der Zufuegen-Button
   der Einfuege-Zeile) sitzen jetzt in EINER einzigen, semantischen Spalte (class=
   "vereto-action-col") statt in einem colspan="2"-Konstrukt mit zwei getrennten <td>s --
   macht die ganze setupPhantomColumnFix()/setupStickyActionColumns()-Heuristik fuer DIESE
   Tabelle ueberfluessig (kein Kopf/Daten-Mismatch mehr, keine Inhalts-Erkennung noetig).
   Native, deterministische Sticky-Positionierung direkt per CSS. */
/* 24.07.2026 (Uwe-Testfund: "Befehlsspalte ueberlappt bei breiten Tabellen die letzte(n)
   Eingabespalte(n)" -- Rechnungsjournal-Bemerkung ab dem 3. Zeichen unsichtbar, Leistungsketten
   5. Leistung gar nicht mehr eingebbar): Root Cause war NIE die Deckkraft der Aktionsspalte
   (die 80%-Transluzenz unten war nur ein kosmetisches Pflaster fuer ein zu breites
   Nachbarfeld, das SICHTBAR optisch hineinragte -- das eigentliche Problem ist, dass
   Formularfelder in Tabellenzellen ueberhaupt ueber ihre eigene <td>-Breite hinausragen
   koennen (input/textarea/select ohne max-width richten sich nach size/cols-Attribut oder
   Intrinsic-Breite, nicht nach der tatsaechlich vom table-layout:auto zugewiesenen
   Zellbreite) -- bei einer per position:sticky fixierten Nachbarspalte (Aktionsspalte)
   wird so ein ueberlappendes Feld dann vom hoeheren z-index der Aktionsspalte teilweise
   verdeckt, nicht nur "angeschnitten". Echter Fix: Formularfelder duerfen ihre Zelle nie
   verlassen (max-width:100% + border-box), dann bleibt fuer die Aktionsspalte gar kein
   Nachbarinhalt mehr zum Ueberlappen uebrig -- macht die bisherige Transluzenz-Notloesung
   ueberfluessig, Aktionsspalte ist jetzt wieder voll deckend/solide ("ohne Blur"). */
table[border="1"] td input,
table[border="1"] td textarea,
table[border="1"] td select {
  max-width: 100%;
  box-sizing: border-box;
}
.vereto-action-col {
  position: sticky;
  right: 0;
  z-index: 3;
  background-color: var(--card-bg);
  box-shadow: -2px 0 3px rgba(0, 0, 0, 0.04);
  white-space: nowrap;
}
table[border="1"] th.vereto-action-col {
  background-color: var(--card-bg);
}
/* 23.07.2026 (Thomas: "bei hover lass es aber auch so .. nehme alles andere raus"): OHNE
   diese Regeln wuerde die allgemeine Zeilen-Hover-Tinte (gruenlich, s.u.) bzw. die
   "neue-Zeile"-Hervorhebung (Formular-Zeile mit input/select) die Aktionsspalte GENAUSO
   mitfaerben wie jede andere Zelle der Zeile -- gewollt fuer normale Datenzellen, aber die
   Aktionsspalte soll ihr eigenes, konsistentes Erscheinungsbild behalten, unabhaengig vom
   Zeilenzustand. Hoehere Spezifitaet (zusaetzliche .vereto-action-col-Klasse) gewinnt gegen
   die generischen Zeilen-Regeln, ohne !important zu brauchen. */
table[border="1"] tbody tr:hover td.vereto-action-col,
table[border="1"] tr:has(> td > input, > td > select):not(:hover) td.vereto-action-col {
  background-color: var(--card-bg);
}

/* ---------- Hinweise statt Popups (27.07.2026) ----------
   Thomas: "ich moechte gerne schoenere Fehlermeldungen ohne Popups -- Popups sind nicht mehr
   Stand der Technik". Meldungen der Anwendung (frueher window.alert -> modaler Dialog)
   erscheinen jetzt als nicht-blockierender Hinweis oben rechts. Das Formular bleibt waehrend-
   dessen bedienbar, der Hinweis verschwindet von selbst (Fehler nach 12s, sonst nach 6s) und
   laesst sich mit dem x sofort schliessen.
   Rueckfragen vor dem Loeschen bleiben bewusst ein Dialog -- das ist eine Entscheidung, kein
   Hinweis, und darf nicht wegscrollbar sein (siehe Kommentar in vereto-app.js). */
.vereto-hinweise {
  position: fixed;
  top: 16px;
  right: 16px;
  z-index: 2000001; /* ueber Menue (1000001) und Modal-Backdrop, damit ein Hinweis waehrend
                       einer offenen Rueckfrage nicht verdeckt wird */
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-width: min(420px, calc(100vw - 32px));
  pointer-events: none; /* Klicks gehen an die Seite durch -- nur der x-Button faengt sie ab */
}
.vereto-hinweis {
  pointer-events: auto;
  display: flex;
  align-items: flex-start;
  gap: 10px;
  background: #ffffff;
  color: var(--fg);
  border: 1px solid var(--border);
  border-left: 4px solid var(--accent);
  border-radius: 8px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
  padding: 12px 14px;
  font-size: 14px;
  line-height: 1.45;
  animation: vereto-hinweis-ein 0.18s ease-out;
}
.vereto-hinweis-fehler { border-left-color: #b00020; }
.vereto-hinweis-text { white-space: pre-line; flex: 1; } /* \n aus mehrzeiligen Meldungen erhalten */
.vereto-hinweis-zu {
  flex: none;
  background: none;
  border: none;
  color: var(--muted);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
  padding: 0 2px;
  margin: 0;
  min-height: 0;
  border-radius: 4px;
}
.vereto-hinweis-zu:hover { color: var(--fg); background: rgba(0, 0, 0, 0.06); }
.vereto-hinweis-zu:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
@keyframes vereto-hinweis-ein {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: none; }
}
@media (max-width: 600px) {
  /* Auf schmalen Screens ueber die volle Breite -- oben, damit der Hinweis nicht die
     Bedienelemente am unteren Rand verdeckt. */
  .vereto-hinweise { left: 12px; right: 12px; top: 12px; max-width: none; }
}
@media print { .vereto-hinweise { display: none !important; } }

/* 28.07.2026 (Uwe-Fund, Rechnungsjournal-PDF): Datenbanktabellen tragen ein festes
   Pixel-width (Legacy $tab_width/SESS_APP_WIDTH, z.B. table.sticky in h_tabpflege.php).
   Beim Drucken/PDF-Export (window.print()) schneidet der Browser Inhalte, die ueber
   den druckbaren Seitenbereich hinausragen, einfach ab -- bei Tabellen mit vielen
   Spalten (z.B. ve_rechnungsjournal) fielen dadurch die letzten Spalten (Datum Storno,
   Bemerkung) komplett weg, nicht nur schmal. Quer-Format + volle Seitenbreite statt
   der festen Pixelbreite beheben das allgemein, fuer jede border=1-Datentabelle. */
@media print {
  /* 28.07.2026 (Uwe-Fund): width:100% GENERELL auf table[border="1"] traf auch schmale
     Zweck-Tabellen wie die "Auswertungsbedingungen"-Bedingungsuebersicht in
     h_umsatz_post.php -- die zwang sich dadurch auf die volle Seitenbreite und quetschte
     die daneben stehende Praxisadresse auf ein Minimum (jedes Wort brach um). Ausserdem
     war @page{size:landscape} GLOBAL fuer jeden Druckvorgang der ganzen App wirksam, nicht
     nur fuer breite Tabellen -- unnoetiger Nebeneffekt fuer alle anderen Druckseiten.
     Beides zurueckgenommen: kein erzwungenes Querformat mehr, und die Breiten-Korrektur
     wirkt nur noch auf table.sticky (die generische Tabellenpflege-Engine aus
     h_tabpflege.php, z.B. Rechnungsjournal/Patientenakte) -- genau dort, wo viele Spalten
     tatsaechlich abgeschnitten wurden. h_umsatz_post.php hat fuer seine eigene Datentabelle
     bereits eigene <col>-Breiten (siehe dort) und ist von dieser Regel unberuehrt. */
  table.sticky {
    width: 100% !important;
    table-layout: fixed;
    font-size: 10px;
  }
  /* 28.07.2026 (Uwe-Fund, 2. Runde): h_umsatz_post.php's Datentabelle hat ein hartes HTML-
     width="1000" (SESS_APP_WIDTH) -- passte in Landscape, ragt in Portrait (kein
     erzwungenes Querformat mehr, s.o.) ueber die Seite hinaus und wird an der Papierkante
     abgeschnitten (sichtbare senkrechte Linie mitten durch die Zahlenspalten). Eigene Klasse
     statt table.sticky, weil diese Tabelle bereits eigene <col>-Prozentbreiten hat, die nicht
     durch table-layout:fixed neu verteilt werden sollen -- nur die Gesamtbreite + Schrift
     muessen sich der Seite anpassen. */
  table.vereto-print-fit {
    width: 100% !important;
    font-size: 9.5px;
  }
  /* overflow-x:auto (Bildschirm-Scrollbalken) hat auf Papier keine Wirkung ausser dem
     Content am Seitenrand abzuschneiden, weil kein Scrollen mehr moeglich ist. */
  .vereto-table-wrap { overflow: visible !important; }
}
