From 3c57896aa0de0c96a7bc71943e7cd8ec68849edb Mon Sep 17 00:00:00 2001 From: ImBenji Date: Fri, 24 Apr 2026 00:48:49 +0100 Subject: [PATCH] refactor admin navigation; update links to ingest pages and improve loading of data in parallel --- public/admin/assets/css/intel.css | 71 ++++++++++++++++++++++--- public/admin/assets/js/intel-signals.js | 30 ++++++++--- 2 files changed, 85 insertions(+), 16 deletions(-) diff --git a/public/admin/assets/css/intel.css b/public/admin/assets/css/intel.css index 670fedd..f8b4c1a 100644 --- a/public/admin/assets/css/intel.css +++ b/public/admin/assets/css/intel.css @@ -454,14 +454,14 @@ body.page-graph #graph-info { /* ── signal cards ── */ -/* compact tiles — just company + ticker + signal badge. everything else - (summary, drivers, risks, tags, timestamp, references) lives in the - detail dialog opened via openSignalModal(). */ +/* compact glance tile — header row (co + ticker + badge), a short summary + preview, and the conf/risk/timeframe tag row. drivers, risks, full + summary, refs and timestamp stay in the detail dialog. */ .signal-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); - gap: 10px; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 12px; } .signal-card { @@ -470,9 +470,8 @@ body.page-graph #graph-info { border-radius: var(--radius); padding: 12px 14px; display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; + flex-direction: column; + gap: 10px; cursor: pointer; transition: border-color .15s, background .15s; } @@ -482,6 +481,13 @@ body.page-graph #graph-info { background: #13203a; } +.signal-card-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + .signal-card-main { min-width: 0; /* so the text children can truncate if ever needed */ display: flex; @@ -505,6 +511,28 @@ body.page-graph #graph-info { letter-spacing: .04em; } +.signal-card-summary { + margin: 0; + font-size: 12px; + line-height: 1.45; + color: var(--muted); + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.signal-card-tags { + display: flex; + flex-wrap: wrap; + gap: 5px; +} + +.signal-card-tags .signal-tag { + font-size: 10.5px; + padding: 2px 6px; +} + .signal-badge { display: inline-flex; align-items: center; @@ -608,6 +636,33 @@ body.page-graph #graph-info { padding: 20px 24px; overflow-y: auto; min-height: 0; + + /* firefox */ + scrollbar-width: thin; + scrollbar-color: var(--border) transparent; +} + +/* webkit — chrome, safari, edge */ +.signal-modal-col::-webkit-scrollbar { + width: 8px; +} + +.signal-modal-col::-webkit-scrollbar-track { + background: transparent; +} + +.signal-modal-col::-webkit-scrollbar-thumb { + background: var(--border); + border-radius: 4px; + /* inset padding so the thumb doesnt hug the dialog edge */ + border: 2px solid transparent; + background-clip: padding-box; +} + +.signal-modal-col::-webkit-scrollbar-thumb:hover { + background: var(--muted-dark); + background-clip: padding-box; + border: 2px solid transparent; } .signal-modal-col-main { diff --git a/public/admin/assets/js/intel-signals.js b/public/admin/assets/js/intel-signals.js index 7e4062f..c71eee2 100644 --- a/public/admin/assets/js/intel-signals.js +++ b/public/admin/assets/js/intel-signals.js @@ -29,17 +29,31 @@ async function loadSignals() { empty.style.display = "none"; - // compact tile — everything else (summary, drivers, risks, refs, ts) - // lives in the dialog. this stays a pure at-a-glance signal. - grid.innerHTML = data.map(s => ` + // glance tile — header, a short summary preview, and the three meta tags + // (conf/risk/timeframe). drivers, risks, refs etc live in the dialog. + grid.innerHTML = data.map(s => { + const summary = (s.summary || "").trim(); + + return `
-
-
${escapeHtml(s.company_name)}
-
${escapeHtml(s.ticker)}
+
+
+
${escapeHtml(s.company_name)}
+
${escapeHtml(s.ticker)}
+
+ ${s.signal} +
+ + ${summary ? `

${escapeHtml(summary)}

` : ""} + +
+ conf: ${escapeHtml(s.confidence)} + risk: ${escapeHtml(s.risk_level)} + ${escapeHtml(s.timeframe)}
- ${s.signal}
- `).join(""); + `; + }).join(""); }