Density patterns as tinted cells: a calendar (weeks × weekdays — publishing, activity, attendance) or a matrix (weekday × hour, department × month). Sequential, diverging and categorical scales; an ARIA grid with full keyboard support and a data-table alternative. Plain DOM — no chart library.
Nov 11, 2025 – Nov 10, 2026. 513 in total; busiest day Monday, December 22, 2025 with 6.
| Date | Posts |
|---|---|
| Nov 16, 2025 | 0 |
| Nov 23, 2025 | 0 |
| Nov 30, 2025 | 0 |
| Dec 7, 2025 | 0 |
| Dec 14, 2025 | 0 |
| Dec 21, 2025 | 0 |
| Dec 28, 2025 | 0 |
| Jan 4, 2026 | 1 |
| Jan 11, 2026 | 0 |
| Jan 18, 2026 | 0 |
| Jan 25, 2026 | 0 |
| Feb 1, 2026 | 0 |
| Feb 8, 2026 | 0 |
| Feb 15, 2026 | 0 |
| Feb 22, 2026 | 0 |
| Mar 1, 2026 | 0 |
| Mar 8, 2026 | 1 |
| Mar 15, 2026 | 0 |
| Mar 22, 2026 | 0 |
| Mar 29, 2026 | 0 |
| Apr 5, 2026 | 0 |
| Apr 12, 2026 | 0 |
| Apr 19, 2026 | 0 |
| Apr 26, 2026 | 0 |
| May 3, 2026 | 0 |
| May 10, 2026 | 1 |
| May 17, 2026 | 0 |
| May 24, 2026 | 0 |
| May 31, 2026 | 0 |
| Jun 7, 2026 | 0 |
| Jun 14, 2026 | 0 |
| Jun 21, 2026 | 0 |
| Jun 28, 2026 | 0 |
| Jul 5, 2026 | 0 |
| Jul 12, 2026 | 1 |
| Jul 19, 2026 | 0 |
| Jul 26, 2026 | 0 |
| Aug 2, 2026 | 0 |
| Aug 9, 2026 | 0 |
| Aug 16, 2026 | 0 |
| Aug 23, 2026 | 0 |
| Aug 30, 2026 | 0 |
| Sep 6, 2026 | 0 |
| Sep 13, 2026 | 1 |
| Sep 20, 2026 | 0 |
| Sep 27, 2026 | 0 |
| Oct 4, 2026 | 0 |
| Oct 11, 2026 | 0 |
| Oct 18, 2026 | 0 |
| Oct 25, 2026 | 0 |
| Nov 1, 2026 | 0 |
| Nov 8, 2026 | 0 |
| Nov 17, 2025 | 4 |
| Nov 24, 2025 | 2 |
| Dec 1, 2025 | 0 |
| Dec 8, 2025 | 4 |
| Dec 15, 2025 | 1 |
| Dec 22, 2025 | 6 |
| Dec 29, 2025 | 3 |
| Jan 5, 2026 | 0 |
| Jan 12, 2026 | 5 |
| Jan 19, 2026 | 2 |
| Jan 26, 2026 | 6 |
| Feb 2, 2026 | 3 |
| Feb 9, 2026 | 0 |
| Feb 16, 2026 | 4 |
| Feb 23, 2026 | 1 |
| Mar 2, 2026 | 4 |
| Mar 9, 2026 | 2 |
| Mar 16, 2026 | 0 |
| Mar 23, 2026 | 2 |
| Mar 30, 2026 | 1 |
| Apr 6, 2026 | 2 |
| Apr 13, 2026 | 1 |
| Apr 20, 2026 | 0 |
| Apr 27, 2026 | 0 |
| May 4, 2026 | 0 |
| May 11, 2026 | 0 |
| May 18, 2026 | 0 |
| May 25, 2026 | 0 |
| Jun 1, 2026 | 0 |
| Jun 8, 2026 | 0 |
| Jun 15, 2026 | 1 |
| Jun 22, 2026 | 1 |
| Jun 29, 2026 | 0 |
| Jul 6, 2026 | 2 |
| Jul 13, 2026 | 1 |
| Jul 20, 2026 | 3 |
| Jul 27, 2026 | 2 |
| Aug 3, 2026 | 0 |
| Aug 10, 2026 | 4 |
| Aug 17, 2026 | 1 |
| Aug 24, 2026 | 6 |
| Aug 31, 2026 | 3 |
| Sep 7, 2026 | 0 |
| Sep 14, 2026 | 5 |
| Sep 21, 2026 | 2 |
| Sep 28, 2026 | 6 |
| Oct 5, 2026 | 3 |
| Oct 12, 2026 | 0 |
| Oct 19, 2026 | 4 |
| Oct 26, 2026 | 1 |
| Nov 2, 2026 | 5 |
| Nov 9, 2026 | 2 |
| Nov 11, 2025 | 0 |
| Nov 18, 2025 | 3 |
| Nov 25, 2025 | 1 |
| Dec 2, 2025 | 5 |
| Dec 9, 2025 | 3 |
| Dec 16, 2025 | 0 |
| Dec 23, 2025 | 4 |
| Dec 30, 2025 | 2 |
| Jan 6, 2026 | 6 |
| Jan 13, 2026 | 3 |
| Jan 20, 2026 | 0 |
| Jan 27, 2026 | 5 |
| Feb 3, 2026 | 1 |
| Feb 10, 2026 | 6 |
| Feb 17, 2026 | 3 |
| Feb 24, 2026 | 0 |
| Mar 3, 2026 | 3 |
| Mar 10, 2026 | 1 |
| Mar 17, 2026 | 3 |
| Mar 24, 2026 | 1 |
| Mar 31, 2026 | 0 |
| Apr 7, 2026 | 1 |
| Apr 14, 2026 | 0 |
| Apr 21, 2026 | 1 |
| Apr 28, 2026 | 0 |
| May 5, 2026 | 0 |
| May 12, 2026 | 0 |
| May 19, 2026 | 0 |
| May 26, 2026 | 0 |
| Jun 2, 2026 | 0 |
| Jun 9, 2026 | 0 |
| Jun 16, 2026 | 1 |
| Jun 23, 2026 | 0 |
| Jun 30, 2026 | 2 |
| Jul 7, 2026 | 1 |
| Jul 14, 2026 | 0 |
| Jul 21, 2026 | 2 |
| Jul 28, 2026 | 1 |
| Aug 4, 2026 | 4 |
| Aug 11, 2026 | 2 |
| Aug 18, 2026 | 0 |
| Aug 25, 2026 | 4 |
| Sep 1, 2026 | 2 |
| Sep 8, 2026 | 6 |
| Sep 15, 2026 | 3 |
| Sep 22, 2026 | 0 |
| Sep 29, 2026 | 5 |
| Oct 6, 2026 | 2 |
| Oct 13, 2026 | 6 |
| Oct 20, 2026 | 3 |
| Oct 27, 2026 | 0 |
| Nov 3, 2026 | 4 |
| Nov 10, 2026 | 1 |
| Nov 12, 2025 | 3 |
| Nov 19, 2025 | 2 |
| Nov 26, 2025 | 0 |
| Dec 3, 2025 | 4 |
| Dec 10, 2025 | 1 |
| Dec 17, 2025 | 6 |
| Dec 24, 2025 | 3 |
| Dec 31, 2025 | 0 |
| Jan 7, 2026 | 5 |
| Jan 14, 2026 | 2 |
| Jan 21, 2026 | 6 |
| Jan 28, 2026 | 3 |
| Feb 4, 2026 | 0 |
| Feb 11, 2026 | 4 |
| Feb 18, 2026 | 1 |
| Feb 25, 2026 | 5 |
| Mar 4, 2026 | 2 |
| Mar 11, 2026 | 0 |
| Mar 18, 2026 | 2 |
| Mar 25, 2026 | 1 |
| Apr 1, 2026 | 2 |
| Apr 8, 2026 | 1 |
| Apr 15, 2026 | 0 |
| Apr 22, 2026 | 1 |
| Apr 29, 2026 | 0 |
| May 6, 2026 | 0 |
| May 13, 2026 | 0 |
| May 20, 2026 | 0 |
| May 27, 2026 | 0 |
| Jun 3, 2026 | 0 |
| Jun 10, 2026 | 0 |
| Jun 17, 2026 | 0 |
| Jun 24, 2026 | 0 |
| Jul 1, 2026 | 1 |
| Jul 8, 2026 | 1 |
| Jul 15, 2026 | 3 |
| Jul 22, 2026 | 2 |
| Jul 29, 2026 | 0 |
| Aug 5, 2026 | 3 |
| Aug 12, 2026 | 1 |
| Aug 19, 2026 | 5 |
| Aug 26, 2026 | 3 |
| Sep 2, 2026 | 0 |
| Sep 9, 2026 | 5 |
| Sep 16, 2026 | 2 |
| Sep 23, 2026 | 6 |
| Sep 30, 2026 | 3 |
| Oct 7, 2026 | 0 |
| Oct 14, 2026 | 4 |
| Oct 21, 2026 | 1 |
| Oct 28, 2026 | 5 |
| Nov 4, 2026 | 2 |
| Nov 13, 2025 | 3 |
| Nov 20, 2025 | 1 |
| Nov 27, 2025 | 4 |
| Dec 4, 2025 | 2 |
| Dec 11, 2025 | 0 |
| Dec 18, 2025 | 4 |
| Dec 25, 2025 | 2 |
| Jan 1, 2026 | 6 |
| Jan 8, 2026 | 3 |
| Jan 15, 2026 | 0 |
| Jan 22, 2026 | 5 |
| Jan 29, 2026 | 2 |
| Feb 5, 2026 | 6 |
| Feb 12, 2026 | 3 |
| Feb 19, 2026 | 0 |
| Feb 26, 2026 | 3 |
| Mar 5, 2026 | 1 |
| Mar 12, 2026 | 4 |
| Mar 19, 2026 | 2 |
| Mar 26, 2026 | 0 |
| Apr 2, 2026 | 1 |
| Apr 9, 2026 | 0 |
| Apr 16, 2026 | 1 |
| Apr 23, 2026 | 0 |
| Apr 30, 2026 | 0 |
| May 7, 2026 | 0 |
| May 14, 2026 | 0 |
| May 21, 2026 | 0 |
| May 28, 2026 | 0 |
| Jun 4, 2026 | 0 |
| Jun 11, 2026 | 0 |
| Jun 18, 2026 | 0 |
| Jun 25, 2026 | 1 |
| Jul 2, 2026 | 1 |
| Jul 9, 2026 | 0 |
| Jul 16, 2026 | 2 |
| Jul 23, 2026 | 1 |
| Jul 30, 2026 | 4 |
| Aug 6, 2026 | 2 |
| Aug 13, 2026 | 0 |
| Aug 20, 2026 | 4 |
| Aug 27, 2026 | 1 |
| Sep 3, 2026 | 6 |
| Sep 10, 2026 | 3 |
| Sep 17, 2026 | 0 |
| Sep 24, 2026 | 5 |
| Oct 1, 2026 | 2 |
| Oct 8, 2026 | 6 |
| Oct 15, 2026 | 3 |
| Oct 22, 2026 | 0 |
| Oct 29, 2026 | 4 |
| Nov 5, 2026 | 1 |
| Nov 14, 2025 | 2 |
| Nov 21, 2025 | 0 |
| Nov 28, 2025 | 3 |
| Dec 5, 2025 | 1 |
| Dec 12, 2025 | 5 |
| Dec 19, 2025 | 3 |
| Dec 26, 2025 | 0 |
| Jan 2, 2026 | 5 |
| Jan 9, 2026 | 2 |
| Jan 16, 2026 | 6 |
| Jan 23, 2026 | 3 |
| Jan 30, 2026 | 0 |
| Feb 6, 2026 | 4 |
| Feb 13, 2026 | 1 |
| Feb 20, 2026 | 5 |
| Feb 27, 2026 | 2 |
| Mar 6, 2026 | 0 |
| Mar 13, 2026 | 3 |
| Mar 20, 2026 | 1 |
| Mar 27, 2026 | 2 |
| Apr 3, 2026 | 1 |
| Apr 10, 2026 | 0 |
| Apr 17, 2026 | 1 |
| Apr 24, 2026 | 0 |
| May 1, 2026 | 0 |
| May 8, 2026 | 0 |
| May 15, 2026 | 0 |
| May 22, 2026 | 0 |
| May 29, 2026 | 0 |
| Jun 5, 2026 | 0 |
| Jun 12, 2026 | 0 |
| Jun 19, 2026 | 0 |
| Jun 26, 2026 | 1 |
| Jul 3, 2026 | 0 |
| Jul 10, 2026 | 2 |
| Jul 17, 2026 | 1 |
| Jul 24, 2026 | 0 |
| Jul 31, 2026 | 3 |
| Aug 7, 2026 | 1 |
| Aug 14, 2026 | 5 |
| Aug 21, 2026 | 3 |
| Aug 28, 2026 | 0 |
| Sep 4, 2026 | 5 |
| Sep 11, 2026 | 2 |
| Sep 18, 2026 | 6 |
| Sep 25, 2026 | 3 |
| Oct 2, 2026 | 0 |
| Oct 9, 2026 | 5 |
| Oct 16, 2026 | 1 |
| Oct 23, 2026 | 5 |
| Oct 30, 2026 | 3 |
| Nov 6, 2026 | 0 |
| Nov 15, 2025 | 0 |
| Nov 22, 2025 | 0 |
| Nov 29, 2025 | 1 |
| Dec 6, 2025 | 0 |
| Dec 13, 2025 | 0 |
| Dec 20, 2025 | 0 |
| Dec 27, 2025 | 0 |
| Jan 3, 2026 | 0 |
| Jan 10, 2026 | 0 |
| Jan 17, 2026 | 0 |
| Jan 24, 2026 | 0 |
| Jan 31, 2026 | 1 |
| Feb 7, 2026 | 0 |
| Feb 14, 2026 | 0 |
| Feb 21, 2026 | 0 |
| Feb 28, 2026 | 0 |
| Mar 7, 2026 | 0 |
| Mar 14, 2026 | 0 |
| Mar 21, 2026 | 0 |
| Mar 28, 2026 | 0 |
| Apr 4, 2026 | 1 |
| Apr 11, 2026 | 0 |
| Apr 18, 2026 | 0 |
| Apr 25, 2026 | 0 |
| May 2, 2026 | 0 |
| May 9, 2026 | 0 |
| May 16, 2026 | 0 |
| May 23, 2026 | 0 |
| May 30, 2026 | 0 |
| Jun 6, 2026 | 1 |
| Jun 13, 2026 | 0 |
| Jun 20, 2026 | 0 |
| Jun 27, 2026 | 0 |
| Jul 4, 2026 | 0 |
| Jul 11, 2026 | 0 |
| Jul 18, 2026 | 0 |
| Jul 25, 2026 | 0 |
| Aug 1, 2026 | 0 |
| Aug 8, 2026 | 1 |
| Aug 15, 2026 | 0 |
| Aug 22, 2026 | 0 |
| Aug 29, 2026 | 0 |
| Sep 5, 2026 | 0 |
| Sep 12, 2026 | 0 |
| Sep 19, 2026 | 0 |
| Sep 26, 2026 | 0 |
| Oct 3, 2026 | 0 |
| Oct 10, 2026 | 1 |
| Oct 17, 2026 | 0 |
| Oct 24, 2026 | 0 |
| Oct 31, 2026 | 0 |
| Nov 7, 2026 | 0 |
Installation
The whole kit as one package — get updates by bumping the version. Add the styles to globals.css: @import "@vamos-ui/react/styles.css";
Usage
import { Heatmap } from "@vamos-ui/react/charts";
<Heatmap mode="calendar" title="Posts published" data={[{ x: "2026-11-10", value: 3 }]} valueLabel="Posts" />Keyboard: arrows move (calendar: up/down = day, left/right = week), Home / End jump within a row, PageUp / PageDown move a month (calendar) or to the column ends (matrix).
Each cell is labelled in full ("Tuesday, November 10, 2026: 3 posts"); the visual tooltip is decorative.
In glass mode the lightest step uses --track so it does not vanish into a translucent card.
Examples
Weekday × hour (CRM)
Best call hours. Seven steps from chart-2.
Highest: Mon, 11:00 with 43. Lowest: Mon, 19:00 with 0.
| Answered calls by weekday and hour | 08:00 | 09:00 | 10:00 | 11:00 | 12:00 | 13:00 | 14:00 | 15:00 | 16:00 | 17:00 | 18:00 | 19:00 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Mon | 12 | 28 | 36 | 43 | 31 | 23 | 32 | 33 | 22 | 12 | 3 | 0 |
| Tue | 13 | 30 | 37 | 34 | 32 | 25 | 26 | 34 | 23 | 13 | 3 | 1 |
| Wed | 13 | 23 | 39 | 36 | 34 | 26 | 27 | 36 | 25 | 10 | 4 | 1 |
| Thu | 14 | 25 | 41 | 38 | 27 | 27 | 29 | 28 | 26 | 11 | 4 | 1 |
| Fri | 15 | 26 | 33 | 40 | 29 | 28 | 30 | 30 | 27 | 12 | 3 | 1 |
| Sat | 3 | 5 | 6 | 8 | 5 | 4 | 6 | 6 | 4 | 2 | 1 | 0 |
| Sun | 2 | 5 | 7 | 6 | 6 | 4 | 6 | 6 | 4 | 2 | 1 | 0 |
Diverging (finance)
scale="diverging": danger ↔ neutral ↔ success around zero, symmetric domain.
Highest: Marketing, Sep with 15%. Lowest: Marketing, Jun with -18%.
| Budget variance by department | Jun | Jul | Aug | Sep | Oct | Nov |
|---|---|---|---|---|---|---|
| Engineering | -4% | 2% | -6% | -8% | 1% | -3% |
| Sales | 12% | 7% | -2% | -5% | -11% | -9% |
| Marketing | -18% | -9% | 4% | 15% | 6% | -1% |
| Support | 3% | 1% | -0% | -2% | 5% | 8% |
| Operations | -7% | -12% | -5% | 2% | -3% | -4% |
Attendance states (HR)
scale="categorical" colours each cell by its category; fixed cellSize scrolls when wider.
Sep 28, 2026 – Nov 8, 2026. 30 in total; busiest day Monday, September 28, 2026 with 1.
| Date | Value |
|---|---|
| Sep 28, 2026 | Office |
| Oct 5, 2026 | Office |
| Oct 12, 2026 | Office |
| Oct 19, 2026 | Annual leave |
| Oct 26, 2026 | Office |
| Nov 2, 2026 | Office |
| Sep 29, 2026 | Office |
| Oct 6, 2026 | Office |
| Oct 13, 2026 | Office |
| Oct 20, 2026 | Office |
| Oct 27, 2026 | Office |
| Nov 3, 2026 | Office |
| Sep 30, 2026 | Remote |
| Oct 7, 2026 | Remote |
| Oct 14, 2026 | Remote |
| Oct 21, 2026 | Remote |
| Oct 28, 2026 | Sick |
| Nov 4, 2026 | Remote |
| Oct 1, 2026 | Office |
| Oct 8, 2026 | Office |
| Oct 15, 2026 | Annual leave |
| Oct 22, 2026 | Office |
| Oct 29, 2026 | Office |
| Nov 5, 2026 | Office |
| Oct 2, 2026 | Remote |
| Oct 9, 2026 | Remote |
| Oct 16, 2026 | Annual leave |
| Oct 23, 2026 | Remote |
| Oct 30, 2026 | Remote |
| Nov 6, 2026 | Remote |
API
Heatmap
| Prop | Type | Default |
|---|---|---|
modeWeeks × weekdays, or rows × columns. | "calendar" | "matrix" | — |
dataCalendar: x is "YYYY-MM-DD". Matrix: x = column, y = row. | { x, y?, value, category?, meta? }[] | — |
titleGrid name and table caption. | string | — |
rangeCalendar range. Default: first to last date in data. | { from, to } | — |
xLabels / yLabelsMatrix order. Default: order of appearance. | string[] | — |
scaleColour scale. | "sequential" | "diverging" | "categorical" | "sequential" |
categoriesCategorical palette. | { value, label, color }[] | — |
stepsColour steps (5 + chart-1 uses --chart-seq-0…4). | 4 | 5 | 7 | 5 |
domainLinear breaks. Default: quantile breaks. | [number, number] | — |
colorSequential base colour. | ChartColor | "chart-1" |
format / valueLabelValue format and the measured thing ("Posts"). | FormatSpec / string | — |
weekStartOverride the locale week start (Sunday en-US, Monday tr-TR). | 0–6 | — |
todayRinged day. Default: today in the provider time zone, after mount. | string | null | — |
cellSizeFill the width, or fixed px with horizontal scroll. | "auto" | number | "auto" |
tooltipCustom tooltip content. | (cell) => ReactNode | — |
onCellClickClick or Enter / Space on a cell. | (cell) => void | — |
tableToggle / state / summary / showLegendAs Chart frame; legend reads Less ↔ More. | — | — |
labelsheatmap namespace: less, more, cell, noData, date, value, summaries. | Partial<HeatmapLabels> | — |