/* ===========================================================================
   xray — Design-System (abgeleitet aus Claude-Design-Vorlage „xray.dc.html")
   Primär #0062A6 · Inter · ruhiges, sachliches Medizintechnik-SaaS
   =========================================================================== */
:root{
  /* Brand */
  --blue:#0062A6; --blue-700:#004E85; --blue-050:#E6F0F7; --blue-100:#F1F7FC;
  /* Status */
  --green:#2D6A4F; --orange:#E8833A; --red:#D91600;
  /* Neutral */
  --ink:#1F2933; --muted:#6B7785; --muted-2:#4A5560;
  --line:#E3E8EE; --line-2:#C9D7E4; --bg:#F4F6F9; --bg-2:#F8FAFC; --card:#FFFFFF;
  /* Techniker-Farben */
  --tech-1:#0062A6; --tech-2:#2D6A4F; --tech-3:#E8833A; --tech-4:#7A4FB3; --tech-5:#00838F; --tech-6:#C2185B;
  /* Form */
  --radius:12px; --radius-sm:10px; --radius-xs:8px; --pill:999px;
  --shadow-card:0 1px 2px rgba(0,0,0,.04);
  --shadow-pop:0 12px 32px rgba(0,30,60,.18);
  --shadow-modal:0 20px 60px rgba(0,30,60,.30);
  --font:'Inter',system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html,body{margin:0;padding:0}
body{background:var(--bg);color:var(--ink);font-family:var(--font);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}
a{color:var(--blue);text-decoration:none}
h1{font-size:24px;font-weight:700;margin:0;letter-spacing:-.01em}
h2{font-size:19px;font-weight:600;margin:0}
.muted{color:var(--muted)}
code{background:var(--bg-2);padding:.1em .4em;border-radius:6px;font-size:.85em;font-family:ui-monospace,"SF Mono",Menlo,monospace}

/* ---- Topbar ------------------------------------------------------------- */
.topbar{display:flex;align-items:center;gap:18px;background:var(--card);
  border-bottom:1px solid var(--line);padding:0 22px;height:60px;position:sticky;top:0;z-index:30}
.brand{display:flex;align-items:center;gap:10px;font-weight:700}
.brand img{width:30px;height:30px;display:block}
.brand .wordmark{font-size:20px;color:var(--blue);line-height:1}
.brand .sub{font-size:12px;color:var(--muted);font-weight:500}
.mainnav{display:flex;gap:2px;margin-left:14px}
.mainnav a{padding:8px 14px;border-radius:var(--pill);color:var(--muted-2);font-weight:600;font-size:13.5px;white-space:nowrap}
.mainnav a:hover{background:var(--bg-2);color:var(--ink)}
.mainnav a.active{background:var(--blue-050);color:var(--blue)}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:14px}
.role-toggle{display:flex;background:var(--bg);border:1px solid var(--line);border-radius:var(--pill);padding:3px}
.role-toggle span{padding:5px 14px;border-radius:var(--pill);font-size:12.5px;font-weight:600;color:var(--muted)}
.role-toggle span.on{background:var(--blue);color:#fff}
.userbox{display:flex;align-items:center;gap:9px}
.avatar{width:34px;height:34px;border-radius:50%;background:var(--blue);color:#fff;display:grid;place-items:center;font-size:12.5px;font-weight:700}
.userbox .uname{font-size:13.5px;font-weight:700;line-height:1.1}
.userbox .urole{font-size:11.5px;color:var(--muted)}
.btn-logout{border:1px solid var(--line);border-radius:var(--pill);padding:8px 16px;color:var(--ink);font-size:13px;font-weight:600}
.btn-logout:hover{background:var(--bg-2)}

/* ---- Layout ------------------------------------------------------------- */
.content{max-width:1180px;margin:0 auto;padding:34px 30px 80px}
.page-head{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:22px;gap:16px}
.page-head .sub{color:var(--muted);font-size:13.5px;margin-top:3px}
.head-actions{display:flex;gap:10px;align-items:center}

/* ---- Buttons ------------------------------------------------------------ */
.btn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--card);
  color:var(--ink);padding:11px 20px;border-radius:var(--pill);font-weight:600;font-size:13.5px;font-family:inherit;cursor:pointer;line-height:1;white-space:nowrap}
