Termin aus Mail, Rollen & Rechte, Abwesenheiten, Glas-Darstellung und Pi-Betrieb

- Termin aus Mail: Mailtext oder .eml per Drag & Drop/Strg+V auf Terminplan
  oder Aufgaben, KI schlägt Aufgaben vor, Prüfung im Aufgaben-Panel; neues
  Notizfeld je Aufgabe (plan_todos.notiz)
- Terminplan: Meilensteine ohne Aufgabenbezug je in eigener Zeile,
  "+ Neu"-Menü klappt neben schmaler Seitenleiste nach rechts, Leistungsphasen
- Rollen & Rechte, Abwesenheiten-Seite, Benachrichtigungen, Rundgang
- Glas-Darstellung, Logo als Favicon
- Pi-Betrieb: PDF-Arbeit im Kindprozess, Wächter, Einrichtungs- und
  Prüfskript inkl. WLAN-Wächter

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
erikandClaude Opus 5.5 committed 2026-10-29 14:16:52 +01:00
1 parent f4fb3c550b
commit b7e0bd0d92
56 files changed
+12265 -2974

No files matched your search

+695 -21
View File
@@ -133,27 +133,6 @@
.modal-head h2 { margin: 0; }
.modal-kbd { font-size: 11px; color: var(--text-subtle); white-space: nowrap; }
/* Etwas breiter als die 500 px der Standard-Maske, damit die vier
Schaltflächen der Fußzeile in eine Zeile passen (gleiche Ausnahme wie
#lpModal/#newProjModal in styles.css). */
#todoModal .modal { max-width: 560px; }
/* Fußzeile bleibt stehen, wenn die Abhängigkeiten aufgeklappt sind */
.modal-footer {
position: sticky;
bottom: -28px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
flex-wrap: wrap;
margin: 20px -28px -28px;
padding: 16px 28px;
border-top: 1px solid var(--line-soft);
background: var(--surface-alt);
border-radius: 0 0 var(--r-xl) var(--r-xl);
}
/* Validierungshinweis direkt am Feld statt im alert() */
/* .field-error steht in styles.css: der Passwort-Dialog (js/auth.js) nutzt
sie auch ausserhalb des Projektbereichs. */
@@ -210,6 +189,9 @@
color: var(--accent);
}
.person-chip[aria-pressed="true"]:hover { background: var(--accent-soft); }
/* Zuständige, die dem Projekt (nicht mehr) zugeordnet sind (openTodoModal()):
gestrichelt wie die "fremden" Personen im Assistenten. */
.person-chip.ist-fremd { border-style: dashed; }
.person-chip[aria-pressed="true"] .person-chip-ini { background: var(--accent); color: #fff; }
/* Hover-Fläche im Status-Segment: eigene Abstufung, weil das Segment auf
@@ -1115,3 +1097,695 @@ html[data-theme="dark"] { --seg-hover: rgba(255,255,255,.10); }
sich jetzt mit derselben Dauer wie der Pfeil der Projektliste
(.board-chev), statt mit einem eigenen Wert. */
.pt-chevron { transition: transform var(--dur) var(--ease-out); }
/* ===========================================================================
Projekt-Dashboard "Lagebild" (Eriks Wahl aus drei Anordnungen):
Lageband oben (#planKpiRow), darunter zwei Spalten, die sich unabhängig
füllen — links Kommentar + Termine, rechts Phasen, Team, Unterlagen.
=========================================================================== */
.plan-lage-band {
display: grid; grid-template-columns: minmax(0, 1.35fr) repeat(3, minmax(0, 1fr));
background: var(--surface); border: 1px solid var(--line-soft); border-radius: var(--r-lg);
box-shadow: var(--sh-1); padding: 4px;
}
.plan-lage-zelle { padding: 12px 16px; min-width: 0; }
.plan-lage-zelle + .plan-lage-zelle { border-left: 1px solid var(--line-soft); }
.plan-lage-zelle .kpi-label { font-size: 11px; font-weight: 650; letter-spacing: .05em; text-transform: uppercase; color: var(--text-subtle); }
.plan-lage-zelle .kpi-value { font-size: 22px; font-weight: 600; letter-spacing: -.01em; margin-top: 2px; font-variant-numeric: tabular-nums; }
.plan-lage-zelle .kpi-sub { font-size: 12px; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-lage-zelle .kpi-sub.ist-rot { color: var(--red); font-weight: 600; }
.plan-lage-phase { display: flex; align-items: center; gap: 14px; }
.plan-lage-ring {
flex: none; width: 54px; height: 54px; border-radius: 50%;
background: conic-gradient(var(--accent) calc(var(--p) * 1%), color-mix(in srgb, var(--text-subtle) 18%, transparent) 0);
-webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 7px), #000 calc(100% - 6px));
mask: radial-gradient(farthest-side, transparent calc(100% - 7px), #000 calc(100% - 6px));
}
.plan-lage-raster { display: grid; grid-template-columns: minmax(0, 1.75fr) minmax(0, 1fr); gap: 14px; align-items: start; margin-top: 14px; }
.plan-lage-spalte { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.plan-lage-spalte .plan-panel { box-shadow: var(--sh-1); }
@media (max-width: 1000px) {
.plan-lage-band { grid-template-columns: 1fr 1fr; }
.plan-lage-zelle + .plan-lage-zelle { border-left: 0; }
.plan-lage-raster { grid-template-columns: 1fr; }
}
.plan-panel-title .plan-panel-link, .plan-unterlage-kopf .plan-panel-link { margin-left: auto; }
.plan-panel-link {
appearance: none; border: 0; background: none !important; box-shadow: none !important; padding: 0;
color: var(--accent); font: inherit; font-size: 12px; font-weight: 550; cursor: pointer;
}
.plan-panel-link:hover { text-decoration: underline; }
.plan-panel-link:active { transform: none; }
.plan-kommentar-fuss { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 10px; }
.plan-kommentar-autor { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-subtle); }
.plan-kommentar-autor:empty { display: none; }
.plan-autor-ava { width: 24px; height: 24px; border-radius: 50%; display: inline-grid; place-items: center; font-size: 9.5px; font-weight: 700; background: var(--accent-soft); color: var(--accent); }
.plan-kommentar-fuss .plan-verweis-row { margin-left: auto; }
.plan-termin-gruppe { display: flex; gap: 6px; align-items: baseline; font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--text-subtle); padding: 10px 0 2px; }
.plan-termin-gruppe:first-child { padding-top: 0; }
.plan-termin-gruppe span { font-weight: 500; letter-spacing: 0; }
.plan-termin-gruppe.ist-rot { color: var(--red); }
.plan-termin { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 8px 6px; margin: 0 -6px; border-top: 1px solid var(--line-soft); border-radius: 8px; }
.plan-termin-gruppe + .plan-termin { border-top: 0; }
.plan-termin.ist-klickbar { cursor: pointer; }
.plan-termin.ist-klickbar:hover { background: var(--surface-sunk); }
.plan-termin-art { width: 22px; height: 22px; border-radius: 7px; display: grid; place-items: center; font-size: 10px; font-weight: 700; background: var(--surface-sunk); color: var(--text-muted); }
.plan-termin-art.ist-meins { background: var(--accent-soft); color: var(--accent); }
.plan-termin-art.ist-ms { background: color-mix(in srgb, #6d4bb3 14%, transparent); color: #6d4bb3; }
.plan-termin-text { min-width: 0; display: flex; flex-direction: column; }
.plan-termin-text b { font-weight: 550; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-termin-text span { font-size: 11.5px; color: var(--text-subtle); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-termin-datum { text-align: right; font-size: 12px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.plan-termin-datum em { display: block; font-style: normal; font-size: 11px; color: var(--text-subtle); }
.plan-termin-datum.ist-rot, .plan-termin-datum.ist-rot em { color: var(--red); }
.plan-termin-mehr { margin-top: 8px; }
.plan-team-zeile { display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 7px 0; border-top: 1px solid var(--line-soft); }
.plan-team-zeile:first-child { border-top: 0; padding-top: 0; }
.plan-team-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.plan-team-text b { font-weight: 550; }
.plan-team-rollen { display: flex; flex-wrap: wrap; gap: 4px; }
.plan-rolle { font-size: 10px; font-weight: 600; padding: 1px 7px; border-radius: 999px; background: var(--accent-soft); color: var(--accent); }
.plan-rolle.ist-neben { background: transparent; border: 1px dashed var(--line); color: var(--text-muted); }
.plan-team-offen { font-size: 12px; color: var(--text-muted); white-space: nowrap; }
.plan-unterlage { padding: 9px 6px; margin: 0 -6px; border-top: 1px solid var(--line-soft); border-radius: 8px; cursor: pointer; }
.plan-unterlage:first-child { border-top: 0; padding-top: 2px; }
.plan-unterlage:hover { background: var(--surface-sunk); }
.plan-unterlage-kopf { display: flex; align-items: baseline; gap: 8px; margin-bottom: 4px; }
.plan-unterlage-kopf b { font-weight: 600; }
@media (prefers-color-scheme: dark) { html:not([data-theme="light"]) .plan-termin-art.ist-ms { color: #c3a6ff; } }
html[data-theme="dark"] .plan-termin-art.ist-ms { color: #c3a6ff; }
/* Kommentar der Sitzung im Projekt-Dashboard größer (Eriks Wunsch): Das
allgemeine .status-edit ist auf die enge Zeile des Boards ausgelegt
(11px). Hier ist er das wichtigste Lesefeld des Lagebilds. */
#planSection-dashboard #planStatusEdit {
font-size: 14.5px;
line-height: 1.6;
padding: 14px 16px;
min-height: 160px;
border-radius: var(--r-md);
border-style: solid;
}
/* Kommentar der Sitzung mit Verlauf (Eriks Wahl "A"): gezeigt wird der
zuletzt geschriebene Kommentar; stammt er aus einer früheren Sitzung,
sagt das der Hinweis darüber. Darunter eine Zeitleiste der früheren
Kommentare je Gewerk (renderPlanKommentarVerlauf(), plan-info.js). */
.plan-kommentar-hinweis {
margin-bottom: 10px; padding: 8px 12px; border-radius: var(--r-sm, 8px);
font-size: 12.5px; line-height: 1.45;
color: var(--text);
background: color-mix(in srgb, var(--amber) 16%, transparent);
border: 1px solid color-mix(in srgb, var(--amber) 40%, transparent);
}
.plan-kommentar-verlauf { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line); }
.plan-verlauf-kopf { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
.plan-verlauf-titel { font-size: 11.5px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); }
.plan-verlauf-anzahl { font-size: 12px; color: var(--text-subtle); }
.plan-verlauf-liste { list-style: none; margin: 0; padding: 0; }
.plan-verlauf-eintrag { display: grid; grid-template-columns: 52px 12px minmax(0, 1fr); column-gap: 10px; }
.plan-verlauf-kw { font-size: 12px; font-weight: 600; color: var(--text); padding-top: 1px; white-space: nowrap; }
.plan-verlauf-punkt { position: relative; }
.plan-verlauf-punkt::before {
content: ""; position: absolute; left: 1.5px; top: 5px;
width: 9px; height: 9px; border-radius: 50%;
background: color-mix(in srgb, var(--accent) 45%, transparent);
}
.plan-verlauf-eintrag.ist-juengster .plan-verlauf-punkt::before { background: var(--accent); }
.plan-verlauf-punkt::after {
content: ""; position: absolute; left: 5px; top: 17px; bottom: 0; width: 2px; background: var(--line);
}
.plan-verlauf-eintrag:last-child .plan-verlauf-punkt::after { display: none; }
.plan-verlauf-inhalt { padding-bottom: 14px; min-width: 0; }
.plan-verlauf-text { font-size: 13.5px; line-height: 1.5; color: var(--text); overflow-wrap: anywhere; }
.plan-verlauf-text p { margin: 0; }
.plan-verlauf-meta { font-size: 11.5px; color: var(--text-subtle); margin-top: 3px; }
.plan-verlauf-mehr {
border: 1px solid var(--line); background: var(--surface); color: var(--accent);
border-radius: 999px; padding: 6px 14px; font: inherit; font-size: 12.5px; cursor: pointer;
}
.plan-verlauf-mehr:hover { background: var(--surface-alt); }
/* Dashboard-Kachel "Protokolle" (Eriks Wunsch, renderProtokolleSummary()
in plan-protokoll.js): letztes Protokoll, seine offenen Punkte in der
Zeilenform der Termine, darunter die früheren als Kurzliste. */
#planDashProtokollePanel .plan-termin { grid-template-columns: auto minmax(0, 1fr) auto; }
#planDashProtokollePanel .plan-termin-art { width: auto; min-width: 34px; padding: 0 6px; box-sizing: border-box; }
.plan-prot-kopf {
display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
font: inherit; color: var(--text); background: var(--surface-sunk);
border: 1px solid var(--line-soft); border-radius: var(--r-md, 12px);
padding: 10px 12px; cursor: pointer;
}
.plan-prot-kopf:hover { border-color: var(--accent); }
.plan-prot-nr {
flex: none; font-size: 12px; font-weight: 700; color: var(--accent);
background: var(--accent-soft); border-radius: 8px; padding: 4px 8px;
}
.plan-prot-titel { min-width: 0; display: flex; flex-direction: column; }
.plan-prot-titel b { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-prot-titel span { font-size: 12px; color: var(--text-subtle); }
.plan-prot-punkte { margin-top: 8px; }
.plan-prot-punkte:empty { display: none; }
.plan-prot-mehr { display: block; margin-top: 6px; }
.plan-prot-frueher {
display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 10px; align-items: baseline;
width: 100%; text-align: left; font: inherit; font-size: 12.5px; color: var(--text-muted);
background: none; border: 0; border-top: 1px solid var(--line-soft); padding: 7px 6px; cursor: pointer; border-radius: 8px;
}
.plan-termin-gruppe + .plan-prot-frueher { border-top: 0; }
.plan-prot-frueher:hover { background: var(--surface-sunk); }
.plan-prot-frueher-titel { color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-prot-frueher-zahl { color: var(--amber); font-size: 12px; white-space: nowrap; }
.plan-dash-leer { display: flex; align-items: center; gap: 10px; color: var(--text-subtle); font-size: 13px; }
/* Kachel "Team" nach Gewerk gruppiert (Eriks Wahl "A", plan-sections.js):
je Gewerk eine Überschrift mit Personenzahl; ein Gewerk des Projekts ohne
Beteiligte zeigt einen Hinweis statt zu verschwinden. */
.plan-team-gruppe + .plan-team-gruppe { margin-top: 6px; }
.plan-team-gewerk { display: flex; align-items: center; gap: 8px; padding: 6px 0 4px; }
.plan-team-gruppe:first-child .plan-team-gewerk { padding-top: 0; }
.plan-gewerk-schild { font-size: 10.5px; font-weight: 700; letter-spacing: .04em; padding: 2px 8px; border-radius: 6px; background: var(--accent-soft); color: var(--accent); }
.plan-gewerk-titel { font-size: 12px; color: var(--text-muted); white-space: nowrap; }
.plan-gewerk-linie { flex: 1; height: 1px; background: var(--line-soft); }
.plan-gewerk-anzahl { font-size: 12px; color: var(--text-subtle); white-space: nowrap; }
.plan-team-gewerk + .plan-team-zeile { border-top: 0; }
.plan-team-luecke { font-size: 12.5px; color: var(--amber); padding: 2px 0 6px; }
/* Einstellungen mit Unternavigation (Eriks Wahl "C", plan-settings.js):
links vier Abschnitte mit Kurzfassung, rechts immer genau einer. */
.plan-einst { display: flex; gap: 14px; align-items: flex-start; margin-top: 4px; }
.plan-einst-nav {
flex: none; width: 260px; position: sticky; top: 90px;
display: flex; flex-direction: column; gap: 4px; padding: 8px;
background: var(--surface); border: 1px solid var(--line-soft); border-radius: var(--r-lg);
}
.plan-einst-reiter {
display: flex; flex-direction: column; align-items: flex-start; gap: 3px; text-align: left;
min-height: 56px; padding: 9px 14px; border: 0; border-radius: 12px;
background: transparent; color: var(--text); font: inherit; cursor: pointer;
}
.plan-einst-reiter b { font-size: 14px; font-weight: 600; }
.plan-einst-reiter span { font-size: 12px; color: var(--text-muted); line-height: 1.35; }
.plan-einst-reiter:hover { background: var(--surface-sunk); }
.plan-einst-reiter.is-active { background: var(--surface-sunk); box-shadow: inset 3px 0 0 var(--accent); }
.plan-einst-inhalt { flex: 1; min-width: 0; padding: 22px 26px; }
.plan-einst-titel { margin: 0 0 16px; font-size: 18px; font-weight: 650; }
.plan-einst-teil .form-row { max-width: 640px; }
.plan-einst-paar { display: grid; grid-template-columns: 180px minmax(0, 1fr); gap: 0 12px; max-width: 640px; }
.plan-einst-paar > .form-row { min-width: 0; margin-bottom: 6px; }
.plan-einst-teil[data-teil="auftrag"] .plan-einst-paar { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 460px; }
.plan-einst-hint { margin: 0 0 16px; max-width: 640px; line-height: 1.45; }
.form-row .plan-einst-hint { margin: 2px 0 0; }
.plan-einst-schmal { max-width: 320px; }
.plan-einst-chips { display: flex; gap: 8px; flex-wrap: wrap; }
.plan-einst-chip {
min-height: 36px; padding: 0 16px; border-radius: 999px; font: inherit; font-size: 13px; cursor: pointer;
border: 1px solid var(--line); background: var(--surface); color: var(--text);
}
.plan-einst-chip.an { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }
/* Umschalter (Leistungsphasen, Beteiligte) */
.plan-einst-seg { display: inline-flex; gap: 2px; padding: 3px; border-radius: 999px; background: var(--surface-sunk); }
.plan-einst-seg button {
border: 0; background: transparent; color: var(--text-muted); font: inherit; font-size: 12.5px;
min-height: 30px; padding: 0 12px; border-radius: 999px; cursor: pointer; white-space: nowrap;
}
.plan-einst-seg button.an { background: var(--surface); color: var(--accent); font-weight: 600; box-shadow: 0 1px 4px rgba(15,40,60,.12); }
.plan-einst-seg button:disabled { cursor: default; }
.plan-einst-phasen { display: flex; flex-direction: column; max-width: 760px; }
.plan-einst-phase { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 16px; align-items: center; padding: 9px 0; border-top: 1px solid var(--line-soft); }
.plan-einst-phase-name { display: flex; align-items: center; gap: 12px; min-width: 0; }
.plan-einst-phase-name b { width: 52px; flex: none; font-size: 13px; }
.plan-einst-phase-name span { font-size: 14px; color: var(--text-muted); }
.plan-einst-phase.ist-an .plan-einst-phase-name span { color: var(--text); }
.plan-einst-phase-name em { font-style: normal; font-size: 11px; font-weight: 700; color: var(--accent); background: var(--accent-soft); border-radius: 999px; padding: 2px 8px; }
@media (max-width: 900px) {
.plan-einst { flex-direction: column; }
.plan-einst-nav { width: auto; position: static; flex-direction: row; overflow-x: auto; }
.plan-einst-reiter { flex: none; }
}
/* Zahlenfelder (Honorar, Projektgröße) wie die Textfelder daneben — die
allgemeine Feldregel in styles.css kennt type=number nicht; sie dort
aufzunehmen träfe auch kompakte Zahlenfelder anderer Bereiche. */
.plan-einst-teil input[type=number] {
padding: 7px 10px; border: 1px solid var(--line); border-radius: var(--r-md);
font: inherit; font-size: 13px; color: var(--text); background: var(--surface);
}
.plan-einst-teil input[type=number]:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(0,113,227,.18); }
/* Dunkel ist der Akzent hell — weiße Schrift darauf wäre kaum lesbar. */
@media (prefers-color-scheme: dark) { html:not([data-theme="light"]) .plan-einst-chip.an { color: #0b141b; } }
html[data-theme="dark"] .plan-einst-chip.an { color: #0b141b; }
/* Beteiligte als Personenliste (Eriks Wahl "B", renderEinstTeam() in
plan-settings.js): Besetzungsleiste, Suchfeld mit Vorschlägen, eine Zeile
je Person mit Rollen-Kapseln (umrandet = aus, voll = Haupt, gestrichelt
= Unterstützung), Entfernen mit "Rückgängig". */
.plan-einst-teil[data-teil="team"] { position: relative; }
.plan-einst-team-kopfzeile { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 8px 20px; }
.plan-einst-team-kopfzeile .plan-einst-hint { margin-bottom: 14px; }
.plan-einst-legende { display: flex; gap: 14px; font-size: 12px; color: var(--text-muted); margin-bottom: 16px; }
.plan-einst-legende span { display: inline-flex; align-items: center; gap: 6px; }
.plan-einst-legende i { width: 24px; height: 14px; border-radius: 999px; box-sizing: border-box; }
.plan-einst-legende i.ist-haupt { background: var(--accent); }
.plan-einst-legende i.ist-neben { border: 1.5px dashed var(--accent); background: var(--accent-soft); }
.plan-einst-sperre { padding: 10px 14px; border-radius: 12px; background: var(--surface-sunk); font-size: 13px; margin-bottom: 14px; }
.plan-einst-besetzung { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-bottom: 16px; }
.plan-einst-besetzt { display: flex; flex-direction: column; gap: 3px; min-width: 0; padding: 10px 12px; border-radius: 12px; background: var(--surface-sunk); border: 1px solid transparent; }
.plan-einst-besetzt b { font-size: 12px; font-weight: 650; color: var(--text-muted); }
.plan-einst-besetzt span { font-size: 12.5px; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-einst-besetzt.ist-luecke { background: color-mix(in srgb, var(--amber) 10%, transparent); border: 1px dashed var(--amber); }
.plan-einst-besetzt.ist-luecke b, .plan-einst-besetzt.ist-luecke span { color: var(--amber); }
.plan-einst-suche { position: relative; display: flex; flex-direction: column; gap: 6px; margin-bottom: 8px; max-width: 640px; }
.plan-einst-suche[hidden] { display: none; }
.plan-einst-suche label { font-size: 12px; font-weight: 500; color: var(--text-muted); }
.plan-einst-suche input { height: 40px; box-sizing: border-box; font-size: 14px; }
.plan-einst-vorschlaege {
position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 20; max-height: 320px; overflow: auto;
padding: 6px; border-radius: 14px; background: var(--surface); border: 1px solid var(--line);
box-shadow: 0 16px 40px rgba(15,40,60,.18);
}
html.glas .plan-einst-vorschlaege { background: var(--glas-dicht); }
.plan-einst-vorschlag-titel { font-size: 11.5px; font-weight: 650; color: var(--text-muted); padding: 8px 10px 4px; }
.plan-einst-vorschlag-leer { font-size: 13px; color: var(--text-muted); padding: 10px; }
.plan-einst-vorschlag {
display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; min-height: 48px; padding: 4px 10px;
border: 0; border-radius: 10px; background: transparent; color: var(--text); font: inherit; cursor: pointer;
}
.plan-einst-vorschlag:hover, .plan-einst-vorschlag:focus-visible { background: var(--surface-sunk); }
.plan-einst-vorschlag > span:last-child { display: flex; flex-direction: column; min-width: 0; }
.plan-einst-vorschlag b { font-size: 13.5px; font-weight: 600; }
.plan-einst-vorschlag > span:last-child > span { font-size: 12px; color: var(--text-muted); }
.plan-einst-ava {
width: 34px; height: 34px; flex: none; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
font-size: 11px; font-weight: 700; background: var(--accent); color: #fff;
}
.plan-einst-gruppe { display: flex; align-items: center; gap: 10px; padding: 16px 0 6px; }
.plan-einst-zeile {
display: grid; grid-template-columns: minmax(200px, 1fr) auto 36px; gap: 10px 14px; align-items: center;
padding: 9px 10px; margin: 0 -10px; border-radius: 12px; border-top: 1px solid var(--line-soft);
transition: background-color var(--dur-lg, .2s) var(--ease-out, ease);
}
.plan-einst-gruppe + .plan-einst-zeile { border-top-color: transparent; }
.plan-einst-zeile.ist-neu { background: var(--accent-soft); }
.plan-einst-person { display: flex; align-items: center; gap: 12px; min-width: 0; }
.plan-einst-person b { font-size: 14px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.plan-einst-kapseln { display: flex; flex-wrap: wrap; gap: 6px; }
.plan-einst-kapsel {
min-height: 36px; padding: 0 14px; border-radius: 999px; box-sizing: border-box; white-space: nowrap;
border: 1px solid var(--line); background: transparent; color: var(--text-muted); font: inherit; font-size: 12.5px; cursor: pointer;
transition: transform var(--dur, .15s) var(--ease-out, ease), background-color var(--dur, .15s);
}
.plan-einst-kapsel:hover:not(:disabled) { border-color: var(--accent); color: var(--text); }
.plan-einst-kapsel:active:not(:disabled) { transform: scale(var(--press, .97)); }
.plan-einst-kapsel.ist-haupt { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }
.plan-einst-kapsel.ist-neben { border: 1.5px dashed var(--accent); background: var(--accent-soft); color: var(--text); font-weight: 600; }
.plan-einst-kapsel.ist-fremd { border-color: transparent; opacity: .5; text-decoration: line-through; }
.plan-einst-kapsel:disabled { cursor: default; }
.plan-einst-weg { width: 36px; height: 36px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); font-size: 18px; cursor: pointer; }
.plan-einst-weg:hover { background: var(--surface-sunk); color: var(--red); }
.plan-einst-leer { display: flex; flex-direction: column; gap: 6px; padding: 20px; border-radius: 14px; border: 1px dashed var(--line); margin-top: 8px; }
.plan-einst-leer b { font-size: 14px; font-weight: 600; }
.plan-einst-leer span { font-size: 13px; color: var(--text-muted); line-height: 1.5; }
.plan-einst-toast {
position: sticky; bottom: 16px; margin: 16px auto 0; width: max-content; max-width: 100%;
display: flex; align-items: center; gap: 14px; padding: 8px 8px 8px 16px; border-radius: 999px;
background: var(--text); color: var(--bg); font-size: 13px; box-shadow: 0 16px 40px rgba(15,40,60,.25);
}
.plan-einst-toast[hidden] { display: none; }
.plan-einst-toast button { min-height: 32px; padding: 0 14px; border-radius: 999px; border: 0; background: color-mix(in srgb, var(--bg) 18%, transparent); color: inherit; font: inherit; font-weight: 600; cursor: pointer; }
/* Dunkel ist der Akzent hell — Schrift darauf dunkel. */
@media (prefers-color-scheme: dark) {
html:not([data-theme="light"]) .plan-einst-kapsel.ist-haupt,
html:not([data-theme="light"]) .plan-einst-ava { color: #0b141b; }
}
html[data-theme="dark"] .plan-einst-kapsel.ist-haupt,
html[data-theme="dark"] .plan-einst-ava { color: #0b141b; }
@media (max-width: 900px) {
.plan-einst-besetzung { grid-template-columns: minmax(0, 1fr); }
.plan-einst-zeile { grid-template-columns: minmax(0, 1fr) 36px; }
.plan-einst-kapseln { grid-column: 1 / -1; order: 3; }
}
/* Gesperrte Sitzung: Die allgemeine :disabled-Regel (styles.css, 45 %)
machte "Haupt" und "aus" kaum unterscheidbar — die Kapseln sollen den
Stand weiter klar zeigen, nur nicht mehr klickbar sein. Fremde Rollen
bleiben bewusst blass. */
.plan-einst-kapsel:disabled:not(.ist-fremd) { opacity: 1; cursor: default; }
/* Leistungsphasen: kräftigere Hervorhebung (Eriks Wunsch). Vorher war die
gewählte Seite nur eine weiße Kapsel mit Akzentschrift auf hellgrauem
Grund — "Beauftragt" und "Nicht beauftragt" waren kaum auseinander-
zuhalten. Jetzt: beauftragt = gefüllte Akzentkapsel und die ganze Zeile
leicht getönt; nicht beauftragt = neutrale Kapsel, Zeile zurückgenommen;
"läuft" gefüllt. */
.plan-einst-phase { padding: 9px 10px; margin: 0 -10px; border-radius: 12px; }
.plan-einst-phase.ist-an { background: var(--accent-soft); border-top-color: transparent; }
.plan-einst-phase.ist-an + .plan-einst-phase { border-top-color: transparent; }
.plan-einst-phase .plan-einst-seg { background: var(--surface-sunk); border: 1px solid var(--line-soft); }
.plan-einst-phase .plan-einst-seg button { color: var(--text-muted); }
.plan-einst-phase .plan-einst-seg button.an:first-child { background: var(--accent); color: #fff; box-shadow: 0 1px 4px rgba(15,40,60,.18); }
.plan-einst-phase .plan-einst-seg button.an:last-child { background: var(--surface); color: var(--text); box-shadow: 0 1px 3px rgba(15,40,60,.12); }
.plan-einst-phase:not(.ist-an) .plan-einst-phase-name b { color: var(--text-muted); }
.plan-einst-phase.ist-an .plan-einst-phase-name b { color: var(--accent); }
.plan-einst-phase-name em { background: var(--accent); color: #fff; }
.plan-einst-phase .plan-einst-seg button:disabled { opacity: 1; }
@media (prefers-color-scheme: dark) {
html:not([data-theme="light"]) .plan-einst-phase .plan-einst-seg button.an:first-child,
html:not([data-theme="light"]) .plan-einst-phase-name em { color: #0b141b; }
}
html[data-theme="dark"] .plan-einst-phase .plan-einst-seg button.an:first-child,
html[data-theme="dark"] .plan-einst-phase-name em { color: #0b141b; }
.plan-einst-phase + .plan-einst-phase { margin-top: 2px; }
@media (prefers-color-scheme: dark) {
html:not([data-theme="light"]) .plan-einst-phase .plan-einst-seg button.an:last-child { background: rgba(255,255,255,.16); }
}
html[data-theme="dark"] .plan-einst-phase .plan-einst-seg button.an:last-child { background: rgba(255,255,255,.16); }
/* Seitenpanel für Aufgabe und Meilenstein (Eriks Wahl "B"): rechts am
Rand, volle Höhe, der Terminplan bleibt links sichtbar (Hintergrund nur
leicht abgedunkelt, nicht verschwommen). Kopf und Fußleiste stehen fest,
nur der Inhalt scrollt. */
.modal-bg.als-panel {
justify-content: flex-end; align-items: stretch;
background: rgba(15,35,50,.14);
-webkit-backdrop-filter: none; backdrop-filter: none;
}
html.glas .modal-bg.als-panel { background: rgba(15,35,50,.14); -webkit-backdrop-filter: none; backdrop-filter: none; }
@media (prefers-color-scheme: dark) { html:not([data-theme="light"]) .modal-bg.als-panel { background: rgba(0,0,0,.32); } }
html[data-theme="dark"] .modal-bg.als-panel { background: rgba(0,0,0,.32); }
.modal-bg.als-panel > .modal.pd {
width: 440px; max-width: 100%; height: 100%; max-height: none; padding: 0;
border-radius: var(--r-xl) 0 0 var(--r-xl);
display: flex; flex-direction: column; overflow: hidden;
box-shadow: -14px 0 44px rgba(15,40,60,.22);
animation: pd-rein var(--dur-lg, .2s) var(--ease-out, ease);
}
@keyframes pd-rein { from { transform: translateX(32px); opacity: 0; } to { transform: none; opacity: 1; } }
.pd-kopf { padding: 18px 22px 14px; border-bottom: 1px solid var(--line-soft); display: flex; flex-direction: column; gap: 10px; }
.pd-art { display: flex; align-items: center; gap: 8px; font-size: 12.5px; font-weight: 650; color: var(--text-muted); }
.pd-art .modal-kbd { margin-left: auto; font-weight: 400; }
.pd-kasten { width: 11px; height: 11px; border-radius: 3px; background: var(--accent); }
.pd-raute { width: 10px; height: 10px; background: var(--meilenstein, #6d4bb3); transform: rotate(45deg); margin: 0 1px; }
.pd-zu { width: 34px; height: 34px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); font-size: 20px; line-height: 1; padding: 0; cursor: pointer; }
.pd-zu:hover { background: var(--surface-sunk); color: var(--text); }
.pd-kopf .pd-titel { width: 100%; box-sizing: border-box; font-size: 17px; font-weight: 600; padding: 9px 12px; }
.pd-inhalt { flex: 1; min-height: 0; overflow: auto; padding: 2px 22px 16px; }
.pd-abs { display: flex; flex-direction: column; gap: 8px; padding: 14px 0; border-bottom: 1px solid var(--line-soft); }
.pd-abs:last-child { border-bottom: 0; }
.pd-abs > h3 { margin: 0; font-size: 12px; font-weight: 650; color: var(--text-muted); }
.pd-abs .range-picker-display, .pd-abs select { width: 100%; box-sizing: border-box; }
.pd-abs .field-inline { display: flex; align-items: center; gap: 8px; }
.pd-abs .field-inline .range-picker-display { flex: 1; }
.pd-haken { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 400; }
.pd-hint { margin: 0; }
.pd-seg { width: 100%; }
.pd-seg button { flex: 1; justify-content: center; min-height: 32px; }
.pd-seg button:disabled { opacity: .45; }
.pd-liste { max-height: 300px; overflow: auto; }
.pd-abs .fold { margin: 0; }
.pd-fuss {
display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap;
padding: 14px 22px calc(14px + env(safe-area-inset-bottom, 0px));
border-top: 1px solid var(--line-soft); background: var(--surface-alt);
}
.pd-loeschen { margin-right: auto; background: transparent; border: 0; color: var(--red); padding: 8px 10px; font-weight: 500; }
.pd-loeschen:hover { background: color-mix(in srgb, var(--red) 10%, transparent); }
.pd-loeschen[hidden] { display: none; }
/* Aufwand einer Aufgabe in Stunden (zählt zur Auslastung). */
.pd-aufwand { display: flex; align-items: center; gap: 10px; font-size: 13px; font-weight: 400; margin-top: 4px; }
.pd-aufwand > span:first-child { font-weight: 600; color: var(--text-muted); font-size: 12px; }
.pd-aufwand > span:last-child { color: var(--text-muted); font-size: 12px; }
.pd-aufwand input { width: 96px; padding: 7px 10px; border: 1px solid var(--line); border-radius: var(--r-md); font: inherit; font-size: 13px; color: var(--text); background: var(--surface); text-align: right; }
.pd-aufwand input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(0,113,227,.18); }
/* Terminplan aufgeräumt (Eriks Wahl "A", plan-gantt.js / plan-build-gantt.js):
eine Leiste statt zwei, Menüs "Mehr" und "+ Neu", Gliederung nach
Leistungsphasen mit zuklappbaren Köpfen, Filter, Hinweis "Ohne Termin". */
.tp-leiste {
gap: 10px; padding: 8px 10px; margin-bottom: 12px; border-radius: var(--r-lg);
background: var(--surface); border: 1px solid var(--line-soft);
}
.tp-luecke { flex: 1; }
.tp-seg button { min-height: 30px; }
.tp-zeitraum { width: 200px; }
.tp-menue { position: relative; }
.tp-menue > summary {
list-style: none; cursor: pointer; display: inline-flex; align-items: center; min-height: 34px; padding: 0 14px;
border-radius: 999px; border: 1px solid var(--line); background: var(--surface); color: var(--text); font-size: 13px; user-select: none;
}
.tp-menue > summary::-webkit-details-marker { display: none; }
.tp-neu > summary { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }
.tp-menue-liste {
position: absolute; right: 0; top: calc(100% + 6px); z-index: 60; min-width: 250px; padding: 6px;
border-radius: 14px; background: var(--surface); border: 1px solid var(--line-soft); box-shadow: 0 16px 40px rgba(15,40,60,.22);
display: flex; flex-direction: column;
}
html.glas .tp-menue-liste { background: var(--glas-dicht); }
.tp-menue-liste.nach-rechts { right: auto; left: 0; }
.tp-menue-liste button, .tp-menue-liste label {
display: flex; align-items: center; gap: 10px; width: 100%; min-height: 38px; padding: 0 10px; box-sizing: border-box;
border: 0; border-radius: 9px; background: transparent; color: var(--text); font: inherit; font-size: 13.5px; font-weight: 400; text-align: left; cursor: pointer;
}
.tp-menue-liste button:hover, .tp-menue-liste label:hover { background: var(--surface-sunk); }
.tp-menue-liste button.active { color: var(--accent); font-weight: 600; }
.tp-menue-liste hr { border: 0; border-top: 1px solid var(--line-soft); margin: 6px 4px; width: auto; }
.tp-sym-aufgabe { width: 10px; height: 10px; border-radius: 3px; background: var(--accent); flex: none; }
.tp-sym-ms { width: 9px; height: 9px; background: var(--meilenstein, #7a3fb8); transform: rotate(45deg); flex: none; margin: 0 1px; }
@media (prefers-color-scheme: dark) { html:not([data-theme="light"]) .tp-neu > summary { color: #0b141b; } }
html[data-theme="dark"] .tp-neu > summary { color: #0b141b; }
/* Projektzeile ruhiger */
#planGanttContainer .tp-projektzeile .gantt-label { font-weight: 500; color: var(--text-muted); font-size: 12px; }
/* Phasenköpfe */
#planGanttContainer .gantt-row.gantt-phase { background: var(--surface-sunk); }
#planGanttContainer .gantt-row.gantt-phase .gantt-label { background: var(--surface-sunk); padding-left: 6px !important; font-weight: 650 !important; color: var(--text) !important; gap: 6px; }
#planGanttContainer .gantt-row.gantt-phase .gantt-bar.todo { top: 50%; height: 10px; margin-top: -5px; border-radius: 999px; }
.tp-klappen { width: 24px; height: 24px; flex: none; border: 0; border-radius: 6px; background: transparent; color: var(--text-muted); font-size: 10px; cursor: pointer; padding: 0; }
.tp-klappen:hover { background: var(--surface); color: var(--text); }
.tp-phase-info { margin-left: auto; font-size: 11.5px; font-weight: 400; color: var(--text-muted); white-space: nowrap; }
#planGanttContainer .gantt-row.tp-gruppe .gantt-label { font-weight: 650; color: var(--text-muted); font-size: 12px; background: var(--surface-sunk); }
#planGanttContainer .gantt-row.tp-gruppe { background: var(--surface-sunk); min-height: 30px; }
/* Unter einem Phasenkopf eingerückt */
#planGanttContainer .gantt-row.gantt-todo:not(.gantt-phase) .gantt-label,
#planGanttContainer .gantt-row.gantt-milestone-row .gantt-label { padding-left: 30px !important; }
#planGanttContainer .gantt-row.gantt-zu,
#planGanttContainer .gantt-row.gantt-gefiltert { display: none; }
#planGanttContainer .gantt-row.gantt-todo.done .gantt-todo-title { text-decoration: line-through; opacity: .7; }
/* Kürzel der Zuständigen rechts in der Namensspalte */
.gantt-label .gantt-leute { margin-left: auto; display: inline-flex; flex: none; padding-left: 6px; }
.gantt-label .gantt-leute span {
min-width: 20px; height: 20px; padding: 0 3px; box-sizing: border-box; border-radius: 999px; margin-left: -4px;
display: inline-flex; align-items: center; justify-content: center; font-size: 8.5px; font-weight: 700;
background: var(--surface-sunk); color: var(--text); border: 1.5px solid var(--surface);
}
.gantt-label .gantt-todo-title { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.gantt-vorgaenger-warn {
flex: none; width: 16px; height: 16px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
font-size: 10px; font-weight: 800; background: color-mix(in srgb, var(--amber) 20%, transparent); color: var(--amber);
}
/* Heute deutlicher */
#planGanttContainer .gantt-grid-today { border-left-width: 2px; opacity: 1; }
/* Hinweis auf Aufgaben ohne Termin */
.tp-ohne {
display: flex; align-items: center; gap: 8px; width: 100%; margin-top: 8px; padding: 10px 14px; box-sizing: border-box;
border: 1px dashed var(--line); border-radius: var(--r-md); background: transparent; color: var(--text-muted); font: inherit; font-size: 13px; text-align: left; cursor: pointer;
}
.tp-ohne:hover { border-color: var(--accent); color: var(--text); }
.tp-ohne[hidden] { display: none; }
.tp-ohne-zahl { background: var(--surface-sunk); border-radius: 999px; padding: 1px 8px; font-weight: 600; color: var(--text); }
.tp-ohne-hinweis { margin-left: auto; font-size: 12px; }
#planGanttContainer .gantt-row.gantt-phase .gantt-todo-title { flex: 1 1 auto; min-width: 70px; }
#planGanttContainer .gantt-row.gantt-phase .tp-phase-info { flex: none; }
/* Die Glas-Darstellung gibt Knöpfen einen Rahmen — in Umschaltern und
Menüs soll es keinen geben; das Menü deckt den Plan dahinter ab. */
#planSection-terminplan .tp-seg button,
#planSection-terminplan .tp-menue-liste button { border: 0 !important; box-shadow: none; }
#planSection-terminplan .tp-seg button[aria-pressed="true"] { box-shadow: var(--sh-1); }
#planSection-terminplan .tp-menue-liste { -webkit-backdrop-filter: blur(24px) saturate(160%); backdrop-filter: blur(24px) saturate(160%); }
html.glas #planSection-terminplan .tp-menue-liste { background: var(--glas-dicht); }
@media (prefers-color-scheme: light) { html.glas:not([data-theme="dark"]) #planSection-terminplan .tp-menue-liste { background: rgba(255,255,255,.96); } }
html.glas[data-theme="light"] #planSection-terminplan .tp-menue-liste { background: rgba(255,255,255,.96); }
/* Getönte Namenszellen (Projektzeile, Phasenköpfe, Gruppen) liegen auf
einem deckenden Grund — sonst schienen beim waagerechten Scrollen die
Balken durch. --gantt-label-grund setzt glas.css; ohne Glas ist
--surface ohnehin deckend. */
#planGanttContainer .gantt-row.gantt-project.highlighted .gantt-label {
background: linear-gradient(var(--accent-soft), var(--accent-soft)), var(--gantt-label-grund, var(--surface));
}
#planGanttContainer .gantt-row.gantt-phase .gantt-label,
#planGanttContainer .gantt-row.tp-gruppe .gantt-label {
background: linear-gradient(var(--surface-sunk), var(--surface-sunk)), var(--gantt-label-grund, var(--surface));
}
.tp-sym-phase { width: 14px; height: 6px; border-radius: 999px; background: var(--accent); flex: none; opacity: .75; }
#todoEditPhaseAbs select { width: 100%; }
/* ===================== Bereich Leistungsphasen =====================
Eriks Wahl "B": Ablaufbalken über alle Phasen, darunter eine Kachel je
Phase (renderPlanPhasen(), js/plan/plan-phasen.js). Text auf Akzent-
flächen in festem Weiß — unter Glas ist var(--surface) durchscheinend. */
.phasen-zusammenfassung {
display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 14px;
font-size: 13px; color: var(--text-muted); margin: 0 2px 12px;
}
.phasen-zusammenfassung span { font-size: 12px; color: var(--text-subtle); }
.phasen-kopf { font-size: 11px; font-weight: 650; letter-spacing: .02em; color: var(--text-muted); text-transform: uppercase; margin-bottom: 8px; }
.phasen-ablauf { margin-bottom: 16px; }
.phasen-ablauf-spur { position: relative; height: 30px; }
.phasen-ablauf-seg {
position: absolute; top: 0; bottom: 0; min-width: 0;
display: flex; align-items: center; padding: 0 8px; overflow: hidden;
border: 0; border-radius: var(--r-md); cursor: pointer;
font: inherit; font-size: 12px; font-weight: 600; white-space: nowrap;
color: var(--text); background: var(--surface-sunk);
}
.phasen-ablauf-seg + .phasen-ablauf-seg { box-shadow: -2px 0 0 var(--surface); }
.phasen-ablauf-seg.is-fertig { background: var(--green); color: #fff; }
.phasen-ablauf-seg.is-laeuft {
color: #fff;
background: linear-gradient(90deg, var(--accent) var(--fort), color-mix(in srgb, var(--accent) 45%, transparent) var(--fort));
}
.phasen-ablauf-seg span { overflow: hidden; text-overflow: ellipsis; }
.phasen-ablauf-heute { position: absolute; top: -4px; bottom: -4px; border-left: 2px solid var(--red); pointer-events: none; }
.phasen-ablauf-achse { position: relative; display: flex; justify-content: space-between; margin-top: 6px; font-size: 11.5px; color: var(--text-muted); }
.phasen-ablauf-heute-text { position: absolute; top: 0; transform: translateX(-50%); color: var(--red); font-weight: 600; white-space: nowrap; }
.phasen-raster { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 14px; }
.phasen-kachel {
display: flex; flex-direction: column; gap: 12px;
background: var(--surface); border: 1px solid var(--line-soft);
border-radius: var(--r-lg); padding: 14px 16px;
}
.phasen-kachel.is-laeuft { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
.phasen-kachel.is-fertig { opacity: .8; }
.phasen-kachel.ist-markiert { animation: phasen-markiert 1.2s var(--ease-out, ease-out); }
@keyframes phasen-markiert { 0%, 40% { box-shadow: 0 0 0 3px var(--accent); } 100% { box-shadow: none; } }
.phasen-kachel-kopf { display: flex; align-items: flex-start; gap: 12px; }
.phasen-ring {
--ring: var(--text-subtle);
width: 52px; height: 52px; border-radius: 50%; flex: none;
display: flex; align-items: center; justify-content: center;
background: conic-gradient(var(--ring) var(--fort), var(--surface-sunk) 0);
}
.phasen-kachel.is-laeuft .phasen-ring { --ring: var(--accent); }
.phasen-kachel.is-fertig .phasen-ring { --ring: var(--green); }
.phasen-ring span {
width: 42px; height: 42px; border-radius: 50%; background: var(--surface-alt);
display: flex; align-items: center; justify-content: center;
font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums;
}
.phasen-kachel-name { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.phasen-kachel-name b { font-size: 15px; }
.phasen-kachel-name span { font-size: 12.5px; color: var(--text-muted); }
.phasen-chip { font-size: 11px; font-weight: 600; padding: 2px 9px; border-radius: 999px; background: var(--surface-sunk); color: var(--text-muted); white-space: nowrap; }
.phasen-chip.is-laeuft { background: var(--accent); color: #fff; }
.phasen-chip.is-fertig { background: color-mix(in srgb, var(--green) 18%, transparent); color: var(--green); }
.phasen-hinweis { font-size: 12px; color: var(--amber); margin-top: -4px; }
.phasen-werte { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; font-size: 12.5px; }
.phasen-werte > span { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.phasen-werte small { font-size: 11.5px; color: var(--text-muted); }
.phasen-werte b { font-weight: 600; font-variant-numeric: tabular-nums; }
.phasen-leer { color: var(--text-subtle); font-weight: 400; font-style: italic; }
.phasen-knoepfe { display: flex; flex-wrap: wrap; gap: 8px; }
/* Aufgabenliste: Phasen-Kennzeichen je Aufgabe und Filter */
.plan-task-phase {
flex-shrink: 0; font-size: 11px; font-weight: 600; padding: 1px 8px; border-radius: 999px;
background: var(--accent-soft); color: var(--accent); white-space: nowrap;
}
.plan-task-filter { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: -2px 0 10px; font-size: 12px; color: var(--text-muted); }
.plan-task-filter:empty { display: none; }
.plan-task-filter > span { margin-right: 2px; }
.plan-task-filter-btn {
min-height: 28px; padding: 0 12px; border-radius: 999px; font: inherit; font-size: 12px;
border: 1px solid var(--line); background: var(--surface); color: var(--text); cursor: pointer;
}
.plan-task-filter-btn.is-active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); font-weight: 600; }
@media (max-width: 600px) { .phasen-werte { grid-template-columns: 1fr 1fr; } }
/* Leistungsphasen farblich von Aufgaben getrennt (Eriks Wunsch): Phasen-
balken in Blauviolett (bewusst bläulicher als das Lila der Meilensteine), Aufgaben bleiben im Akzentblau, erledigte grün,
Meilensteine lila — keine Farbe ist doppelt belegt. */
:root { --gantt-phase: #6a5fc7; }
@media (prefers-color-scheme: dark) { html:not([data-theme="light"]) { --gantt-phase: #a59ef2; } }
html[data-theme="dark"] { --gantt-phase: #a59ef2; }
#planGanttContainer .gantt-row.gantt-phase .gantt-bar.todo,
#planGanttContainer .gantt-row.gantt-phase .gantt-bar.todo.done { background: var(--gantt-phase); }
.tp-sym-phase { background: var(--gantt-phase); opacity: 1; }
/* Aufgaben-Vorlagen je Gewerk (Admin): Gewerk-Umschalter, Spaltenkopf und
bearbeitbare Zeilen — gleiche Spalten wie die Zeile „+ Schritt". */
.vorlagen-wahl { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin: 10px 0 12px; }
.vorlagen-gewerke { display: inline-flex; gap: 4px; padding: 3px; border-radius: 999px; background: var(--surface-sunk); }
.vorlagen-gewerk { border: 0; background: transparent; color: var(--text-muted); font: inherit; font-size: 13px; font-weight: 600;
padding: 6px 14px; border-radius: 999px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; }
.vorlagen-gewerk span { font-size: 11px; font-weight: 500; opacity: .75; }
.vorlagen-gewerk.is-active { background: var(--surface); color: var(--text); box-shadow: var(--sh-1); }
.vorlagen-kopf, .vorlagen-zeile, .vorlagen-neu {
display: grid !important; grid-template-columns: minmax(0, 1fr) 80px 90px 90px 120px; gap: 8px; align-items: center;
}
.vorlagen-kopf { font-size: 11px; letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); padding: 0 6px 4px; }
.vorlagen-zeile input { width: 100%; box-sizing: border-box; min-width: 0; }
.vorlagen-neu input[type=text], .vorlagen-neu input[type=number] { width: 100%; min-width: 0; flex: none; box-sizing: border-box; }
.vorlagen-aktionen { display: inline-flex; gap: 4px; justify-content: flex-end; align-items: center; }
#planSection-terminplan .vorlagen-gewerk, #admin .vorlagen-gewerk { border: 0 !important; }
@media (max-width: 640px){
.vorlagen-kopf { display: none !important; }
.vorlagen-zeile, .vorlagen-neu { grid-template-columns: 1fr 1fr; }
.vorlagen-zeile input[type=text], .vorlagen-neu input[type=text] { grid-column: 1 / -1; }
.template-head-grid { grid-template-columns: 1fr; }
}
.vorlagen-summe { font-size: 12.5px; color: var(--text-muted); padding: 6px 6px 0; }
.vorlagen-summe b { color: var(--text); font-variant-numeric: tabular-nums; }
/* ---------- Termin aus Mail (js/plan/plan-mail-eintrag.js) ---------- */
.mail-ablage {
position: fixed; inset: 0; z-index: 250;
display: flex; align-items: center; justify-content: center;
background: color-mix(in srgb, var(--accent) 12%, transparent);
border: 3px dashed var(--accent);
pointer-events: none;
}
.mail-ablage[hidden] { display: none; }
.mail-ablage-karte {
display: flex; flex-direction: column; align-items: center; gap: 8px;
max-width: 420px; padding: 24px 28px; text-align: center;
background: var(--bg); color: var(--text);
border: 1px solid var(--line); border-radius: var(--r-lg, 14px);
box-shadow: 0 12px 40px rgba(0,0,0,.18);
}
.mail-ablage-karte svg { width: 32px; height: 32px; color: var(--accent); }
.mail-ablage-karte b { font-size: 1.1em; }
.mail-ablage-karte span { color: var(--text-subtle); font-size: .9em; }
.mail-ablage.ist-beschaeftigt .mail-ablage-karte svg { animation: mail-puls 1.2s ease-in-out infinite; }
@keyframes mail-puls { 50% { opacity: .35; } }
@media (prefers-reduced-motion: reduce) { .mail-ablage.ist-beschaeftigt .mail-ablage-karte svg { animation: none; } }
.pd-notiz {
width: 100%; box-sizing: border-box; resize: vertical; min-height: 80px;
font: inherit; font-size: .9em; line-height: 1.4;
}
.pd-mail-hinweis {
margin: 0 0 6px; padding: 6px 10px; border-radius: 8px;
background: color-mix(in srgb, var(--accent) 10%, transparent); color: var(--text);
}
.plan-task-notiz { display: inline-flex; color: var(--text-subtle); }
.plan-task-notiz svg { width: 14px; height: 14px; }
.mail-auswahl { width: min(560px, calc(100vw - 32px)); }
.mail-auswahl-liste { display: flex; flex-direction: column; gap: 4px; max-height: 50vh; overflow-y: auto; margin: 12px 0; }
.mail-auswahl-zeile {
display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: center;
padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; cursor: pointer;
}
.mail-auswahl-datum { color: var(--text-subtle); font-size: .88em; white-space: nowrap; }