From bb642268c06ca7901f3f63ae088b98adf058cce4 Mon Sep 17 00:00:00 2001 From: leafyzito Date: Mon, 13 Apr 2026 01:39:19 +0000 Subject: [PATCH 1/3] feat(logs): add hourly message activity chart --- src/routes/logs/+page.svelte | 52 +++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/routes/logs/+page.svelte b/src/routes/logs/+page.svelte index 12ddcbe..847ceb2 100644 --- a/src/routes/logs/+page.svelte +++ b/src/routes/logs/+page.svelte @@ -311,6 +311,27 @@ return chatLogs.length.toLocaleString(); }); + const hourlyActivity = $derived.by(() => { + const counts = Array.from({ length: 24 }, () => 0); + for (const msg of chatLogs) { + counts[new Date(msg.timestamp).getHours()]++; + } + const maxCount = Math.max(1, ...counts); + return { counts, maxCount }; + }); + + // the busier the hour, the stronger the purple gets + const hourlyBarFill = (count: number, maxCount: number, resolvedMode: string | undefined) => { + if (count <= 0) return "transparent"; + const strength = Math.min(1, count / maxCount); + if (resolvedMode === "dark") { + const alpha = 0.2 + 0.72 * strength; + return `hsl(270 88% 68% / ${alpha})`; + } + const alpha = 0.14 + 0.8 * strength; + return `hsl(271 78% 46% / ${alpha})`; + }; + $effect(() => { if (!filteredChatLogs) return; untrack(async () => { @@ -882,9 +903,34 @@ - - - + + + +
+

Messages by hour for the selected day

+ +
+ {#if statsError}

{statsError}

{:else} From 57e8b21893b441d3f305746d0fbb3c943a16d253 Mon Sep 17 00:00:00 2001 From: leafyzito Date: Mon, 13 Apr 2026 01:55:45 +0000 Subject: [PATCH 2/3] rephrase --- src/routes/logs/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/logs/+page.svelte b/src/routes/logs/+page.svelte index 847ceb2..0b9bda7 100644 --- a/src/routes/logs/+page.svelte +++ b/src/routes/logs/+page.svelte @@ -907,7 +907,7 @@
-

Messages by hour for the selected day

+

Messages by hour for the selected timeframe