.btn:hover{background:var(--bg-2)}
.btn-primary{background:var(--blue);border-color:var(--blue);color:#fff}
.btn-primary:hover{background:var(--blue-700)}
.btn-soft{background:var(--blue-050);border-color:transparent;color:var(--blue)}
.btn-soft:hover{background:#dbe9f5}
.btn-danger{background:var(--card);border-color:var(--red);color:var(--red)}
.btn-danger:hover{background:#fff0ef}
.btn-sm{padding:7px 14px;font-size:12.5px}

/* ---- Cards / stats ------------------------------------------------------ */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-card)}
.card-pad{padding:24px}
.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:18px;margin-bottom:22px}
.stat{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-card);padding:20px 24px}
.stat-label{color:var(--muted);font-size:13px;font-weight:500}
.stat-num{display:block;font-size:32px;font-weight:700;color:var(--ink);margin-top:6px;letter-spacing:-.02em}

/* ---- Section card header ------------------------------------------------ */
.section{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-card);overflow:hidden}
.section-head{display:flex;align-items:center;justify-content:space-between;padding:18px 24px;border-bottom:1px solid var(--line)}
.section-head h2{font-size:16px}

/* ---- Appointment list (Dashboard) --------------------------------------- */
.appt-list{list-style:none;margin:0;padding:0}
.appt-list li{display:flex;align-items:center;gap:14px;padding:16px 24px;border-bottom:1px solid var(--line)}
.appt-list li:last-child{border-bottom:0}
.dot{width:9px;height:9px;border-radius:50%;flex:0 0 auto}
.appt-when{font-weight:600;min-width:96px;font-size:13.5px}
/* Aktionen rechtsbündig in Spalten — unabhängig von der Länge des Kundennamens */
.appt-actions{margin-left:auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}
.appt-actions .t-badge{min-width:86px;text-align:center;justify-content:center}
.appt-main{display:flex;flex-direction:column}
.appt-title{font-weight:600}
.appt-meta{color:var(--muted);font-size:12.5px}
.appt-user{margin-left:auto;color:var(--muted);font-size:13px}

/* ---- Forms / Dialog ----------------------------------------------------- */
.form{display:flex;flex-direction:column;gap:14px;min-width:0}
.form fieldset,.form label,.form .row,.sr-scroll{min-width:0}
.form label{display:flex;flex-direction:column;gap:6px;font-size:12.5px;font-weight:600;color:var(--muted-2)}
.form input,.form select,.form textarea{font:inherit;font-size:14px;color:var(--ink);padding:11px 14px;
  border:1px solid var(--line-2);border-radius:var(--radius-sm);background:var(--card)}
.form input:focus,.form select:focus,.form textarea:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-050)}
.form .row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
/* ---- Aktion im Eingabefeld ----------------------------------------------
   Ein Knopf, der bündig im Feld sitzt (z. B. „Kunden-Nr. übernehmen"). Der
   Vorschlag selbst steht als Platzhalter im Feld — der Knopf holt ihn herein,
   überschreiben bleibt jederzeit möglich. */
.field-inline{position:relative;display:block;min-width:0}
.field-inline > input{width:100%}
/* Platz für den Knopf nur reservieren, solange er auch da ist — sonst stünde die
   Eingabe dauerhaft eingerückt. Die Klasse setzt das JavaScript. */
.field-inline.has-action > input{padding-right:calc(var(--in-field-w, 108px) + 12px)}
.in-field-btn{position:absolute;top:50%;right:6px;transform:translateY(-50%);
  border:1px solid transparent;background:var(--blue-050);color:var(--blue);
  padding:6px 12px;border-radius:var(--pill);font:inherit;font-size:12px;font-weight:600;
  line-height:1;cursor:pointer;white-space:nowrap}
.in-field-btn:hover{background:#dbe9f5}
.in-field-btn:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
/* Handy: Der Knopf darf dem Eingabefeld nicht die halbe Breite wegnehmen. */
@media(max-width:480px){ .in-field-btn{padding:6px 10px;font-size:11.5px} }

/* ---- Aktions-Chips ------------------------------------------------------
   Kompakte Pillen für Nebenaktionen an einem Datenblock (Adresse: Navigation,
   Kopieren). Gleiche Formensprache wie der Knopf im Eingabefeld: sie sollen
   sich in den Info-Block einfügen, statt als vollwertige Knöpfe daneben zu
   stehen — auf dem Handy nahmen die sonst eine ganze Zeile ein. */
.chip-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.chip-action{display:inline-flex;align-items:center;gap:5px;border:1px solid transparent;
  background:var(--blue-050);color:var(--blue);padding:6px 12px;border-radius:var(--pill);
  font:inherit;font-size:12px;font-weight:600;line-height:1;cursor:pointer;
  white-space:nowrap;text-decoration:none}
.chip-action:hover{background:#dbe9f5}
.chip-action:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
/* zweitrangig (Kopieren): ruhiger als die Hauptaktion daneben */
.chip-action.chip-quiet{background:var(--bg-2);color:var(--muted-2);border-color:var(--line)}
.chip-action.chip-quiet:hover{background:var(--card)}

/* ---- Kunden-Picker (Universalfilter: Suche + Chip + Dropdown) ------------ */
.cust-picker{position:relative}
.cust-picker-input{width:100%;font:inherit;font-size:14px;color:var(--ink);padding:11px 14px;
  border:1px solid var(--line-2);border-radius:var(--radius-sm);background:var(--card)}
.cust-picker-input:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-050)}
.cust-picker-chip{display:flex;align-items:center;gap:8px;padding:9px 6px 9px 14px;
  border:1px solid var(--line-2);border-radius:var(--radius-sm);background:var(--blue-050);min-height:44px}
