Dateien
AegisSight-Monitor/src/static/css/studio.css
claude-dev 26b2c08138 fix(studio): Kopfzeile und Fall-Auswahl an die klassische Ansicht angeglichen
Portierung aus dem Lokal-Fork (AegisSight-Monitor-Local, Commit 9613610).
Vier Angleichungen an das klassische Dashboard.

1. "Klassische Ansicht" ist jetzt derselbe Knopf wie "Studio-Ansicht" im
   Dashboard, mit Symbol, an erster Stelle im rechten Kopfzeilen-Block.
2. Oben rechts fehlten Barrierefreiheit, Konto-Menü und Abmelden. Der
   A11yManager liegt jetzt in js/a11y.js und wird von beiden Oberflächen
   eingebunden, denn das Studio lädt app.js nicht. Konto-Menü (Organisation,
   Lizenz, Credits, Über KI-Inhalte) und Abmelden nachgezogen, der
   Theme-Schalter ist derselbe Schiebeschalter wie im Dashboard.
3. Die Fall-Liste hat jetzt die Umschaltung "Alle" / "Eigene" in der
   Knopf-Optik der klassischen Seitenleiste, der Reiter-Zähler zieht mit.
4. Der Hinweis "Wähle links einen Fall aus" endet vor der Bausteine-Spalte
   statt am Fensterrand, im gestapelten Layout nimmt er die volle Breite.

Das info@-Gating des Studios bleibt unverändert bestehen.
Versionsmarker der angefassten Dateien auf 20260725a angehoben.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:39:25 +00:00

1375 Zeilen
44 KiB
CSS

