Skip to content

Commit 03ac2aa

Browse files
committed
fix: shrink left panel to text-4xs, sort categories by count descending
Add text-4xs (8px) token. All sidebar labels, badges, list rows, and section headers use it. Categories now sort highest-count first and reorder dynamically as alerts arrive.
1 parent a882f35 commit 03ac2aa

2 files changed

Lines changed: 24 additions & 22 deletions

File tree

src/components/FeedDirectory.tsx

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ export function FeedDirectory({
9191
}
9292
return categoryOrder
9393
.filter((cat) => cat !== "informational" && (counts[cat] ?? 0) > 0)
94-
.map((cat) => ({ category: cat, count: counts[cat]! }));
94+
.map((cat) => ({ category: cat, count: counts[cat]! }))
95+
.sort((a, b) => b.count - a.count);
9596
}, [regionAlerts]);
9697

9798
const topAuthorities = useMemo(() => {
@@ -170,12 +171,12 @@ export function FeedDirectory({
170171
{/* Header */}
171172
<div className="border-b border-siem-border/80 px-4 py-3">
172173
<div className="flex items-center justify-between">
173-
<div className="flex items-center gap-2 text-3xs uppercase tracking-[0.2em] text-siem-muted">
174-
<Radar size={10} />
174+
<div className="flex items-center gap-1.5 text-4xs uppercase tracking-[0.2em] text-siem-muted">
175+
<Radar size={9} />
175176
{regionFilter === "all" ? "Global Overview" : regionFilter.startsWith("country:") ? regionFilter.slice(8) : regionFilter}
176177
</div>
177178
{severityFilter && (
178-
<span className="rounded border border-siem-accent/40 bg-siem-accent/10 px-1.5 py-0.5 text-3xs uppercase tracking-[0.14em] text-siem-accent">
179+
<span className="rounded border border-siem-accent/40 bg-siem-accent/10 px-1 py-px text-4xs uppercase tracking-[0.14em] text-siem-accent">
179180
{severityFilter}
180181
</span>
181182
)}
@@ -206,29 +207,29 @@ export function FeedDirectory({
206207
: "bg-siem-panel-strong hover:bg-siem-accent/8"
207208
}`}
208209
>
209-
<div className={`text-xs font-bold tabular-nums ${card.tone}`}>{card.value}</div>
210-
<div className="text-3xs uppercase tracking-[0.1em] text-siem-muted">{card.label}</div>
210+
<div className={`text-2xs font-bold tabular-nums ${card.tone}`}>{card.value}</div>
211+
<div className="text-4xs uppercase tracking-[0.1em] text-siem-muted">{card.label}</div>
211212
</button>
212213
))}
213214
<div className="flex flex-col items-center py-1.5 bg-siem-panel-strong">
214-
<div className="text-xs font-bold tabular-nums text-siem-accent">{zoneSummary.countries}</div>
215-
<div className="text-3xs uppercase tracking-[0.1em] text-siem-muted">Ctry</div>
215+
<div className="text-2xs font-bold tabular-nums text-siem-accent">{zoneSummary.countries}</div>
216+
<div className="text-4xs uppercase tracking-[0.1em] text-siem-muted">Ctry</div>
216217
</div>
217218
<div className="flex flex-col items-center py-1.5 bg-siem-panel-strong">
218-
<div className="text-xs font-bold tabular-nums text-emerald-300">{zoneSummary.feeds}</div>
219-
<div className="text-3xs uppercase tracking-[0.1em] text-siem-muted">Feeds</div>
219+
<div className="text-2xs font-bold tabular-nums text-emerald-300">{zoneSummary.feeds}</div>
220+
<div className="text-4xs uppercase tracking-[0.1em] text-siem-muted">Feeds</div>
220221
</div>
221222
</div>
222223

223224
{/* ── Category breakdown ──────────────────────────────────── */}
224225
<div>
225226
<div className="mb-1 flex items-center justify-between">
226-
<span className="text-3xs uppercase tracking-[0.16em] text-siem-muted">Categories</span>
227+
<span className="text-4xs uppercase tracking-[0.16em] text-siem-muted">Categories</span>
227228
{categoryFilter !== "all" && (
228229
<button
229230
type="button"
230231
onClick={() => onSelectCategory("all")}
231-
className="text-3xs uppercase tracking-[0.12em] text-siem-accent hover:text-siem-text transition-colors"
232+
className="text-4xs uppercase tracking-[0.12em] text-siem-accent hover:text-siem-text transition-colors"
232233
>
233234
Clear
234235
</button>
@@ -247,26 +248,26 @@ export function FeedDirectory({
247248
}`}
248249
>
249250
<span
250-
className={`inline-flex items-center px-1 py-px text-3xs font-semibold uppercase tracking-wider rounded border leading-tight ${categoryBadge[category]}`}
251+
className={`inline-flex items-center px-0.5 text-4xs font-semibold uppercase tracking-wider rounded border leading-tight ${categoryBadge[category]}`}
251252
>
252253
{categoryLabels[category]}
253254
</span>
254-
<span className="text-3xs tabular-nums text-siem-muted">{count}</span>
255+
<span className="text-4xs tabular-nums text-siem-muted">{count}</span>
255256
</button>
256257
))}
257258
</div>
258259
</div>
259260

260261
{/* ── Top authorities ──────────────────────────────────────── */}
261262
<div>
262-
<div className="mb-1 flex items-center gap-1 text-3xs uppercase tracking-[0.16em] text-siem-muted">
263-
<TrendingUp size={8} />
263+
<div className="mb-1 flex items-center gap-1 text-4xs uppercase tracking-[0.16em] text-siem-muted">
264+
<TrendingUp size={7} />
264265
Authorities
265266
{selectedSourceIds.length > 0 && (
266267
<button
267268
type="button"
268269
onClick={() => onSelectSourceIdsChange([])}
269-
className="ml-auto text-3xs uppercase tracking-[0.12em] text-siem-accent hover:text-siem-text transition-colors"
270+
className="ml-auto text-4xs uppercase tracking-[0.12em] text-siem-accent hover:text-siem-text transition-colors"
270271
>
271272
Clear
272273
</button>
@@ -281,7 +282,7 @@ export function FeedDirectory({
281282
key={auth.sourceId}
282283
type="button"
283284
onClick={() => toggleSource(auth.sourceId)}
284-
className={`w-full flex items-center justify-between gap-1.5 rounded px-1.5 py-[3px] text-left text-3xs transition-colors ${
285+
className={`w-full flex items-center justify-between gap-1.5 rounded px-1.5 py-[3px] text-left text-4xs transition-colors ${
285286
selectedSourceIds.includes(auth.sourceId)
286287
? "bg-siem-accent/14 text-siem-text"
287288
: "text-siem-text hover:bg-siem-accent/8"
@@ -299,14 +300,14 @@ export function FeedDirectory({
299300

300301
{/* ── Top countries ───────────────────────────────────────── */}
301302
<div>
302-
<div className="mb-1 text-3xs uppercase tracking-[0.16em] text-siem-muted">Countries</div>
303+
<div className="mb-1 text-4xs uppercase tracking-[0.16em] text-siem-muted">Countries</div>
303304
<div className="space-y-px">
304305
{countryCounts.map((c) => (
305306
<button
306307
key={c.code}
307308
type="button"
308309
onClick={() => onSelectCountry(c.code)}
309-
className={`flex w-full items-center justify-between gap-1.5 rounded px-1.5 py-[3px] text-left text-3xs transition-colors ${
310+
className={`flex w-full items-center justify-between gap-1.5 rounded px-1.5 py-[3px] text-left text-4xs transition-colors ${
310311
regionFilter === `country:${c.code}`
311312
? "bg-siem-accent/14 text-siem-text"
312313
: "text-siem-text hover:bg-siem-accent/8"
@@ -325,10 +326,10 @@ export function FeedDirectory({
325326

326327
{snapshotStatus && (
327328
<div className="border-t border-siem-border/80 px-3 py-2">
328-
<div className={`text-3xs uppercase tracking-[0.16em] ${snapshotStatus.tone}`}>
329+
<div className={`text-4xs uppercase tracking-[0.16em] ${snapshotStatus.tone}`}>
329330
Data snapshot: {snapshotStatus.relative}
330331
</div>
331-
<div className="mt-0.5 text-3xs text-siem-muted">
332+
<div className="mt-0.5 text-4xs text-siem-muted">
332333
Last collector update: {snapshotStatus.exact}
333334
</div>
334335
</div>

src/index.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
@theme {
1111
/* ── Relative type scale (scales with html font-size) ──────────── */
12+
--font-size-4xs: 0.615rem; /* ~8px at 13px root */
1213
--font-size-3xs: 0.692rem; /* ~9px at 13px root */
1314
--font-size-2xs: 0.77rem; /* ~10px at 13px root */
1415
--font-size-xxs: 0.846rem; /* ~11px at 13px root */

0 commit comments

Comments
 (0)