.cust-picker-chip>span{flex:1;font-size:13.5px;color:var(--ink)}
.cust-picker-x{border:none;background:none;color:var(--muted);cursor:pointer;font-size:20px;line-height:1;
  padding:2px 8px;border-radius:6px}
.cust-picker-x:hover{color:var(--red);background:#fdecea}
.cust-picker-list{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:50;max-height:260px;overflow-y:auto;
  background:var(--card);border:1px solid var(--line-2);border-radius:var(--radius-sm);box-shadow:var(--shadow-pop)}
.cust-picker-item{display:flex;flex-direction:column;gap:1px;padding:9px 14px;cursor:pointer;border-bottom:1px solid var(--line)}
.cust-picker-item:last-child{border-bottom:0}
.cust-picker-item:hover{background:var(--blue-050)}
.cpi-name{font-weight:600;font-size:13.5px;color:var(--ink)}
.cpi-meta{font-size:12px;color:var(--muted)}
.cust-picker-empty{padding:12px 14px;color:var(--muted);font-size:13px}

/* Auswahl-Overlay (openListPicker): Kasten in der Bildschirmmitte, 65 dvh hoch,
   Suchfeld oben, tippfilterbare Scroll-Liste darunter. Ersetzt die native datalist,
   deren Browser-Dropdown bei langen Listen (Modellkatalog ~340) unbedienbar ist.
   Bewusst OHNE .dialog-Klasse: deren max-height/padding-Regeln passen hier nicht. */
.list-picker{width:min(560px,94vw);height:65dvh;margin:auto;padding:0;border:none;border-radius:14px;
  background:var(--card);box-shadow:var(--shadow-modal);overflow:hidden}
.list-picker[open]{display:flex;flex-direction:column}
.lp-head{display:flex;gap:6px;align-items:center;padding:12px 12px 10px;border-bottom:1px solid var(--line);flex:0 0 auto}
/* 16px Schriftgröße ist Pflicht: darunter zoomt iOS beim Fokussieren die ganze Seite */
.lp-search{flex:1;min-width:0;font:inherit;font-size:16px;color:var(--ink);padding:11px 14px;
  border:1px solid var(--line-2);border-radius:var(--radius-sm);background:var(--card)}
.lp-search:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-050)}
.lp-close{border:none;background:none;color:var(--muted);cursor:pointer;font-size:24px;line-height:1;
  padding:6px 10px;border-radius:8px;flex:0 0 auto}
