From b14fe31f425b7cd0c172d8427826bbcb20806968 Mon Sep 17 00:00:00 2001 From: UserIsMH Date: Fri, 1 May 2026 15:51:41 +0200 Subject: [PATCH] Ereignis-Timeline: Newsfeed mit Lagebericht-Sektionen + Heatmap-Strip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Komplett neu gedacht: nicht mehr horizontale Karten-Kette, sondern vertikaler Newsfeed mit den vorhandenen vt-Klassen, plus dezenter Heatmap-Strip oben für die Quantitäts-Übersicht. - Heatmap-Strip oben (14 px hoch): ein Quadrat pro Tag/Stunde/Woche/ Monat je nach Spannweite, Farbintensität = Aktivität, goldener Boden-Strich bei Lagebericht. - Klick auf Heatmap-Quadrat: Stream scrollt zur passenden Zeit-Gruppe, diese flasht kurz auf. - Newsfeed darunter: vt-time-group mit Datums-Trennzeilen (Heute/Gestern/...), Lagebericht-Einträge sind durch ihre vt-snapshot Klasse prominent gegenüber Meldungs-Einträgen. - Klick auf Lagebericht: Volltext klappt inline auf (vorhandener lazyLoadSnapshotDetail-Mechanismus, kein separates Detail-Panel mehr). - Klick auf Meldung: Detail klappt inline auf. Karten-Kette, Verbindungs-Stränge, "Aktuell"-Marker, Snapshot-Detail- Panel, Window-Detail-Panel und alle zugehörigen CSS-Klassen (ht-card/ht-link/ht-now/ht-chain/ht-detail) komplett entfernt. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/static/css/style.css | 249 +++--------------------------- src/static/dashboard.html | 4 +- src/static/js/app.js | 313 ++++++++++---------------------------- 3 files changed, 97 insertions(+), 469 deletions(-) diff --git a/src/static/css/style.css b/src/static/css/style.css index ee8167b..d8c12d4 100644 --- a/src/static/css/style.css +++ b/src/static/css/style.css @@ -2450,39 +2450,33 @@ a.dev-source-pill:hover { padding: 12px 20px 8px; } -/* === Snapshot-zentrierte Timeline === */ +/* === Timeline: Heatmap-Strip oben + vertikaler Newsfeed-Stream darunter === */ .ht-tl { display: flex; flex-direction: column; - gap: var(--sp-xl); + gap: var(--sp-md); } -.ht-tl-hint { - font-size: 12px; - color: var(--text-tertiary); - font-style: italic; - padding: 4px 0; -} - -/* Quanti-Strip (Heatmap-Zeile) */ +/* Heatmap-Strip */ .ht-strip { display: flex; flex-direction: column; gap: 4px; + padding: 4px 0 6px; } .ht-strip-cells { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(8px, 1fr); gap: 2px; - height: 18px; + height: 14px; } .ht-strip-cell { background: color-mix(in srgb, var(--accent) calc(var(--intensity) * 70%), var(--border)); border-radius: 2px; cursor: pointer; transition: transform 0.15s ease, box-shadow 0.15s ease; - min-height: 16px; + min-height: 12px; } .ht-strip-cell.empty { background: var(--border); @@ -2490,11 +2484,11 @@ a.dev-source-pill:hover { cursor: default; } .ht-strip-cell:hover:not(.empty) { - transform: scaleY(1.4); + transform: scaleY(1.6); box-shadow: var(--glow-accent); } .ht-strip-cell.has-snapshot { - box-shadow: inset 0 -2px 0 var(--accent); + box-shadow: inset 0 -3px 0 var(--accent); } .ht-strip-labels { display: grid; @@ -2508,156 +2502,9 @@ a.dev-source-pill:hover { white-space: nowrap; } -/* Lagebericht-Kette */ -.ht-chain-scroll { - overflow-x: auto; - overflow-y: visible; - padding: 4px 0 8px; -} -.ht-chain { - display: flex; - align-items: stretch; - gap: 0; - min-width: max-content; -} - -/* Lagebericht-Karte */ -.ht-card { - flex: 0 0 220px; - padding: 12px; - border: 1px solid var(--border); - border-radius: var(--radius-lg); - background: var(--bg-elevated); - cursor: pointer; - display: flex; - flex-direction: column; - gap: 4px; - transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease; - outline: none; - position: relative; -} -.ht-card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 3px; - background: var(--accent); - border-radius: var(--radius-lg) var(--radius-lg) 0 0; -} -.ht-card:hover { - border-color: var(--accent); - transform: translateY(-1px); - box-shadow: var(--shadow-sm); -} -.ht-card:focus-visible { box-shadow: 0 0 0 3px var(--tint-accent-strong); } -.ht-card.active { - border-color: var(--accent); - box-shadow: var(--glow-accent-strong); -} -.ht-card-icon { - color: var(--accent); - margin-bottom: 2px; -} -.ht-card-date { - font-size: 11px; - font-family: var(--font-mono); - font-weight: 600; - color: var(--accent); -} -.ht-card-preview { - font-size: 13px; - color: var(--text-primary); - line-height: 1.4; - overflow: hidden; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - flex: 1; -} -.ht-card-meta { - font-size: 10px; - color: var(--text-tertiary); - font-family: var(--font-mono); - margin-top: 4px; -} - -/* Verbindungs-Strang zwischen Karten */ -.ht-link { - flex: 0 1 auto; - min-width: 80px; - display: flex; - align-items: center; - justify-content: center; - gap: 6px; - padding: 0 8px; - cursor: pointer; - outline: none; - color: var(--text-secondary); - transition: color 0.15s ease; -} -.ht-link:hover { color: var(--accent); } -.ht-link:focus-visible { color: var(--accent); } -.ht-link-line { - flex: 1; - height: 2px; - background: var(--border); - border-radius: 1px; - min-width: 12px; - transition: background 0.15s ease; -} -.ht-link:hover .ht-link-line { background: var(--accent); } -.ht-link-count { - font-size: 11px; - font-family: var(--font-mono); - font-weight: 600; - white-space: nowrap; - background: var(--bg-card); - padding: 2px 8px; - border-radius: 10px; - border: 1px solid var(--border); - transition: border-color 0.15s ease; -} -.ht-link:hover .ht-link-count { border-color: var(--accent); color: var(--accent); } -.ht-link--quiet .ht-link-line { background: var(--border); opacity: 0.5; } - -/* "Aktuell"-Marker am Ende */ -.ht-now { - flex: 0 0 auto; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 6px; - padding: 0 12px; - min-width: 80px; -} -.ht-now-pulse { - width: 12px; - height: 12px; - border-radius: 50%; - background: var(--accent); - box-shadow: 0 0 0 0 var(--accent); - animation: ht-pulse 2s ease-out infinite; -} -@keyframes ht-pulse { - 0% { box-shadow: 0 0 0 0 rgba(150, 121, 26, 0.4); } - 70% { box-shadow: 0 0 0 12px rgba(150, 121, 26, 0); } - 100% { box-shadow: 0 0 0 0 rgba(150, 121, 26, 0); } -} -.ht-now-label { - font-size: 10px; - font-family: var(--font-mono); - font-weight: 700; - color: var(--accent); - text-transform: uppercase; - letter-spacing: 0.5px; -} - -/* Stream / Empty */ +/* Stream-Container */ .ht-stream { - margin-top: 8px; + margin-top: var(--sp-md); } .ht-empty { padding: 20px; @@ -2666,79 +2513,17 @@ a.dev-source-pill:hover { color: var(--text-tertiary); } -/* Detail-Panel (Zeitfenster oder Snapshot) */ -.ht-detail { - margin-top: 4px; - border: 1px solid var(--border); - border-radius: var(--radius); - background: var(--bg-secondary); - animation: ht-slide-down 0.2s ease; +/* Time-Group Flash beim Scrollen vom Strip */ +.vt-time-group--flash { + animation: vt-group-flash 1.2s ease-out; } -@keyframes ht-slide-down { - from { opacity: 0; transform: translateY(-8px); } - to { opacity: 1; transform: translateY(0); } -} -.ht-detail-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 8px 12px; - border-bottom: 1px solid var(--border); -} -.ht-detail-title { - font-size: 12px; - font-weight: 600; - color: var(--accent); - font-family: var(--font-mono); -} -.ht-detail-close { - background: none; - border: none; - color: var(--text-disabled); - font-size: 18px; - cursor: pointer; - padding: 0 4px; - line-height: 1; -} -.ht-detail-close:hover { color: var(--text-primary); } -.ht-detail-body { - max-height: 480px; - overflow-y: auto; - padding: 8px 14px; -} -.ht-detail-body::-webkit-scrollbar { width: 6px; } -.ht-detail-body::-webkit-scrollbar-track { background: var(--bg-primary); border-radius: 3px; } -.ht-detail-body::-webkit-scrollbar-thumb { background: var(--text-disabled); border-radius: 3px; } -.ht-detail-body::-webkit-scrollbar-thumb:hover { background: var(--text-secondary); } - -/* Mobile: Kette vertikal stapeln, Strip bleibt horizontal */ -@media (max-width: 900px) { - .ht-chain { - flex-direction: column; - align-items: stretch; - min-width: auto; - } - .ht-card { flex: 0 0 auto; width: 100%; } - .ht-link { - min-width: auto; - width: 100%; - flex-direction: column; - gap: 4px; - padding: 8px 0; - } - .ht-link-line { - width: 2px; - height: 14px; - flex: 0 0 auto; - } - .ht-now { width: 100%; } +@keyframes vt-group-flash { + 0% { background: var(--tint-accent-strong); } + 100% { background: transparent; } } -/* Reduced Motion */ @media (prefers-reduced-motion: reduce) { - .ht-now-pulse { animation: none; } - .ht-detail { animation: none; } - .ht-card { transition: none; } + .vt-time-group--flash { animation: none; } } /* === Briefing Listen === */ diff --git a/src/static/dashboard.html b/src/static/dashboard.html index 05004db..b00d2a7 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -13,7 +13,7 @@ - +