From d9784bdbd43d6fd325a95df668532c0c3aae80a0 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 13 May 2026 07:18:04 -0400 Subject: [PATCH] Update heatmap with legend and extra color level --- assets/js/build_heatmap.js | 45 ++++++++++++++++++++++++++++--- layouts/partials/git-heatmap.html | 41 +++++++++++++++++++++++----- 2 files changed, 75 insertions(+), 11 deletions(-) diff --git a/assets/js/build_heatmap.js b/assets/js/build_heatmap.js index d2bcab5..be78bdb 100644 --- a/assets/js/build_heatmap.js +++ b/assets/js/build_heatmap.js @@ -30,9 +30,10 @@ export function constructWeeks() { function getColor(count) { if (count === 0) return "var(--color-empty)"; - if (count <= 3) return "var(--color-low)"; - if (count <= 10) return "var(--color-mid)"; - return "var(--color-high)"; + if (count <= 2) return "var(--color-l1)"; + if (count <= 5) return "var(--color-l2)"; + if (count <= 10) return "var(--color-l3)"; + return "var(--color-l4)"; } export function render(weeks, counts) { @@ -85,6 +86,42 @@ export function render(weeks, counts) { return svg; } +export function totalCount(counts) { + return Object.values(counts).reduce((s, v) => s + v, 0); +} + +export function renderLegend() { + const CELL = 11; + const GAP = 3; + const SHIFT = CELL + GAP; + const svgNS = "http://www.w3.org/2000/svg"; + const svg = document.createElementNS(svgNS, "svg"); + svg.setAttribute("width", 5 * SHIFT - GAP); + svg.setAttribute("height", CELL); + svg.style.display = "inline-block"; + svg.style.verticalAlign = "middle"; + + const colors = [ + "var(--color-empty)", + "var(--color-l1)", + "var(--color-l2)", + "var(--color-l3)", + "var(--color-l4)", + ]; + colors.forEach((color, i) => { + const rect = document.createElementNS(svgNS, "rect"); + rect.setAttribute("x", i * SHIFT); + rect.setAttribute("y", 0); + rect.setAttribute("width", CELL); + rect.setAttribute("height", CELL); + rect.setAttribute("fill", color); + rect.setAttribute("rx", 2); + svg.appendChild(rect); + }); + + return svg; +} + export function setupTooltips(svg) { const tooltip = document.getElementById("tooltip"); document.body.appendChild(tooltip); @@ -94,7 +131,7 @@ export function setupTooltips(svg) { const date = e.target.dataset.date; const count = e.target.dataset.count; - tooltip.textContent = `${date} - ${count} commit${count == 1 ? "" : "s"}`; + tooltip.textContent = `${date} - ${count} contribution${count == 1 ? "" : "s"}`; tooltip.classList.remove("hidden"); }); diff --git a/layouts/partials/git-heatmap.html b/layouts/partials/git-heatmap.html index ce619a1..25c9e79 100644 --- a/layouts/partials/git-heatmap.html +++ b/layouts/partials/git-heatmap.html @@ -4,18 +4,31 @@