.lp-close:hover{color:var(--red);background:#fdecea}
.lp-list{flex:1;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.lp-item{padding:13px 16px;cursor:pointer;border-bottom:1px solid var(--line);font-size:14px;color:var(--ink)}
.lp-item:last-child{border-bottom:0}
.lp-item:hover{background:var(--blue-050)}
.lp-item-strong{font-weight:600;color:var(--blue-700)}
.lp-item-create{border-top:1px solid var(--line)}
.lp-meta{font-size:12px;color:var(--muted)}
.lp-empty{padding:14px 16px;color:var(--muted);font-size:13.5px}

.alert{padding:11px 14px;border-radius:var(--radius-sm);font-size:13.5px;margin-bottom:14px}
.alert-error{background:#fdecea;color:var(--red);border:1px solid #f5c6c0}
.info-banner{background:var(--blue-050);color:var(--blue-700);border-radius:var(--radius-sm);
  padding:12px 16px;font-size:13px;margin-bottom:18px}
.info-banner b{color:var(--blue)}

/* ---- Ausgefallener Bereich (Programmbibliothek nicht geladen) ------------
   Tritt an die Stelle von Kalender bzw. Board. Bewusst ruhig gehalten und ohne
   Rotalarm: Es ist in aller Regel ein Empfangsproblem, kein Datenverlust. */
.load-error{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow-card);padding:32px 28px;text-align:center;max-width:560px;margin:0 auto}
.load-error h2{font-size:17px;margin:0 0 10px}
.load-error p{margin:0 0 8px;color:var(--muted-2);font-size:14px;line-height:1.55}
.load-error p.muted{font-size:12.5px}
.load-error .btn{margin-top:14px}

.dialog{border:none;border-radius:var(--radius);box-shadow:var(--shadow-modal);padding:24px;width:min(540px,94vw)}
.dialog::backdrop,.list-picker::backdrop{background:rgba(15,40,70,.35);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}
.dialog-sm{width:min(400px,92vw)}
.dialog-sm h2{margin-bottom:8px}
#app-notify-msg,#app-confirm-msg{margin:0 0 4px;color:var(--muted-2);font-size:14px;line-height:1.55;white-space:pre-line}
.dialog h2{margin-bottom:6px}
.dialog-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:6px}
.dialog-actions .btn{flex:0 0 auto}
.dialog-actions .spacer{flex:1 1 20px;min-width:0}

/* ---- Auth --------------------------------------------------------------- */
.auth-body{display:grid;place-items:center;min-height:100vh;background:var(--blue)}
.auth-card{background:var(--card);border-radius:16px;padding:30px;width:min(400px,92vw);box-shadow:0 24px 70px rgba(0,30,60,.35)}
.auth-logo{display:flex;align-items:center;gap:10px;margin-bottom:22px}
.auth-logo img{width:34px;height:34px}
.auth-logo .wordmark{font-size:22px;font-weight:700;color:var(--blue)}
.auth-logo .sub{font-size:12px;color:var(--muted);font-weight:500}
.auth-card h1{font-size:21px;margin-bottom:2px}
.auth-sub{color:var(--muted);font-size:13.5px;margin:0 0 20px}
.auth-card .form input{border-radius:var(--pill);padding:12px 18px}
.auth-card .btn-primary{justify-content:center;padding:13px;border-radius:var(--pill);margin-top:4px}
.auth-hint{text-align:center;color:var(--muted);font-size:12px;margin-top:16px}

/* ---- Kalender ----------------------------------------------------------- */
/* flex-wrap: mit vier Filtern (Typ, Mitarbeiter, Bericht, Zeitraum) lief die Zeile
   auf dem Handy über den rechten Rand — dieselbe Fehlerklasse wie die Adresszeile
   im Berichtsformular (04.08.). */
.cal-toolbar{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
.cal-toolbar .views{margin-left:auto;display:flex;gap:2px;background:var(--card);border:1px solid var(--line);border-radius:var(--pill);padding:3px}
.cal-toolbar .views button{border:none;background:none;font:inherit;font-size:13px;font-weight:600;color:var(--muted);
  padding:6px 16px;border-radius:var(--pill);cursor:pointer}
.cal-toolbar .views button.on{background:var(--blue);color:#fff}
#calendar{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-card);padding:14px}
.fc .fc-toolbar-title{font-size:17px;font-weight:700}
.fc .fc-button-primary{background:var(--card);border-color:var(--line);color:var(--ink);font-weight:600;text-transform:none;box-shadow:none}
.fc .fc-button-primary:hover{background:var(--bg-2);border-color:var(--line)}
.fc .fc-button-primary:not(:disabled).fc-button-active{background:var(--blue);border-color:var(--blue);color:#fff}
.fc .fc-col-header-cell-cushion{color:var(--muted);font-weight:600;text-transform:uppercase;font-size:11.5px}
.fc .fc-daygrid-day-number{color:var(--ink);font-weight:700}
.fc{--fc-event-text-color:var(--ink)}
/* R7-4: Feiertage NRW. Zurückhaltend getönt — der Tag soll auffallen, aber die Termine
   darauf müssen lesbar bleiben. Halbtage (Heiligabend/Silvester) blasser. */
.fc .fc-day.is-holiday{background:#fdeef0}
.fc .fc-day.is-holiday.is-halfday{background:#fdf6ee}
.fc .fc-day.is-holiday .fc-daygrid-day-number{color:#a3242f}
.fc .holiday-name{display:block;font-size:10.5px;font-weight:700;color:#a3242f;line-height:1.2;
  padding:0 4px 2px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fc .fc-day.is-holiday.is-halfday .fc-daygrid-day-number,
.fc .fc-day.is-holiday.is-halfday .holiday-name{color:#9a6516}
.fc .fc-timegrid .holiday-name{padding-bottom:0}
/* Bericht-Zustand am Termin (Wunsch Büro). Erledigtes tritt zurück, Fehlendes bleibt
   kräftig und bekommt einen Punkt — so ist die Arbeitsliste ohne Klicken sichtbar.
   Gestrichelte Rahmen sind für ganztägige Termine reserviert (R7-2), deshalb hier
   ausschließlich Transparenz und ein kleines Zeichen vor dem Titel. */
.fc-event.rep-done{opacity:.45}
.fc-event.rep-done:hover{opacity:.8}
.fc .rep-mark{display:inline-block;margin-right:4px;font-size:10px;line-height:1;vertical-align:baseline}
.fc-event.rep-none .rep-mark{color:#fff;background:#d1442f;font-size:10px;font-weight:800;
  width:13px;height:13px;border-radius:50%;text-align:center;line-height:13px;margin-right:5px}
.fc-event.rep-open .rep-mark{color:#1c7a4a}
.fc-event.rep-done .rep-mark{color:var(--muted)}
@media (prefers-reduced-motion:reduce){.fc-event.rep-done{transition:none}}

/* Kontrollkästchen-Zeile in Dialogen (Termin-Typ: „Bericht erwartet") */
.form .check-row{display:flex;align-items:flex-start;gap:9px;font-weight:600;cursor:pointer}
.form .check-row input[type=checkbox]{margin-top:2px;width:16px;height:16px;flex:0 0 auto;accent-color:var(--blue)}
.form .check-row > span{font-weight:600;line-height:1.35}

.fc-event{border:none;border-radius:6px;padding:3px 6px;font-size:12px;cursor:pointer;color:var(--ink)!important;overflow:hidden}
.fc-event .fc-event-time{font-weight:700}
.fc-event .fc-event-title{font-weight:600}
/* C6: Tag-Ansicht (timeGrid) — Event-Text dunkel & lesbar (FC-Default war weiß) */
.fc .fc-timegrid-event,
.fc .fc-timegrid-event .fc-event-main,
.fc .fc-timegrid-event .fc-event-time,
.fc .fc-timegrid-event .fc-event-title,
.fc .fc-list-event .fc-list-event-title,
.fc .fc-event .fc-event-main{color:var(--ink)!important}
/* Überlappende Tages-Termine sauber trennen + Text im Block halten */
.fc .fc-timegrid-event{border-radius:6px;box-shadow:0 0 0 1px rgba(255,255,255,.6)}
.fc .fc-timegrid-event .fc-event-main{padding:2px 5px;overflow:hidden}
.fc .fc-timegrid-event .fc-event-title{white-space:normal;line-height:1.25;font-size:11.5px}
.fc .fc-timegrid-event .fc-event-time{font-size:11px}
/* Höhere 30-Min-Zeilen in der Tag/Woche-Ansicht → kurzer Termin bleibt lesbar */
.fc .fc-timegrid-slot{height:44px}
.fc .fc-timegrid-slot-label{font-size:12px}
.tech-legend{display:flex;flex-wrap:wrap;align-items:center;gap:18px;margin-top:14px;padding:14px 18px;
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-card);font-size:13px}
.tech-legend .lbl{font-weight:700;color:var(--muted-2)}
.tech-legend span.t{display:inline-flex;align-items:center;gap:7px}

/* ---- Kanban-Board ------------------------------------------------------- */
.board{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;align-items:start}
.board-col{background:var(--bg-2);border:1px solid var(--line);border-radius:var(--radius);padding:14px}
.board-col-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;padding:0 2px}
.board-col-head h2{font-size:13px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted-2);font-weight:700}
.col-count{background:var(--card);border:1px solid var(--line);color:var(--muted);border-radius:var(--pill);
  font-size:12px;font-weight:700;min-width:22px;height:22px;display:grid;place-items:center;padding:0 7px}
.board-list{min-height:40px;display:flex;flex-direction:column;gap:10px}
.task-card{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--blue);
  border-radius:var(--radius-sm);padding:14px 16px;box-shadow:var(--shadow-card);cursor:grab}
.task-card.prio-high{border-left-color:var(--red)}
.task-card.prio-low{border-left-color:var(--line-2)}
.task-card{position:relative}
.task-card .t-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
.task-card .t-head-right{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.task-card .t-title{font-weight:600;font-size:14px}
.t-del{border:none;background:none;color:var(--muted);cursor:pointer;padding:3px;border-radius:6px;
  display:inline-flex;align-items:center;opacity:0;transition:opacity .12s,color .12s,background .12s}
.task-card:hover .t-del,.t-del:focus-visible{opacity:.7}
.t-del:hover{opacity:1;color:var(--red);background:#fdecea}
@media(hover:none){.t-del{opacity:.5}}
.t-auto{background:#fdf0e3;color:var(--orange);border-radius:var(--pill);font-size:10.5px;font-weight:700;
  padding:3px 8px;text-transform:uppercase;letter-spacing:.04em;flex:0 0 auto}
.task-card .t-meta{display:flex;flex-wrap:wrap;gap:7px;margin-top:11px}
.t-badge{background:var(--bg-2);border:1px solid var(--line);border-radius:var(--pill);padding:3px 9px;font-size:12px;color:var(--muted-2);display:inline-flex;align-items:center;gap:6px}
.t-badge .dot{width:8px;height:8px}
.board-note{color:var(--muted);font-size:13px;margin-top:18px}
.sortable-ghost{opacity:.4}

/* ---- Tabs + Datentabellen (Stammdaten) ---------------------------------- */
.tabs{display:inline-flex;gap:3px;background:var(--card);border:1px solid var(--line);
  border-radius:var(--pill);padding:4px;margin-bottom:18px}
.tabs button{border:none;background:none;font:inherit;font-size:13.5px;font-weight:600;color:var(--muted);
  padding:8px 18px;border-radius:var(--pill);cursor:pointer}
.tabs button.on{background:var(--blue);color:#fff}
.panel-toolbar{display:flex;justify-content:flex-end;margin-bottom:12px}
.data-table{width:100%;border-collapse:collapse;font-size:13.5px;min-width:640px}
.data-table th{text-align:left;font-size:11.5px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);
  font-weight:600;padding:14px 18px;border-bottom:1px solid var(--line);background:var(--bg-2)}
.data-table td{padding:14px 18px;border-bottom:1px solid var(--line);vertical-align:middle}
.data-table tr:last-child td{border-bottom:0}
.data-table td.strong{font-weight:600}
.data-table td.right{text-align:right}

/* ---- Servicebericht-Formular -------------------------------------------- */
.sr-table th{text-align:left;font-size:11.5px;text-transform:uppercase;letter-spacing:.03em;
  color:var(--muted);font-weight:600;padding:4px 6px;border-bottom:1px solid var(--line)}
.sr-table td{padding:4px 3px}
.sr-table input{width:100%;font:inherit;font-size:13px;padding:7px 8px;
  border:1px solid var(--line-2);border-radius:8px;min-width:60px}
.sr-table input:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-050)}
.sr-table .sr-del{padding:5px 10px;color:var(--muted)}
.sr-table .sr-del:hover{color:var(--red);border-color:var(--red)}

/* ---- Mobile Bottom-Navigation (App-Feeling, D1) ------------------------- */
.bottomnav{display:none}
.more-sheet{display:none}
@media(max-width:860px){
  .bottomnav{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:40;background:var(--card);
    border-top:1px solid var(--line);box-shadow:0 -2px 12px rgba(0,30,60,.07);
    padding:6px 4px calc(6px + env(safe-area-inset-bottom));justify-content:space-around;align-items:flex-end}
  .bn-item{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;padding:5px 2px;
    border:none;background:none;color:var(--muted);font:inherit;font-size:10.5px;font-weight:600;
    cursor:pointer;text-decoration:none;-webkit-tap-highlight-color:transparent}
  .bn-item svg{width:22px;height:22px}
  .bn-item.active{color:var(--blue)}
  .bn-primary{color:var(--blue)}
  .bn-primary svg{width:40px;height:40px;padding:9px;margin-top:-16px;background:var(--blue);color:#fff;
    border-radius:50%;box-shadow:var(--shadow-pop)}
  .more-sheet{display:block;position:fixed;inset:0;z-index:60;background:rgba(15,40,70,.4);
    -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
  .more-sheet[hidden]{display:none}
  .more-sheet-panel{position:absolute;left:0;right:0;bottom:0;background:var(--card);
    border-radius:18px 18px 0 0;padding:8px 8px calc(8px + env(safe-area-inset-bottom));box-shadow:var(--shadow-modal)}
  .more-sheet-panel a{display:block;padding:15px 18px;color:var(--ink);font-weight:600;font-size:15px;border-bottom:1px solid var(--line)}
  .more-sheet-panel a:last-child{border-bottom:0;color:var(--red)}
}

@media(max-width:860px){
  .mainnav{display:none}
  /* Bottom-Nav rechnet env(safe-area-inset-bottom) mit ein → Content-Puffer muss das
     ebenfalls tun, sonst verschwinden Formular-Buttons auf iOS hinter der Nav. */
  .content{padding:22px 16px calc(104px + env(safe-area-inset-bottom))}
  .topbar-right .role-toggle{display:none}
  /* Topbar kompakt: Avatar + Abmelden reichen, Name/Rolle/Untertitel weg */
  .topbar{gap:10px;padding:0 12px}
  .brand .sub{display:none}
  .brand .wordmark{font-size:18px}
  .userbox .uname,.userbox .urole{display:none}
  .userbox{gap:0}
  .topbar-right{gap:8px}
  .btn-logout{padding:8px 12px}
  /* Kopfzeilen dürfen umbrechen */
  .page-head{flex-wrap:wrap}
  .page-head h1{font-size:21px}
  .head-actions{flex-wrap:wrap}
  /* Tabs horizontal scrollen statt umbrechen (Stammdaten) */
  .tabs{max-width:100%;overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch}
  .tabs button{white-space:nowrap;flex:0 0 auto}
  /* Kalender-Toolbar (FullCalendar) darf umbrechen, kompaktere Buttons */
  .fc .fc-toolbar.fc-header-toolbar{flex-wrap:wrap;gap:8px;margin-bottom:10px}
  .fc .fc-toolbar-title{font-size:15px}
  .fc .fc-button{padding:5px 9px;font-size:12px}
  /* Servicebericht-Zeilentabellen horizontal scrollbar */
  .sr-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .sr-table{min-width:560px}
  /* Listen-Einträge (Berichte/Termine) umbrechen, Aktionen in neue Zeile */
  .appt-list li{flex-wrap:wrap;gap:8px 10px}
  .appt-list .appt-main{flex:1 1 100%;order:-1}
  /* Datentabellen bleiben horizontal scrollbar (Container hat overflow-x:auto) */
  .data-table{min-width:560px}
}

/* Phone-only: Board + Formularzeilen stapeln (Tablet 600–860px behält Mehrspaltigkeit) */
@media(max-width:600px){
  .board{grid-template-columns:1fr}
  .form .row{grid-template-columns:1fr}
}

/* Dialoge auf kleinen Screens scrollbar (lange Formulare wie Termin/Servicebericht).
   dvh statt vh: rechnet die dynamischen Browser-Leisten (iOS/Android) raus — sonst liegt
   der Speichern-Button hinter der Browser-UI und ist nicht erreichbar (Kundenmeldung 16.07.). */
.dialog{max-height:92vh;max-height:88dvh;overflow:auto;overscroll-behavior:contain}
@media(max-width:860px){
  /* Luft unter den Buttons: scrollbarer Auslauf über Home-Indicator/Browser-Leiste */
  .dialog{padding-bottom:calc(24px + 18px + env(safe-area-inset-bottom))}
  .dialog-actions{padding-bottom:6px}
}

/* =====================================================================
 *  KI-ASSISTENT (Chat-Widget, read-only)
 * ===================================================================== */
#chat-fab{position:fixed;right:20px;bottom:20px;z-index:60;width:52px;height:52px;border-radius:999px;
  border:none;background:var(--blue);color:#fff;box-shadow:0 6px 20px rgba(0,40,80,.28);cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  transition:transform .18s cubic-bezier(.34,1.3,.64,1),background .12s,opacity .16s ease}
#chat-fab:hover{background:var(--blue-700);transform:translateY(-2px) scale(1.04)}
#chat-fab.hide{opacity:0;transform:scale(.6) translateY(8px);pointer-events:none}
#chat-panel{position:fixed;right:20px;bottom:84px;z-index:60;width:380px;max-width:calc(100vw - 32px);
  height:600px;max-height:calc(100vh - 120px);background:var(--card);border:1px solid var(--line);
  border-radius:16px;box-shadow:0 20px 60px rgba(0,30,60,.30);display:flex;flex-direction:column;overflow:hidden;
  transform-origin:bottom right;opacity:0;transform:translateY(14px) scale(.96);
  transition:opacity .2s ease,transform .22s cubic-bezier(.2,.9,.3,1)}
#chat-panel.open{opacity:1;transform:none}
#chat-panel[hidden]{display:none}
.chat-msg{animation:chat-in .22s ease both}
@keyframes chat-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.chat-day{font-size:11.5px;opacity:.75;padding:2px 0}
@media (prefers-reduced-motion:reduce){
  #chat-panel,#chat-fab{transition:none}
  #chat-panel{opacity:1;transform:none}
  .chat-msg{animation:none}
}
.chat-head{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--line);background:var(--blue-050)}
.chat-head > div:first-child{flex:1;min-width:0}
.chat-title{font-weight:700;font-size:15px;color:var(--ink)}
.chat-sub{font-size:11.5px;color:var(--muted)}
.chat-head .btn{padding:4px 10px}
#chat-close{font-size:18px;line-height:1;padding:2px 9px}
.chat-log{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px;background:var(--bg)}
.chat-msg{max-width:85%;padding:9px 12px;border-radius:12px;font-size:13.5px;line-height:1.45;white-space:pre-wrap;word-wrap:break-word}
.chat-msg.user{align-self:flex-end;background:var(--blue);color:#fff;border-bottom-right-radius:4px}
.chat-msg.bot{align-self:flex-start;background:var(--card);border:1px solid var(--line);color:var(--ink);border-bottom-left-radius:4px}
.chat-msg.bot.thinking{color:var(--muted);font-style:italic}
.chat-msg.bot.error{border-color:#f5c6c0;background:#fdecea;color:var(--red)}
.chat-hint{align-self:center;color:var(--muted);font-size:12px;text-align:center;padding:8px 12px}
.chat-input{display:flex;gap:8px;align-items:flex-end;padding:10px;border-top:1px solid var(--line);background:var(--card)}
.chat-input textarea{flex:1;resize:none;font:inherit;font-size:13.5px;line-height:1.45;padding:9px 12px;
  border:1px solid var(--line-2);border-radius:12px;background:var(--card);
  min-height:96px;max-height:180px}   /* 4 Textzeilen sichtbar */
.chat-input textarea:focus{outline:none;border-color:var(--blue)}
/* Senden: runder Icon-Button (Enter-Pfeil) */
#chat-send{flex:0 0 auto;width:42px;height:42px;border-radius:999px;border:none;background:var(--blue);color:#fff;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background .12s,transform .12s,opacity .12s}
#chat-send:hover:not(:disabled){background:var(--blue-700);transform:translateY(-1px)}
#chat-send:active:not(:disabled){transform:translateY(0) scale(.95)}
#chat-send:disabled{opacity:.45;cursor:default}
@media (max-width:640px){
  #chat-panel{right:8px;left:8px;bottom:76px;width:auto;height:calc(100vh - 150px)}
  #chat-fab{right:14px;bottom:calc(70px + env(safe-area-inset-bottom))}
}

/* Chat: Schnellfragen-Chips */
.chat-chips{display:flex;gap:6px;padding:8px 10px 10px;flex-wrap:wrap;background:var(--card)}
.chat-chip{font:inherit;font-size:11px;font-weight:600;line-height:1.2;padding:4px 10px;border-radius:999px;cursor:pointer;
  border:1px solid transparent;background:var(--blue-050);color:var(--blue-700);
  transition:background .12s,color .12s,border-color .12s}
.chat-chip:hover{background:var(--blue);border-color:var(--blue);color:#fff}
.chat-chips[hidden]{display:none}

/* Chat: Bestätigungskarte für schreibende Aktionen (Entwurf → Klick des Nutzers) */
.chat-card{align-self:stretch;border:1px solid var(--blue);background:var(--blue-050);border-radius:12px;padding:12px 14px;
  animation:chat-in .22s ease both}
.chat-card h4{margin:0 0 8px;font-size:13.5px;color:var(--blue-700)}
.chat-card dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:3px 10px;font-size:12.5px}
.chat-card dt{color:var(--muted);white-space:nowrap}
.chat-card dd{margin:0;color:var(--ink);word-break:break-word}
.chat-card .chat-card-warn{margin:8px 0 0;font-size:12px;color:var(--orange);font-weight:600}
.chat-card-actions{display:flex;gap:8px;margin-top:12px}
.chat-open-link{align-self:flex-start;margin-top:-2px}

/* --------------------------------------------------------------------------
   Info-Tooltip — kleines „i" neben einer Beschriftung, blendet den Erklärtext
   erst bei Bedarf ein. Desktop: Hover/Fokus. Touch: Tippen (dort gibt es kein
   Hover, die Techniker sind per PWA auf Tablet/Handy unterwegs).
   Die Blase liegt position:fixed, weil Dialoge overflow:auto haben und ein
   absolut positioniertes Popup sonst abgeschnitten würde.
   -------------------------------------------------------------------------- */
.info-tip{
  display:inline-flex;align-items:center;justify-content:center;
  box-sizing:border-box;width:18px;height:18px;padding:0;flex:0 0 auto;
  border:1px solid var(--line-2);border-radius:var(--pill);
  background:var(--card);color:var(--muted);
  font:600 11px/1 var(--font);cursor:help;
  transition:color .12s,border-color .12s,background .12s;
}
.info-tip:hover,.info-tip:focus-visible,.info-tip[aria-expanded="true"]{
  color:var(--blue);border-color:var(--blue);background:var(--blue-100);
}
.info-tip:focus-visible{outline:2px solid var(--blue);outline-offset:2px}

.info-pop{
  position:fixed;z-index:1200;max-width:min(320px,calc(100vw - 24px));
  padding:10px 12px;border:1px solid var(--line);border-radius:var(--radius-sm);
  background:var(--card);color:var(--ink);box-shadow:var(--shadow-pop);
  font-size:12.5px;line-height:1.45;
  opacity:0;transform:translateY(-2px);transition:opacity .12s,transform .12s;
  pointer-events:none;
}
.info-pop[data-open]{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.info-pop{transition:none}}
