From c21974a3ce14a47578b8b90f43e98adbbdefc69b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asger=20Geel=20Weirs=C3=B8e?= Date: Thu, 11 Jun 2026 21:59:51 +0200 Subject: [PATCH] side: /now m. git-aktivitets-heatmap fra egen Gitea (build-time) Co-Authored-By: Claude Opus 4.8 (1M context) --- src/pages/now.astro | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/pages/now.astro diff --git a/src/pages/now.astro b/src/pages/now.astro new file mode 100644 index 0000000..fd26565 --- /dev/null +++ b/src/pages/now.astro @@ -0,0 +1,82 @@ +--- +import Base from '../layouts/Base.astro'; +import { SITE } from '../consts'; + +// Hvad jeg roder med lige nu — opdateres manuelt, det er hele pointen med en /now-side. +const focus = [ + 'Elektronisk fakturering hos Digisense: Peppol, NemHandel og løsningsarkitektur', + 'HD 1. del i Erhvervsøkonomi på AAU (eksamener til sommer)', + 'Homelab: crawlkit, denne side, og alt for mange LXC-containere', +]; + +// Build-time: aktivitets-heatmap fra min Gitea (offentligt API). Fejler stille — +// siden bygger fint uden graf hvis Gitea er nede under build. +type Beat = { timestamp: number; contributions: number }; +let perDay = new Map(); +try { + const r = await fetch(`${SITE.giteaBase}/api/v1/users/${SITE.giteaUser}/heatmap`); + if (r.ok) for (const b of (await r.json()) as Beat[]) { + const d = new Date(b.timestamp * 1000).toISOString().slice(0, 10); + perDay.set(d, (perDay.get(d) || 0) + b.contributions); + } +} catch { /* ingen graf, ingen drama */ } + +// 26 uger bagud, uger som kolonner (man-søn), niveau 0-4 +const WEEKS = 26; +const today = new Date(); today.setHours(12, 0, 0, 0); +const start = new Date(today); start.setDate(start.getDate() - (WEEKS * 7 - 1) - ((today.getDay() + 6) % 7)); +const weeks: { date: string; n: number }[][] = []; +const cur = new Date(start); +while (cur <= today) { + const week: { date: string; n: number }[] = []; + for (let i = 0; i < 7 && cur <= today; i++) { + const key = cur.toISOString().slice(0, 10); + week.push({ date: key, n: perDay.get(key) || 0 }); + cur.setDate(cur.getDate() + 1); + } + weeks.push(week); +} +const level = (n: number) => (n === 0 ? 0 : n < 3 ? 1 : n < 6 ? 2 : n < 12 ? 3 : 4); +const total = [...perDay.values()].reduce((a, b) => a + b, 0); +const updated = today.toLocaleDateString('da-DK', { year: 'numeric', month: 'long', day: 'numeric' }); +--- + +

Now

+

Senest opdateret {updated} · à la nownownow.com

+ +
+

Lige nu

+
    + {focus.map((f) => ( +
  • {f}
  • + ))} +
+
+ + {weeks.length > 0 && ( +
+

Git-aktivitet

+

{total} bidrag i mit eget Gitea det seneste år — de seneste {WEEKS} uger:

+
+ +
+

Offentlige projekter ligger på gitea.weircon.dk.

+
+ )} + + +