/* AegisSight Studio - NotebookLM-artiges 3-Spalten-Layout
Nutzt ausschliesslich die Design-Tokens aus style.css (Navy/Gold). */
.studio {
display: flex;
flex-direction: column;
height: 100vh;
background: var(--bg-primary);
color: var(--text-primary);
}
/* === Kopfzeile === */
.studio-top {
display: flex;
align-items: center;
gap: var(--sp-lg);
padding: var(--sp-md) var(--sp-xl);
background: var(--bg-topbar);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
min-height: 52px;
}
.studio-brand {
font-family: var(--font-title);
font-weight: 700;
font-size: 16px;
letter-spacing: 0.5px;
white-space: nowrap;
}
.studio-brand span { color: var(--accent); }
/* Kopfzeile: Knopf zum Anlegen (an der Stelle des frueheren Dropdowns) + Titel des Falls */
.studio-new-btn { flex-shrink: 0; }
.studio-incident-title {
font-family: var(--font-title);
font-weight: 600;
font-size: 14px;
color: var(--text-primary);
max-width: 460px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.studio-type-badge {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 3px 8px;
border-radius: var(--radius);
background: var(--tint-accent);
color: var(--accent);
white-space: nowrap;
}
.studio-type-badge.type-research { background: var(--tint-info); color: var(--info); }
.studio-btn {
background: var(--accent);
color: #fff;
border: none;
border-radius: var(--radius);
padding: 7px 14px;
font-family: var(--font-body);
font-size: 13px;
font-weight: 600;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
transition: background 0.15s;
}
.studio-btn:hover { background: var(--accent-hover); }
.studio-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.studio-btn-ghost {
background: transparent;
color: var(--text-secondary);
border: 1px solid var(--border);
}
.studio-btn-ghost:hover { background: var(--bg-hover); color: var(--text-primary); }
/* Pipeline-Statusstreifen */
.studio-status {
display: none;
align-items: center;
gap: 8px;
font-size: 12px;
color: var(--text-secondary);
background: var(--tint-accent-subtle);
border: 1px solid var(--tint-accent);
border-radius: var(--radius);
padding: 4px 10px;
max-width: 360px;
overflow: hidden;
}
.studio-status.active { display: flex; }
.studio-status .mini-spinner {
width: 12px; height: 12px;
border: 2px solid var(--tint-accent);
border-top-color: var(--accent);
border-radius: 50%;
animation: studio-spin 0.8s linear infinite;
flex-shrink: 0;
}
.studio-status-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.studio-status-timer { font-family: var(--font-mono); font-size: 11px; color: var(--text-disabled); }
@keyframes studio-spin { to { transform: rotate(360deg); } }
.studio-top-right {
margin-left: auto;
display: flex;
align-items: center;
gap: var(--sp-md);
}
/* Reine Textlinks in der Kopfzeile. Links, die als Knopf auftreten (.btn),
bleiben ausgenommen, sonst ueberschreibt die Farbe hier die Knopf-Optik. */
.studio-top-right a:not(.btn) { color: var(--text-secondary); font-size: 12px; text-decoration: none; }
.studio-top-right a:not(.btn):hover { color: var(--accent); }
/* === 3 Spalten === */
.studio-cols {
position: relative; /* Bezug fuer die Hinweis-Auflage (.studio-empty) */
flex: 1;
display: grid;
grid-template-columns: 300px 1fr 320px;
gap: 1px;
background: var(--border);
min-height: 0;
}
.studio-col {
background: var(--bg-primary);
display: flex;
flex-direction: column;
min-height: 0;
overflow: hidden;
}
.studio-col-artifacts { background: var(--bg-secondary); }
.studio-col-center { position: relative; } /* Bezug fuer das Startpanel (.start-panel) */
/* === Linke Spalte: Reiter "Fälle" / "Quellen" === */
.left-tabs {
display: flex;
flex-shrink: 0;
border-bottom: 1px solid var(--border);
}
.left-tab {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
white-space: nowrap;
padding: var(--sp-lg) var(--sp-md);
background: none;
border: none;
border-bottom: 2px solid transparent;
cursor: pointer;
font-family: var(--font-title);
font-weight: 600;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.8px;
color: var(--text-secondary);
transition: color .15s, border-color .15s, background .15s;
}
.left-tab:hover { background: var(--bg-hover); color: var(--text-primary); }
.left-tab.active { color: var(--accent); border-bottom-color: var(--accent); }
.left-tab .lt-count {
font-family: var(--font-body);
font-weight: 500;
font-size: 11px;
text-transform: none;
letter-spacing: 0;
color: var(--text-disabled);
}
.left-pane {
display: flex;
flex-direction: column;
min-height: 0;
flex: 1;
overflow: hidden;
}
.left-pane[hidden] { display: none; }
/* "Alle" / "Eigene" ueber der Fall-Liste. Nutzt die Knopf-Optik der klassischen
Seitenleiste (.sidebar-filter-btn aus style.css), braucht hier aber den
Innenabstand der Studio-Spalte statt des Seitenleisten-Abstands. */
.case-scope {
padding: var(--sp-md) var(--sp-xl) 0;
margin-bottom: 0;
flex-shrink: 0;
}
/* Fall-Liste (ersetzt das Dropdown in der Kopfzeile) */
.case-group {
display: flex;
align-items: center;
gap: 6px;
width: 100%;
padding: var(--sp-lg) var(--sp-md) var(--sp-sm);
background: none;
border: none;
font-size: 10px;
text-transform: uppercase;
letter-spacing: .06em;
color: var(--text-disabled);
text-align: left;
}
.case-group span { color: var(--text-disabled); opacity: .8; }
.case-group-toggle { cursor: pointer; }
.case-group-toggle:hover { color: var(--text-secondary); }
.case-group-toggle svg { transition: transform .15s; }
.case-group-toggle.open svg { transform: rotate(90deg); }
.case-item {
display: flex;
align-items: stretch;
border: 1px solid var(--border);
border-radius: var(--radius-md, 6px);
background: var(--bg-card);
margin-bottom: 4px;
overflow: hidden;
transition: border-color .15s, background .15s;
}
.case-item:hover { border-color: var(--accent); }
.case-item.active { border-color: var(--accent); background: var(--tint-accent-faint); }
.case-open {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
background: none;
border: none;
cursor: pointer;
text-align: left;
color: var(--text-primary);
font-family: var(--font-body);
font-size: 12.5px;
}
.case-item.active .case-open { color: var(--accent); font-weight: 600; }
.case-title {
flex: 1;
min-width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.case-count {
flex-shrink: 0;
font-size: 10.5px;
color: var(--text-disabled);
}
/* === Startpanel: frisch angelegter Fall, der Nutzer entscheidet aktiv === */
.start-panel {
position: absolute;
inset: 0;
z-index: 6;
display: flex;
align-items: center;
justify-content: center;
padding: var(--sp-xl);
background: var(--bg-primary);
overflow-y: auto;
}
.start-panel[hidden] { display: none; }
.sp-inner { width: 100%; max-width: 560px; }
.sp-head { margin-bottom: var(--sp-xl); text-align: center; }
.sp-title {
font-family: var(--font-title);
font-weight: 700;
font-size: 19px;
color: var(--text-primary);
}
.sp-sub { margin-top: 4px; font-size: 13px; color: var(--text-secondary); }
.sp-warn {
display: flex;
align-items: flex-start;
gap: var(--sp-md);
padding: var(--sp-md) var(--sp-lg);
margin-bottom: var(--sp-lg);
border: 1px solid var(--warning);
border-radius: var(--radius-md, 6px);
background: var(--tint-warning);
color: var(--warning);
font-size: 12px;
line-height: 1.45;
}
.sp-warn[hidden] { display: none; }
.sp-warn svg { flex-shrink: 0; margin-top: 1px; }
.sp-options { display: flex; flex-direction: column; gap: var(--sp-md); }
.sp-opt {
display: flex;
align-items: flex-start;
gap: var(--sp-lg);
width: 100%;
padding: var(--sp-lg);
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 10px;
cursor: pointer;
text-align: left;
color: var(--text-primary);
font-family: var(--font-body);
transition: border-color .15s, background .15s, transform .08s;
}
.sp-opt:hover { border-color: var(--accent); background: var(--bg-hover); }
.sp-opt:active { transform: translateY(1px); }
.sp-opt:disabled { opacity: .45; cursor: not-allowed; }
.sp-ico { flex-shrink: 0; display: inline-flex; color: var(--accent); margin-top: 2px; }
.sp-text { min-width: 0; }
.sp-name {
display: block;
font-family: var(--font-title);
font-weight: 600;
font-size: 13.5px;
margin-bottom: 3px;
}
.sp-desc { display: block; font-size: 12px; color: var(--text-secondary); line-height: 1.45; }
/* Rueckfrage-Dialog (ersetzt das Browser-confirm) */
.modal.modal-confirm { max-width: 460px; }
.confirm-list {
list-style: none;
margin: 0 0 var(--sp-lg);
padding: var(--sp-md) var(--sp-lg);
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-md, 6px);
max-height: 190px;
overflow-y: auto;
}
.confirm-list li {
font-size: 12.5px;
color: var(--text-primary);
padding: 3px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.confirm-list li.cd-more { color: var(--text-disabled); font-style: italic; }
.confirm-warn { font-size: 13px; color: var(--text-primary); margin-bottom: var(--sp-md); }
.confirm-warn strong { color: var(--danger, #EF4444); }
.confirm-hint { font-size: 12px; color: var(--text-disabled); }
/* Mehrfachauswahl. Achtung: .col-actions setzt display:flex und wuerde das
hidden-Attribut ueberstimmen - deshalb hier explizit ausblenden. */
#case-select-row[hidden] { display: none; }
.case-check {
flex-shrink: 0;
display: flex;
align-items: center;
padding: 0 2px 0 8px;
cursor: pointer;
}
.case-check input { cursor: pointer; accent-color: var(--accent); }
.case-item.picked { border-color: var(--accent); background: var(--tint-accent); }
.case-sel-hint { font-size: 11px; color: var(--accent); }
.bulk-bar {
flex-shrink: 0;
display: flex;
flex-direction: column;
gap: var(--sp-md);
padding: var(--sp-lg);
border-top: 1px solid var(--border);
background: var(--bg-secondary);
}
.bulk-bar[hidden] { display: none; }
.bulk-count {
font-family: var(--font-title);
font-weight: 600;
font-size: 12px;
color: var(--text-primary);
}
.bulk-actions { display: flex; flex-wrap: wrap; gap: var(--sp-sm); }
.btn-bulk {
flex: 1;
min-width: 84px;
padding: 6px 10px;
border-radius: var(--radius-md, 6px);
border: 1px solid var(--border);
background: var(--bg-card);
color: var(--text-primary);
font-family: var(--font-body);
font-size: 11.5px;
font-weight: 600;
cursor: pointer;
transition: border-color .15s, background .15s, color .15s;
}
.btn-bulk:hover { border-color: var(--accent); color: var(--accent); }
.btn-bulk[hidden] { display: none; }
.btn-bulk.danger { color: var(--danger, #EF4444); }
.btn-bulk.danger:hover { border-color: var(--danger, #EF4444); background: var(--tint-error, rgba(239,68,68,.12)); }
.btn-bulk.ghost { color: var(--text-disabled); font-weight: 500; }
.btn-bulk.ghost:hover { color: var(--text-primary); border-color: var(--border); }
.case-menu-btn {
flex-shrink: 0;
width: 28px;
display: flex;
align-items: center;
justify-content: center;
background: none;
border: none;
border-left: 1px solid var(--border);
color: var(--text-disabled);
cursor: pointer;
}
.case-menu-btn:hover { color: var(--accent); background: var(--bg-hover); }
.case-menu {
position: fixed;
z-index: 300;
min-width: 170px;
padding: 4px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius-lg, 8px);
box-shadow: 0 8px 28px rgba(0,0,0,.28);
}
.case-menu button {
display: block;
width: 100%;
padding: 7px 10px;
background: none;
border: none;
border-radius: var(--radius-md, 6px);
text-align: left;
cursor: pointer;
font-family: var(--font-body);
font-size: 12.5px;
color: var(--text-primary);
}
.case-menu button:hover { background: var(--bg-hover); }
.case-menu button.danger { color: var(--danger, #EF4444); }
.case-menu button.danger:hover { background: var(--tint-error, rgba(239,68,68,.12)); }
.col-head {
display: flex;
align-items: center;
gap: 8px;
padding: var(--sp-lg) var(--sp-xl);
font-family: var(--font-title);
font-weight: 600;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 0.8px;
color: var(--text-secondary);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.col-head .col-count {
margin-left: auto;
font-size: 11px;
font-weight: 500;
letter-spacing: 0;
text-transform: none;
color: var(--text-disabled);
}
.col-body {
flex: 1;
overflow-y: auto;
padding: var(--sp-lg) var(--sp-xl);
min-height: 0;
}
/* === Spalte 1: Quellen === */
.col-actions {
display: flex;
align-items: center;
gap: 8px;
padding: var(--sp-md) var(--sp-xl);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.col-actions label {
display: flex; align-items: center; gap: 6px;
font-size: 12px; color: var(--text-secondary); cursor: pointer;
}
.col-actions input[type="checkbox"] { accent-color: var(--accent); cursor: pointer; }
.col-actions .spacer { margin-left: auto; }
.ingest-add-btn { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; padding: 4px 10px; }
/* --- Quellen-Ingest: Dropzone + Job-Liste --- */
.ingest-panel {
padding: var(--sp-md) var(--sp-xl);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.dropzone {
display: flex; flex-direction: column; align-items: center; justify-content: center;
gap: 4px; text-align: center;
padding: 16px 12px;
border: 1.5px dashed var(--border);
border-radius: 10px;
color: var(--text-secondary);
cursor: pointer;
transition: border-color .15s, background .15s;
}
.dropzone:hover, .dropzone.drag { border-color: var(--accent); background: var(--bg-hover); }
.dropzone .dz-icon { color: var(--accent); }
.dropzone .dz-hint { font-size: 12.5px; color: var(--text-primary); }
.dropzone .dz-sub { font-size: 11px; color: var(--text-disabled); }
.ingest-url { display: flex; gap: 6px; margin-top: 8px; }
.ingest-url input {
flex: 1; min-width: 0; font-size: 12px;
padding: 6px 10px; border-radius: 8px;
border: 1px solid var(--border); background: var(--bg-card); color: var(--text-primary);
}
.ingest-url input:focus { outline: none; border-color: var(--accent); }
.ingest-jobs { flex-shrink: 0; overflow-y: auto; max-height: 40%; padding: 0 var(--sp-xl); }
.ingest-jobs:not(:empty) { padding-top: var(--sp-sm); padding-bottom: var(--sp-sm); border-bottom: 1px solid var(--border); }
.ju-group { margin-bottom: 8px; }
.ju-group-head {
display: flex; align-items: center; gap: 6px;
font-size: 11px; font-weight: 600; letter-spacing: .02em;
color: var(--text-secondary); text-transform: uppercase;
margin: 4px 0;
}
.ju-group-head .ju-count {
margin-left: auto; background: var(--bg-card); border: 1px solid var(--border);
border-radius: 8px; padding: 0 6px; font-weight: 500; text-transform: none;
}
.ju-item {
background: var(--bg-card); border: 1px solid var(--border);
border-radius: 8px; padding: 7px 9px; margin-bottom: 5px;
}
.ju-item.error { border-color: var(--danger, #d9534f); }
.ju-row { display: flex; align-items: center; gap: 6px; }
.ju-name { flex: 1; min-width: 0; font-size: 12.5px; color: var(--text-primary);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ju-del { background: none; border: none; color: var(--text-disabled); font-size: 16px;
line-height: 1; cursor: pointer; padding: 0 2px; }
.ju-del:hover { color: var(--danger, #d9534f); }
.ju-bar { height: 4px; background: var(--bg-hover); border-radius: 3px; overflow: hidden; margin-top: 6px; }
.ju-bar span { display: block; height: 100%; background: var(--accent); transition: width .4s ease; }
.ju-stage { font-size: 10.5px; color: var(--text-disabled); margin-top: 3px; }
.ju-err { font-size: 11px; color: var(--danger, #d9534f); margin-top: 4px; }
.ju-actions { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 6px; }
.ju-btn {
font-size: 11px; padding: 3px 9px; border-radius: 12px;
border: 1px solid var(--border); background: var(--bg-elevated, var(--bg-card));
color: var(--text-secondary); cursor: pointer; text-decoration: none;
}
.ju-btn:hover { border-color: var(--accent); color: var(--accent); }
.ju-media:not(:empty) { margin-top: 6px; }
.ju-text {
font-size: 12px; line-height: 1.5; color: var(--text-secondary);
background: var(--bg-hover); border-radius: 8px; padding: 8px 10px;
max-height: 220px; overflow-y: auto; white-space: normal;
}
/* Kategorie-Gliederung der regulären Quellenliste (Webseiten/Dokumente/…) */
.src-cat { margin-bottom: 2px; }
.src-cat-head {
display: flex; align-items: center; gap: 6px;
padding: 10px var(--sp-xl) 4px;
font-size: 11px; font-weight: 600; letter-spacing: .03em; text-transform: uppercase;
color: var(--text-secondary);
cursor: pointer; user-select: none;
}
.src-cat-head:hover { color: var(--text-primary); }
.src-cat-head svg.src-cat-icon, .src-cat-head > svg:not(.src-cat-chevron) { color: var(--accent); }
.src-cat-head .src-cat-count { margin-left: auto; color: var(--text-disabled); font-weight: 500; }
.src-cat-chevron { color: var(--text-disabled); transition: transform .15s ease; flex-shrink: 0; }
.src-cat.collapsed .src-cat-chevron { transform: rotate(-90deg); }
.src-cat.collapsed .src-item { display: none; }
.src-upload { display: flex; flex-direction: column; gap: 4px; }
.src-upload .ju-actions { margin-top: 2px; }
.ju-btn-del { color: var(--text-disabled); }
.ju-btn-del:hover { border-color: var(--danger, #d9534f); color: var(--danger, #d9534f); }
/* Historie (frühere Lageberichte / Faktencheck-Läufe, aufklappbar) */
.hist-item { border: 1px solid var(--border); border-radius: 8px; margin-bottom: 6px; background: var(--bg-card); }
.hist-item > summary {
list-style: none; cursor: pointer; padding: 8px 10px;
display: flex; align-items: center; gap: 10px; font-size: 12.5px;
}
.hist-item > summary::-webkit-details-marker { display: none; }
.hist-item > summary::before {
content: "\25B8"; color: var(--text-disabled); transition: transform .15s; font-size: 11px;
}
.hist-item[open] > summary::before { transform: rotate(90deg); }
.hist-time { color: var(--text-primary); font-weight: 600; }
.hist-meta { color: var(--text-disabled); margin-left: auto; }
.hist-body { padding: 4px 12px 12px; }
.hist-prev { font-size: 12px; color: var(--text-secondary); line-height: 1.5; }
.fc-history { margin-top: 14px; border-top: 1px solid var(--border); padding-top: 10px; }
.fc-history > summary {
cursor: pointer; font-size: 12px; font-weight: 600; color: var(--text-secondary);
list-style: none; padding: 2px 0;
}
.fc-history > summary::-webkit-details-marker { display: none; }
.fc-history > summary::before { content: "\25B8 "; color: var(--text-disabled); }
.fc-history[open] > summary::before { content: "\25BE "; }
.fc-history-body { margin-top: 8px; }
/* Quellen-Suchfeld (oberster Punkt der Quellen-Spalte) */
.src-search {
display: flex;
align-items: center;
gap: 8px;
padding: var(--sp-md) var(--sp-xl);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.src-search-icon {
display: inline-flex;
align-items: center;
color: var(--text-disabled);
flex-shrink: 0;
}
.src-search input {
flex: 1;
min-width: 0;
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: var(--radius);
color: var(--text-primary);
font-family: var(--font-body);
font-size: 13px;
padding: 7px 10px;
}
.src-search input:focus { outline: none; border-color: var(--accent); }
.src-item.filtered-out { display: none; }
.src-item {
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: 6px;
background: var(--bg-card);
overflow: hidden;
}
.src-item.deselected { opacity: 0.45; }
.src-head {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
cursor: pointer;
}
.src-head:hover { background: var(--bg-hover); }
.src-check { accent-color: var(--accent); cursor: pointer; flex-shrink: 0; }
.src-name {
font-size: 13px;
font-weight: 500;
color: var(--text-primary);
flex: 1;
min-width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.src-count {
font-size: 11px;
color: var(--text-disabled);
background: var(--bg-elevated);
border-radius: 10px;
padding: 1px 7px;
flex-shrink: 0;
}
.src-badges { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }
.src-lang { font-size: 10px; color: var(--text-disabled); flex-shrink: 0; }
.src-articles {
display: none;
border-top: 1px solid var(--border);
padding: 4px 10px 8px;
}
.src-item.open .src-articles { display: block; }
.src-article {
display: block;
font-size: 12px;
color: var(--text-secondary);
padding: 4px 0;
text-decoration: none;
border-bottom: 1px solid var(--tint-hover-subtle);
line-height: 1.4;
}
.src-article:last-child { border-bottom: none; }
.src-article:hover { color: var(--accent); }
.src-article .src-article-date { color: var(--text-disabled); font-size: 10px; margin-right: 6px; }
/* Quelle beim Zitat-Klick hervorheben */
.src-item.cite-flash {
animation: cite-flash 1.6s ease;
border-color: var(--accent);
}
@keyframes cite-flash {
0%, 30% { box-shadow: 0 0 0 2px var(--accent), var(--glow-accent); }
100% { box-shadow: none; }
}
/* Reliability-/Bias-Badges (Wiederverwendung der style.css-Klassen, hier nur Ausrichtung) */
.src-badges .source-reliability-dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }
.src-badges .source-political-badge,
.src-badges .source-ifcn-badge,
.src-badges .source-eu-disinfo-badge,
.src-badges .source-state-badge,
.src-badges .source-alignment-chip-badge { font-size: 9px; }
/* === Spalte 2: Konversation === */
.chat-messages {
flex: 1;
overflow-y: auto;
padding: var(--sp-lg) var(--sp-xl);
display: flex;
flex-direction: column;
gap: var(--sp-lg);
min-height: 0;
}
.chat-msg { max-width: 92%; }
.chat-msg-user {
align-self: flex-end;
background: var(--accent);
color: #fff;
border-radius: 12px 12px 2px 12px;
padding: 8px 12px;
font-size: 13px;
line-height: 1.5;
}
.chat-msg-assistant {
align-self: flex-start;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 12px 12px 12px 2px;
padding: 10px 14px;
font-size: 13px;
line-height: 1.6;
color: var(--text-primary);
}
.chat-msg-assistant.pinned {
border-color: var(--tint-accent);
background: var(--tint-accent-faint);
max-width: 100%;
align-self: stretch;
}
.chat-msg-assistant .briefing-content { font-size: 13px; }
.chat-pin-label {
font-size: 10px; text-transform: uppercase; letter-spacing: 0.6px;
color: var(--accent); font-weight: 600; margin-bottom: 6px;
}
.chat-cite {
display: inline-block;
color: var(--accent);
font-weight: 600;
cursor: pointer;
font-size: 11px;
vertical-align: super;
padding: 0 1px;
}
.chat-cite:hover { text-decoration: underline; }
.chat-thinking { color: var(--text-disabled); font-style: italic; font-size: 12px; }
.chat-suggestions {
display: flex;
flex-wrap: wrap;
gap: 6px;
padding: 0 var(--sp-xl) var(--sp-md);
flex-shrink: 0;
}
.chat-chip {
background: var(--bg-card);
border: 1px solid var(--border);
color: var(--text-secondary);
border-radius: 14px;
padding: 5px 12px;
font-size: 12px;
cursor: pointer;
white-space: nowrap;
}
.chat-chip:hover { border-color: var(--accent); color: var(--accent); }
.chat-scope {
display: flex;
align-items: center;
gap: 6px;
padding: 0 var(--sp-xl) var(--sp-sm);
font-size: 12px;
color: var(--text-disabled);
cursor: pointer;
user-select: none;
flex-shrink: 0;
}
.chat-scope input { accent-color: var(--accent); cursor: pointer; margin: 0; }
.chat-scope:hover { color: var(--text-secondary); }
.chat-scope.on { color: var(--accent); }
.chat-input-row {
display: flex;
gap: 8px;
padding: var(--sp-md) var(--sp-xl) var(--sp-lg);
border-top: 1px solid var(--border);
flex-shrink: 0;
}
.chat-input-row textarea {
flex: 1;
resize: none;
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: var(--radius-lg);
color: var(--text-primary);
font-family: var(--font-body);
font-size: 13px;
padding: 10px 12px;
max-height: 120px;
line-height: 1.5;
}
.chat-input-row textarea:focus { outline: none; border-color: var(--accent); }
.chat-send {
align-self: flex-end;
background: var(--accent);
color: #fff;
border: none;
border-radius: var(--radius-lg);
width: 40px; height: 40px;
font-size: 16px;
cursor: pointer;
flex-shrink: 0;
}
.chat-send:hover { background: var(--accent-hover); }
.chat-send:disabled { opacity: 0.5; cursor: not-allowed; }
/* === Spalte 2: Mitte = Tab-Panel (oben) + Konversation (unten) === */
.studio-col-center { min-height: 0; }
/* Tab-Panel: nur sichtbar, wenn mindestens ein Studio-Teil geoeffnet ist */
.center-tabs {
display: none;
flex-direction: column;
min-height: 0;
}
.studio-col-center.has-tabs .center-tabs { display: flex; flex: 1 1 auto; min-height: 120px; }
.center-tabbar {
display: flex;
align-items: flex-end;
gap: 4px;
padding: 6px 8px 0;
overflow-x: auto;
flex-shrink: 0;
background: var(--bg-topbar);
border-bottom: 1px solid var(--border);
box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.35);
position: relative;
z-index: 1;
}
.center-tab {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 7px 8px 7px 12px;
border: 1px solid var(--border);
border-top: 2px solid transparent;
border-bottom: none;
border-radius: var(--radius) var(--radius) 0 0;
background: var(--bg-secondary);
color: var(--text-secondary);
font-family: var(--font-title);
font-size: 12px;
font-weight: 600;
white-space: nowrap;
cursor: pointer;
max-width: 210px;
margin-bottom: 0;
transition: background 0.15s, color 0.15s;
}
.center-tab:hover { background: var(--bg-hover); color: var(--text-primary); }
.center-tab .ct-icon { display: inline-flex; align-items: center; color: var(--accent); flex-shrink: 0; }
.center-tab .ct-icon svg { width: 14px; height: 14px; }
.center-tab .ct-title { overflow: hidden; text-overflow: ellipsis; }
.center-tab.active {
color: var(--text-primary);
background: var(--bg-primary);
border-color: var(--border);
border-top: 2px solid var(--accent);
margin-bottom: -1px; /* verbindet den aktiven Tab mit dem Inhalt darunter */
}
/* Drag&Drop-Umsortierung */
.center-tab.dragging-tab { opacity: 0.45; }
.center-tab.drop-before { box-shadow: inset 2px 0 0 var(--accent); }
.center-tab.drop-after { box-shadow: inset -2px 0 0 var(--accent); }
.center-tab-close {
display: inline-flex;
align-items: center;
justify-content: center;
width: 17px;
height: 17px;
border-radius: 4px;
color: var(--text-disabled);
flex-shrink: 0;
}
.center-tab-close:hover { background: var(--bg-hover); color: var(--text-primary); }
.center-tab-content {
flex: 1;
min-height: 0;
display: flex;
background: var(--bg-primary);
}
.tab-panel {
display: none;
flex: 1;
min-height: 0;
overflow-y: auto;
padding: var(--sp-xl);
font-size: 13px;
line-height: 1.7;
}
.tab-panel.active { display: block; }
.tab-panel[data-art="map"] { padding: 0; }
/* Grosszuegigere Abstaende, damit Bericht/Zusammenfassung nicht gequetscht wirken */
.tab-panel h3,
.tab-panel .briefing-heading { margin: 18px 0 8px; font-size: 14px; }
.tab-panel > *:first-child,
.tab-panel .briefing-content > *:first-child { margin-top: 0; }
.tab-panel ul { margin: 10px 0 14px 20px; }
.tab-panel li { margin-bottom: 7px; }
.tab-panel p { margin: 10px 0; }
/* Verschiebbare Trennung zwischen Tab-Panel und Konversation */
.center-divider {
display: none;
flex: 0 0 12px;
height: 12px;
align-items: center;
justify-content: center;
cursor: row-resize;
background: var(--bg-secondary);
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
touch-action: none;
flex-shrink: 0;
}
.studio-col-center.has-tabs .center-divider { display: flex; }
.center-divider::before {
content: "";
width: 44px;
height: 3px;
border-radius: 3px;
background: var(--text-disabled);
opacity: 0.55;
transition: background 0.15s, opacity 0.15s;
}
.center-divider:hover::before,
.center-divider.dragging::before { background: var(--accent); opacity: 1; }
/* Konversation unten (immer sichtbar) */
.chat-region {
display: flex;
flex-direction: column;
min-height: 0;
flex: 1 1 auto;
}
.studio-col-center.has-tabs .chat-region { flex: 0 0 var(--chat-h, 42%); min-height: 150px; }
/* === Spalte 3: Studio-Menue (oeffnet Tabs in der Mitte) === */
.studio-menu { padding: var(--sp-md); }
.studio-menu-item {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 10px 12px;
margin-bottom: 8px;
cursor: pointer;
text-align: left;
color: var(--text-primary);
font-family: var(--font-body);
transition: background 0.15s, border-color 0.15s;
}
.studio-menu-item:hover { background: var(--bg-hover); border-color: var(--accent); }
.studio-menu-item.open { border-color: var(--tint-accent); }
.studio-menu-item.active { border-color: var(--accent); background: var(--tint-accent-faint); }
.studio-menu-item .mi-icon {
flex-shrink: 0;
width: 20px;
height: 20px;
display: inline-flex;
align-items: center;
justify-content: center;
color: var(--accent);
}
.studio-menu-item .mi-title {
flex: 1;
min-width: 0;
font-family: var(--font-title);
font-weight: 600;
font-size: 13px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.studio-menu-item .mi-meta { font-size: 11px; color: var(--text-disabled); flex-shrink: 0; }
/* === Spalte 3: Artefakt-Karten (Ergebnis UND Erzeuger in einem Element) ===
Klick auf den Kopf oeffnet das Ergebnis in der Mitte, das Symbol rechts rechnet
es neu, die Zeile darunter meldet den Datenstand (aktuell / veraltet / laeuft). */
@keyframes st-spin { to { transform: rotate(360deg); } }
/* Kompletter Lauf: orchestriert alles, daher als Primaerknopf ueber den Karten */
.run-all {
display: flex; align-items: center; justify-content: center; gap: 8px;
width: 100%;
padding: 9px 12px;
margin-bottom: 12px;
border-radius: var(--radius-md, 6px);
border: 1px solid var(--accent);
background: var(--accent);
color: #fff;
font-family: var(--font-title);
font-weight: 600;
font-size: 12.5px;
cursor: pointer;
transition: background .15s, opacity .15s;
}
.run-all:hover:not(:disabled) { background: var(--accent-hover); }
.run-all:disabled { opacity: .45; cursor: not-allowed; }
/* display:flex wuerde das hidden-Attribut ueberstimmen - explizit ausblenden */
.run-all[hidden] { display: none; }
.run-all .ra-icon { display: inline-flex; }
.run-all .ra-state { display: none; }
.run-all.running .ra-icon { display: none; }
.run-all.running .ra-state {
display: inline-flex; align-items: center; gap: 6px; font-weight: 400; font-size: 11.5px;
}
.run-all.running .ra-state::before {
content: ''; width: 11px; height: 11px; flex-shrink: 0;
border: 2px solid currentColor; border-right-color: transparent;
border-radius: 50%; animation: st-spin .8s linear infinite;
}
/* Die Karte selbst */
.art-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 10px;
margin-bottom: 8px;
overflow: hidden;
transition: border-color .15s;
}
.art-card:hover { border-color: var(--accent); }
.art-card:has(.studio-menu-item.active) { border-color: var(--accent); }
.art-card.busy { border-color: var(--accent); }
.art-card-soon { opacity: .6; }
.art-row { display: flex; align-items: stretch; }
/* Kartenkopf: uebernimmt die Rolle des alten Menue-Eintrags, aber ohne eigenen Rahmen */
.studio-menu .art-head {
flex: 1; min-width: 0;
display: flex; align-items: center; gap: 10px;
padding: 10px var(--sp-lg);
margin: 0;
background: none;
border: none;
border-radius: 0;
text-align: left;
cursor: pointer;
color: var(--text-primary);
font-family: var(--font-body);
}
.studio-menu .art-head:hover { background: var(--bg-hover); }
.studio-menu .art-head.active { background: var(--tint-accent-faint); }
.studio-menu .art-head-static { cursor: default; }
.studio-menu .art-head-static:hover { background: none; }
.art-head .mi-icon { flex-shrink: 0; width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; color: var(--accent); }
.art-head .mi-text { flex: 1; min-width: 0; }
.art-head .mi-title {
display: block;
font-family: var(--font-title);
font-weight: 600;
font-size: 13px;
line-height: 1.25;
white-space: normal;
overflow: visible;
text-overflow: clip;
}
.art-head .mi-meta { display: block; margin-top: 1px; font-size: 10.5px; color: var(--text-disabled); }
/* Erzeuger-Aktion (rechnet das Ergebnis neu) */
.art-run {
flex-shrink: 0;
width: 36px;
display: flex; align-items: center; justify-content: center;
background: none;
border: none;
border-left: 1px solid var(--border);
color: var(--text-disabled);
cursor: pointer;
transition: color .15s, background .15s;
}
.art-run:hover:not(:disabled) { color: var(--accent); background: var(--bg-hover); }
.art-run:disabled { opacity: .35; cursor: not-allowed; }
/* Datenstand-Zeile */
.art-note {
display: none;
align-items: center;
gap: var(--sp-md);
padding: 7px var(--sp-lg);
border-top: 1px solid var(--border);
font-size: 11px;
line-height: 1.35;
}
.art-note.show { display: flex; }
.art-note.fresh { background: var(--tint-success); color: var(--success); }
.art-note.stale { background: var(--tint-warning); color: var(--warning); }
.art-note.blocked { background: var(--bg-elevated); color: var(--text-disabled); }
.art-note.running { background: var(--tint-accent); color: var(--accent); }
.art-note .an-spin {
width: 11px; height: 11px; flex-shrink: 0;
border: 2px solid currentColor; border-right-color: transparent;
border-radius: 50%; animation: st-spin .8s linear infinite;
}
.art-note button {
margin-left: auto;
white-space: nowrap;
padding: 3px 9px;
font-size: 10.5px;
font-weight: 600;
border-radius: var(--radius-md, 6px);
border: 1px solid currentColor;
background: transparent;
color: inherit;
cursor: pointer;
font-family: var(--font-body);
}
.art-note button:hover { background: var(--tint-hover-subtle); }
/* Unter-Ansichten: gehoeren zum selben Erzeuger (Analyse) */
.art-subs { border-top: 1px solid var(--border); }
.studio-menu .art-sub {
display: flex; align-items: center; gap: 8px;
width: 100%;
padding: 6px var(--sp-lg);
margin: 0;
background: none;
border: none;
border-radius: 0;
cursor: pointer;
text-align: left;
color: var(--text-secondary);
font-family: var(--font-body);
font-size: 11.5px;
}
.studio-menu .art-sub:hover { background: var(--bg-hover); color: var(--text-primary); }
.studio-menu .art-sub.active { background: var(--tint-accent-faint); color: var(--accent); }
.art-sub .mi-icon { flex-shrink: 0; color: var(--text-disabled); display: inline-flex; }
.art-sub.active .mi-icon { color: var(--accent); }
.art-sub .mi-title {
flex: 1; min-width: 0;
font-family: var(--font-body);
font-weight: 500;
font-size: 11.5px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.art-sub .mi-meta { flex-shrink: 0; font-size: 10px; color: var(--text-disabled); }
/* Export: Ausgabe-Aktion, kein Artefakt -> Fusszeile */
.art-foot { margin-top: var(--sp-lg); padding-top: var(--sp-lg); border-top: 1px solid var(--border); }
.studio-menu .art-export { justify-content: center; gap: 8px; margin-bottom: 0; padding: 8px; font-size: 12px; }
.art-export .mi-title { font-family: var(--font-body); font-weight: 600; font-size: 12px; flex: 0 0 auto; }
.art-export .mi-icon { color: var(--accent); display: inline-flex; }
/* "Sammeln" in der Quellenspalte (sein Ergebnis landet dort) */
.collect-btn:disabled { opacity: .45; cursor: not-allowed; }
.collect-btn.running .cb-label { display: none; }
.collect-btn.running::after {
content: 'Sammelt …';
display: inline-flex; align-items: center;
}
/* Karten-Container fuellt den Karte-Tab */
#map-container {
width: 100%;
height: 100%;
min-height: 320px;
overflow: hidden;
}
#map-empty {
display: none;
align-items: center;
justify-content: center;
height: 120px;
color: var(--text-disabled);
font-size: 13px;
}
/* Timeline (schlank) */
.tl-item {
padding: 6px 0;
border-bottom: 1px solid var(--tint-hover-subtle);
font-size: 12px;
}
.tl-item:last-child { border-bottom: none; }
.tl-time { color: var(--text-disabled); font-size: 11px; margin-right: 8px; font-family: var(--font-mono); }
.tl-item a { color: var(--text-secondary); text-decoration: none; }
.tl-item a:hover { color: var(--accent); }
/* Aktivitaets-/Ereignis-Timeline (in Untersektionen gegliedert) */
.ev-section { border-bottom: 1px solid var(--border); }
.ev-section:last-child { border-bottom: none; }
.ev-section-head {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 2px;
cursor: pointer;
user-select: none;
list-style: none;
}
.ev-section-head::-webkit-details-marker { display: none; }
.ev-section-head:hover .ev-section-title { color: var(--accent); }
.ev-section-icon { display: inline-flex; align-items: center; color: var(--accent); flex-shrink: 0; }
.ev-section-icon svg { width: 16px; height: 16px; }
.ev-section-title {
flex: 1;
font-family: var(--font-title);
font-weight: 600;
font-size: 13px;
color: var(--text-primary);
}
.ev-section-count {
font-size: 11px;
color: var(--text-disabled);
background: var(--bg-elevated);
border-radius: 10px;
padding: 1px 8px;
flex-shrink: 0;
}
.ev-section-head::after {
content: "\25B8";
display: inline-block;
color: var(--text-secondary);
font-size: 10px;
transition: transform 0.15s;
}
.ev-section[open] .ev-section-head::after { transform: rotate(90deg); }
.ev-section-body { padding: 2px 0 10px 6px; }
/* Sektions-Akzente (Icon-Farbe je Typ) */
.sec-refresh .ev-section-icon { color: var(--info); }
.sec-source_change .ev-section-icon { color: var(--success); }
.sec-article_ingest .ev-section-icon { color: var(--text-secondary); }
/* Einzel-Ereignis (kompakt: Zeit links, Inhalt rechts) */
.ev-item {
display: flex;
gap: 10px;
padding: 7px 0;
border-bottom: 1px solid var(--tint-hover-subtle);
}
.ev-item:last-child { border-bottom: none; }
.ev-time {
font-size: 11px;
color: var(--text-disabled);
font-family: var(--font-mono);
flex-shrink: 0;
min-width: 78px;
padding-top: 1px;
}
.ev-main { flex: 1; min-width: 0; }
.ev-title { font-size: 12px; line-height: 1.5; color: var(--text-primary); word-break: break-word; }
.ev-title a { color: var(--text-secondary); text-decoration: none; }
.ev-title a:hover { color: var(--accent); text-decoration: underline; }
.ev-src { font-size: 11px; color: var(--text-disabled); margin-top: 2px; }
/* Q&A: ausklappbare Antwort */
.ev-answer { margin-top: 6px; }
.ev-answer summary {
cursor: pointer;
font-size: 12px;
color: var(--accent);
list-style: none;
user-select: none;
}
.ev-answer summary::-webkit-details-marker { display: none; }
.ev-answer summary::before { content: "\25B8 "; }
.ev-answer[open] summary::before { content: "\25BE "; }
.ev-answer-body {
margin-top: 6px;
padding: 8px 10px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
font-size: 12px;
line-height: 1.6;
color: var(--text-secondary);
}
/* Faktencheck im Tab */
.tab-panel .factcheck-item { padding: 8px 0; border-bottom: 1px solid var(--tint-hover-subtle); }
.tab-panel .factcheck-item:last-child { border-bottom: none; }
/* Export-Karte */
.export-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.export-row select {
background: var(--input-bg); color: var(--text-primary);
border: 1px solid var(--input-border); border-radius: var(--radius);
padding: 6px 10px; font-size: 12px;
}
/* Empty / Leerzustaende */
/* Ohne offenen Fall: Mitte + rechte Spalte bleiben SICHTBAR, nur ausgegraut und
nicht bedienbar. Der Hinweis liegt als Auflage darueber (Spalte 1 bleibt aktiv). */
.studio-cols.idle .studio-col-center,
.studio-cols.idle .studio-col-artifacts {
opacity: .32;
filter: grayscale(.55);
pointer-events: none;
user-select: none;
}
.studio-empty {
position: absolute;
top: 0;
bottom: 0;
left: 301px; /* rechts neben der Fall-Liste (300px + 1px Fuge) */
right: 321px; /* und links neben der Bausteine-Spalte (320px + 1px Fuge),
sonst sitzt der Hinweis sichtbar zu weit rechts */
z-index: 5;
display: flex;
align-items: center;
justify-content: center;
padding: var(--sp-xl);
pointer-events: none; /* nur Hinweis, faengt keine Klicks ab */
}
.se-box {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
padding: 22px 28px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 10px;
box-shadow: 0 12px 34px rgba(0, 0, 0, .28);
color: var(--text-secondary);
font-size: 14px;
text-align: center;
max-width: 340px;
}
.se-box svg { color: var(--accent); }
.tab-panel .empty-hint { color: var(--text-disabled); font-size: 12px; }
/* === Responsiv === */
@media (max-width: 1100px) {
.studio-cols { grid-template-columns: 1fr; grid-auto-rows: minmax(0, 1fr); }
.studio-col { max-height: 60vh; }
/* Gestapelte Spalten: der Hinweis nimmt die volle Breite */
.studio-empty { left: 0; right: 0; }
}
/* Fall-Chat: Recherche-Angebot des Analysten (Phase 3) */
.chat-offer{margin-top:10px;padding:12px 14px;border:1px solid var(--studio-border,#8aa0c022);border-radius:10px;background:var(--studio-panel-2,rgba(120,140,180,.08));font-size:13px;}
.chat-offer-title{font-weight:600;margin-bottom:4px;}
.chat-offer-text{opacity:.85;margin-bottom:8px;line-height:1.45;}
.chat-offer-label{display:block;font-size:12px;opacity:.7;margin-bottom:4px;}
.chat-offer-add{width:100%;box-sizing:border-box;resize:vertical;font:inherit;padding:6px 8px;border:1px solid var(--studio-border,#8aa0c033);border-radius:8px;background:rgba(127,127,127,.06);color:inherit;margin-bottom:6px;}
.chat-offer-focus{font-size:12px;opacity:.7;margin-bottom:8px;}
.chat-offer-btn{cursor:pointer;}
.chat-offer-btn:disabled{opacity:.6;cursor:default;}