Heatmap chart
Updated
HeatmapChart draws one square per day, a column per week, its ink in 5 steps from empty to the busiest day. Like every DitherCharts chart, it fills its container's width, animates in, moves a cursor with the arrow keys, and keeps a data table for screen readers.
Example
Heatmap
A year of contributions, a square per day
| date | Contributions |
|---|---|
| Nov 2, 2025 | 0 |
| Nov 3, 2025 | 0 |
| Nov 4, 2025 | 8 |
| Nov 5, 2025 | 5 |
| Nov 6, 2025 | 4 |
| Nov 7, 2025 | 8 |
| Nov 8, 2025 | 4 |
| Nov 9, 2025 | 3 |
| Nov 10, 2025 | 5 |
| Nov 11, 2025 | 0 |
| Nov 12, 2025 | 0 |
| Nov 13, 2025 | 12 |
| Nov 14, 2025 | 9 |
| Nov 15, 2025 | 2 |
| Nov 16, 2025 | 3 |
| Nov 17, 2025 | 11 |
| Nov 18, 2025 | 12 |
| Nov 19, 2025 | 9 |
| Nov 20, 2025 | 0 |
| Nov 21, 2025 | 0 |
| Nov 22, 2025 | 4 |
| Nov 23, 2025 | 4 |
| Nov 24, 2025 | 9 |
| Nov 25, 2025 | 8 |
| Nov 26, 2025 | 10 |
| Nov 27, 2025 | 13 |
| Nov 28, 2025 | 13 |
| Nov 29, 2025 | 0 |
| Nov 30, 2025 | 0 |
| Dec 1, 2025 | 11 |
| Dec 2, 2025 | 14 |
| Dec 3, 2025 | 13 |
| Dec 4, 2025 | 9 |
| Dec 5, 2025 | 8 |
| Dec 6, 2025 | 4 |
| Dec 7, 2025 | 5 |
| Dec 8, 2025 | 0 |
| Dec 9, 2025 | 0 |
| Dec 10, 2025 | 8 |
| Dec 11, 2025 | 12 |
| Dec 12, 2025 | 14 |
| Dec 13, 2025 | 4 |
| Dec 14, 2025 | 3 |
| Dec 15, 2025 | 8 |
| Dec 16, 2025 | 12 |
| Dec 17, 2025 | 0 |
| Dec 18, 2025 | 0 |
| Dec 19, 2025 | 7 |
| Dec 20, 2025 | 3 |
| Dec 21, 2025 | 4 |
| Dec 22, 2025 | 11 |
| Dec 23, 2025 | 8 |
| Dec 24, 2025 | 6 |
| Dec 25, 2025 | 8 |
| Dec 26, 2025 | 0 |
| Dec 27, 2025 | 0 |
| Dec 28, 2025 | 2 |
| Dec 29, 2025 | 5 |
| Dec 30, 2025 | 7 |
| Dec 31, 2025 | 10 |
| Jan 1, 2026 | 8 |
| Jan 2, 2026 | 4 |
| Jan 3, 2026 | 1 |
| Jan 4, 2026 | 0 |
| Jan 5, 2026 | 0 |
| Jan 6, 2026 | 6 |
| Jan 7, 2026 | 3 |
| Jan 8, 2026 | 3 |
| Jan 9, 2026 | 6 |
| Jan 10, 2026 | 3 |
| Jan 11, 2026 | 2 |
| Jan 12, 2026 | 1 |
| Jan 13, 2026 | 0 |
| Jan 14, 2026 | 0 |
| Jan 15, 2026 | 6 |
| Jan 16, 2026 | 3 |
| Jan 17, 2026 | 0 |
| Jan 18, 2026 | 1 |
| Jan 19, 2026 | 5 |
| Jan 20, 2026 | 5 |
| Jan 21, 2026 | 1 |
| Jan 22, 2026 | 0 |
| Jan 23, 2026 | 0 |
| Jan 24, 2026 | 2 |
| Jan 25, 2026 | 1 |
| Jan 26, 2026 | 0 |
| Jan 27, 2026 | 0 |
| Jan 28, 2026 | 1 |
| Jan 29, 2026 | 4 |
| Jan 30, 2026 | 3 |
| Jan 31, 2026 | 0 |
| Feb 1, 2026 | 0 |
| Feb 2, 2026 | 2 |
| Feb 3, 2026 | 4 |
| Feb 4, 2026 | 2 |
| Feb 5, 2026 | 0 |
| Feb 6, 2026 | 0 |
| Feb 7, 2026 | 1 |
| Feb 8, 2026 | 1 |
| Feb 9, 2026 | 0 |
| Feb 10, 2026 | 0 |
| Feb 11, 2026 | 0 |
| Feb 12, 2026 | 3 |
| Feb 13, 2026 | 4 |
| Feb 14, 2026 | 0 |
| Feb 15, 2026 | 0 |
| Feb 16, 2026 | 1 |
| Feb 17, 2026 | 4 |
| Feb 18, 2026 | 0 |
| Feb 19, 2026 | 0 |
| Feb 20, 2026 | 0 |
| Feb 21, 2026 | 1 |
| Feb 22, 2026 | 2 |
| Feb 23, 2026 | 5 |
| Feb 24, 2026 | 2 |
| Feb 25, 2026 | 1 |
| Feb 26, 2026 | 4 |
| Feb 27, 2026 | 0 |
| Feb 28, 2026 | 0 |
| Mar 1, 2026 | 1 |
| Mar 2, 2026 | 2 |
| Mar 3, 2026 | 6 |
| Mar 4, 2026 | 8 |
| Mar 5, 2026 | 6 |
| Mar 6, 2026 | 3 |
| Mar 7, 2026 | 1 |
| Mar 8, 2026 | 0 |
| Mar 9, 2026 | 0 |
| Mar 10, 2026 | 7 |
| Mar 11, 2026 | 4 |
| Mar 12, 2026 | 5 |
| Mar 13, 2026 | 9 |
| Mar 14, 2026 | 4 |
| Mar 15, 2026 | 3 |
| Mar 16, 2026 | 5 |
| Mar 17, 2026 | 0 |
| Mar 18, 2026 | 0 |
| Mar 19, 2026 | 11 |
| Mar 20, 2026 | 8 |
| Mar 21, 2026 | 2 |
| Mar 22, 2026 | 3 |
| Mar 23, 2026 | 12 |
| Mar 24, 2026 | 12 |
| Mar 25, 2026 | 8 |
| Mar 26, 2026 | 0 |
| Mar 27, 2026 | 0 |
| Mar 28, 2026 | 5 |
| Mar 29, 2026 | 4 |
| Mar 30, 2026 | 8 |
| Mar 31, 2026 | 8 |
| Apr 1, 2026 | 11 |
| Apr 2, 2026 | 14 |
| Apr 3, 2026 | 12 |
| Apr 4, 2026 | 0 |
| Apr 5, 2026 | 0 |
| Apr 6, 2026 | 12 |
| Apr 7, 2026 | 14 |
| Apr 8, 2026 | 11 |
| Apr 9, 2026 | 8 |
| Apr 10, 2026 | 9 |
| Apr 11, 2026 | 4 |
| Apr 12, 2026 | 5 |
| Apr 13, 2026 | 0 |
| Apr 14, 2026 | 0 |
| Apr 15, 2026 | 9 |
| Apr 16, 2026 | 13 |
| Apr 17, 2026 | 13 |
| Apr 18, 2026 | 3 |
| Apr 19, 2026 | 3 |
| Apr 20, 2026 | 10 |
| Apr 21, 2026 | 13 |
| Apr 22, 2026 | 0 |
| Apr 23, 2026 | 0 |
| Apr 24, 2026 | 7 |
| Apr 25, 2026 | 3 |
| Apr 26, 2026 | 4 |
| Apr 27, 2026 | 10 |
| Apr 28, 2026 | 7 |
| Apr 29, 2026 | 6 |
| Apr 30, 2026 | 9 |
| May 1, 2026 | 0 |
| May 2, 2026 | 0 |
| May 3, 2026 | 2 |
| May 4, 2026 | 5 |
| May 5, 2026 | 8 |
| May 6, 2026 | 10 |
| May 7, 2026 | 7 |
| May 8, 2026 | 4 |
| May 9, 2026 | 2 |
| May 10, 2026 | 0 |
| May 11, 2026 | 0 |
| May 12, 2026 | 5 |
| May 13, 2026 | 2 |
| May 14, 2026 | 4 |
| May 15, 2026 | 7 |
| May 16, 2026 | 2 |
| May 17, 2026 | 1 |
| May 18, 2026 | 1 |
| May 19, 2026 | 0 |
| May 20, 2026 | 0 |
| May 21, 2026 | 5 |
| May 22, 2026 | 2 |
| May 23, 2026 | 0 |
| May 24, 2026 | 1 |
| May 25, 2026 | 5 |
| May 26, 2026 | 4 |
| May 27, 2026 | 0 |
| May 28, 2026 | 0 |
| May 29, 2026 | 0 |
| May 30, 2026 | 2 |
| May 31, 2026 | 1 |
| Jun 1, 2026 | 0 |
| Jun 2, 2026 | 0 |
| Jun 3, 2026 | 3 |
| Jun 4, 2026 | 4 |
| Jun 5, 2026 | 1 |
| Jun 6, 2026 | 0 |
| Jun 7, 2026 | 0 |
| Jun 8, 2026 | 3 |
| Jun 9, 2026 | 4 |
| Jun 10, 2026 | 1 |
| Jun 11, 2026 | 0 |
| Jun 12, 2026 | 0 |
| Jun 13, 2026 | 1 |
| Jun 14, 2026 | 1 |
| Jun 15, 2026 | 0 |
| Jun 16, 2026 | 0 |
| Jun 17, 2026 | 1 |
| Jun 18, 2026 | 4 |
| Jun 19, 2026 | 4 |
| Jun 20, 2026 | 0 |
| Jun 21, 2026 | 0 |
| Jun 22, 2026 | 2 |
| Jun 23, 2026 | 5 |
| Jun 24, 2026 | 0 |
| Jun 25, 2026 | 0 |
| Jun 26, 2026 | 0 |
| Jun 27, 2026 | 1 |
| Jun 28, 2026 | 2 |
| Jun 29, 2026 | 4 |
| Jun 30, 2026 | 1 |
| Jul 1, 2026 | 1 |
| Jul 2, 2026 | 5 |
| Jul 3, 2026 | 0 |
| Jul 4, 2026 | 0 |
| Jul 5, 2026 | 1 |
| Jul 6, 2026 | 3 |
| Jul 7, 2026 | 7 |
| Jul 8, 2026 | 8 |
| Jul 9, 2026 | 5 |
| Jul 10, 2026 | 3 |
| Jul 11, 2026 | 2 |
| Jul 12, 2026 | 0 |
| Jul 13, 2026 | 0 |
| Jul 14, 2026 | 6 |
| Jul 15, 2026 | 4 |
| Jul 16, 2026 | 7 |
| Jul 17, 2026 | 10 |
| Jul 18, 2026 | 3 |
| Jul 19, 2026 | 2 |
| Jul 20, 2026 | 5 |
| Jul 21, 2026 | 0 |
| Jul 22, 2026 | 0 |
| Jul 23, 2026 | 10 |
| Jul 24, 2026 | 7 |
| Jul 25, 2026 | 2 |
| Jul 26, 2026 | 4 |
| Jul 27, 2026 | 13 |
| Jul 28, 2026 | 11 |
| Jul 29, 2026 | 7 |
| Jul 30, 2026 | 0 |
| Jul 31, 2026 | 0 |
| Aug 1, 2026 | 5 |
| Aug 2, 2026 | 4 |
| Aug 3, 2026 | 8 |
| Aug 4, 2026 | 9 |
| Aug 5, 2026 | 13 |
| Aug 6, 2026 | 14 |
| Aug 7, 2026 | 11 |
| Aug 8, 2026 | 0 |
| Aug 9, 2026 | 0 |
| Aug 10, 2026 | 13 |
| Aug 11, 2026 | 13 |
| Aug 12, 2026 | 10 |
| Aug 13, 2026 | 8 |
| Aug 14, 2026 | 10 |
| Aug 15, 2026 | 5 |
| Aug 16, 2026 | 5 |
| Aug 17, 2026 | 0 |
| Aug 18, 2026 | 0 |
| Aug 19, 2026 | 11 |
| Aug 20, 2026 | 13 |
| Aug 21, 2026 | 12 |
| Aug 22, 2026 | 3 |
| Aug 23, 2026 | 3 |
| Aug 24, 2026 | 11 |
| Aug 25, 2026 | 13 |
| Aug 26, 2026 | 0 |
| Aug 27, 2026 | 0 |
| Aug 28, 2026 | 7 |
| Aug 29, 2026 | 4 |
| Aug 30, 2026 | 4 |
| Aug 31, 2026 | 9 |
| Sep 1, 2026 | 6 |
| Sep 2, 2026 | 7 |
| Sep 3, 2026 | 10 |
| Sep 4, 2026 | 0 |
| Sep 5, 2026 | 0 |
| Sep 6, 2026 | 2 |
| Sep 7, 2026 | 6 |
| Sep 8, 2026 | 9 |
| Sep 9, 2026 | 9 |
| Sep 10, 2026 | 6 |
| Sep 11, 2026 | 3 |
| Sep 12, 2026 | 2 |
| Sep 13, 2026 | 0 |
| Sep 14, 2026 | 0 |
| Sep 15, 2026 | 4 |
| Sep 16, 2026 | 2 |
| Sep 17, 2026 | 5 |
| Sep 18, 2026 | 7 |
| Sep 19, 2026 | 2 |
| Sep 20, 2026 | 1 |
| Sep 21, 2026 | 1 |
| Sep 22, 2026 | 0 |
| Sep 23, 2026 | 0 |
| Sep 24, 2026 | 4 |
| Sep 25, 2026 | 1 |
| Sep 26, 2026 | 0 |
| Sep 27, 2026 | 1 |
| Sep 28, 2026 | 5 |
| Sep 29, 2026 | 3 |
| Sep 30, 2026 | 0 |
| Oct 1, 2026 | 0 |
| Oct 2, 2026 | 0 |
| Oct 3, 2026 | 2 |
| Oct 4, 2026 | 0 |
| Oct 5, 2026 | 0 |
| Oct 6, 2026 | 0 |
| Oct 7, 2026 | 4 |
| Oct 8, 2026 | 4 |
| Oct 9, 2026 | 0 |
| Oct 10, 2026 | 0 |
| Oct 11, 2026 | 0 |
| Oct 12, 2026 | 4 |
| Oct 13, 2026 | 3 |
| Oct 14, 2026 | 0 |
| Oct 15, 2026 | 0 |
| Oct 16, 2026 | 1 |
| Oct 17, 2026 | 1 |
| Oct 18, 2026 | 1 |
| Oct 19, 2026 | 0 |
| Oct 20, 2026 | 0 |
| Oct 21, 2026 | 2 |
| Oct 22, 2026 | 4 |
| Oct 23, 2026 | 2 |
| Oct 24, 2026 | 0 |
| Oct 25, 2026 | 0 |
| Oct 26, 2026 | 3 |
| Oct 27, 2026 | 5 |
| Oct 28, 2026 | 0 |
| Oct 29, 2026 | 0 |
| Oct 30, 2026 | 1 |
| Oct 31, 2026 | 2 |
import { HeatmapChart } from "@/components/dithercharts/heatmap-chart"
import type { ChartConfig } from "@/components/dithercharts/chart-config"
const chartData = [
{ date: "2025-11-02", count: 0 },
{ date: "2025-11-03", count: 0 },
{ date: "2025-11-04", count: 8 },
{ date: "2025-11-05", count: 5 },
{ date: "2025-11-06", count: 4 },
{ date: "2025-11-07", count: 8 },
{ date: "2025-11-08", count: 4 },
{ date: "2025-11-09", count: 3 },
{ date: "2025-11-10", count: 5 },
{ date: "2025-11-11", count: 0 },
{ date: "2025-11-12", count: 0 },
{ date: "2025-11-13", count: 12 },
{ date: "2025-11-14", count: 9 },
{ date: "2025-11-15", count: 2 },
{ date: "2025-11-16", count: 3 },
{ date: "2025-11-17", count: 11 },
{ date: "2025-11-18", count: 12 },
{ date: "2025-11-19", count: 9 },
{ date: "2025-11-20", count: 0 },
{ date: "2025-11-21", count: 0 },
{ date: "2025-11-22", count: 4 },
{ date: "2025-11-23", count: 4 },
{ date: "2025-11-24", count: 9 },
{ date: "2025-11-25", count: 8 },
{ date: "2025-11-26", count: 10 },
{ date: "2025-11-27", count: 13 },
{ date: "2025-11-28", count: 13 },
{ date: "2025-11-29", count: 0 },
{ date: "2025-11-30", count: 0 },
{ date: "2025-12-01", count: 11 },
{ date: "2025-12-02", count: 14 },
{ date: "2025-12-03", count: 13 },
{ date: "2025-12-04", count: 9 },
{ date: "2025-12-05", count: 8 },
{ date: "2025-12-06", count: 4 },
{ date: "2025-12-07", count: 5 },
{ date: "2025-12-08", count: 0 },
{ date: "2025-12-09", count: 0 },
{ date: "2025-12-10", count: 8 },
{ date: "2025-12-11", count: 12 },
{ date: "2025-12-12", count: 14 },
{ date: "2025-12-13", count: 4 },
{ date: "2025-12-14", count: 3 },
{ date: "2025-12-15", count: 8 },
{ date: "2025-12-16", count: 12 },
{ date: "2025-12-17", count: 0 },
{ date: "2025-12-18", count: 0 },
{ date: "2025-12-19", count: 7 },
{ date: "2025-12-20", count: 3 },
{ date: "2025-12-21", count: 4 },
{ date: "2025-12-22", count: 11 },
{ date: "2025-12-23", count: 8 },
{ date: "2025-12-24", count: 6 },
{ date: "2025-12-25", count: 8 },
{ date: "2025-12-26", count: 0 },
{ date: "2025-12-27", count: 0 },
{ date: "2025-12-28", count: 2 },
{ date: "2025-12-29", count: 5 },
{ date: "2025-12-30", count: 7 },
{ date: "2025-12-31", count: 10 },
{ date: "2026-01-01", count: 8 },
{ date: "2026-01-02", count: 4 },
{ date: "2026-01-03", count: 1 },
{ date: "2026-01-04", count: 0 },
{ date: "2026-01-05", count: 0 },
{ date: "2026-01-06", count: 6 },
{ date: "2026-01-07", count: 3 },
{ date: "2026-01-08", count: 3 },
{ date: "2026-01-09", count: 6 },
{ date: "2026-01-10", count: 3 },
{ date: "2026-01-11", count: 2 },
{ date: "2026-01-12", count: 1 },
{ date: "2026-01-13", count: 0 },
{ date: "2026-01-14", count: 0 },
{ date: "2026-01-15", count: 6 },
{ date: "2026-01-16", count: 3 },
{ date: "2026-01-17", count: 0 },
{ date: "2026-01-18", count: 1 },
{ date: "2026-01-19", count: 5 },
{ date: "2026-01-20", count: 5 },
{ date: "2026-01-21", count: 1 },
{ date: "2026-01-22", count: 0 },
{ date: "2026-01-23", count: 0 },
{ date: "2026-01-24", count: 2 },
{ date: "2026-01-25", count: 1 },
{ date: "2026-01-26", count: 0 },
{ date: "2026-01-27", count: 0 },
{ date: "2026-01-28", count: 1 },
{ date: "2026-01-29", count: 4 },
{ date: "2026-01-30", count: 3 },
{ date: "2026-01-31", count: 0 },
{ date: "2026-02-01", count: 0 },
{ date: "2026-02-02", count: 2 },
{ date: "2026-02-03", count: 4 },
{ date: "2026-02-04", count: 2 },
{ date: "2026-02-05", count: 0 },
{ date: "2026-02-06", count: 0 },
{ date: "2026-02-07", count: 1 },
{ date: "2026-02-08", count: 1 },
{ date: "2026-02-09", count: 0 },
{ date: "2026-02-10", count: 0 },
{ date: "2026-02-11", count: 0 },
{ date: "2026-02-12", count: 3 },
{ date: "2026-02-13", count: 4 },
{ date: "2026-02-14", count: 0 },
{ date: "2026-02-15", count: 0 },
{ date: "2026-02-16", count: 1 },
{ date: "2026-02-17", count: 4 },
{ date: "2026-02-18", count: 0 },
{ date: "2026-02-19", count: 0 },
{ date: "2026-02-20", count: 0 },
{ date: "2026-02-21", count: 1 },
{ date: "2026-02-22", count: 2 },
{ date: "2026-02-23", count: 5 },
{ date: "2026-02-24", count: 2 },
{ date: "2026-02-25", count: 1 },
{ date: "2026-02-26", count: 4 },
{ date: "2026-02-27", count: 0 },
{ date: "2026-02-28", count: 0 },
{ date: "2026-03-01", count: 1 },
{ date: "2026-03-02", count: 2 },
{ date: "2026-03-03", count: 6 },
{ date: "2026-03-04", count: 8 },
{ date: "2026-03-05", count: 6 },
{ date: "2026-03-06", count: 3 },
{ date: "2026-03-07", count: 1 },
{ date: "2026-03-08", count: 0 },
{ date: "2026-03-09", count: 0 },
{ date: "2026-03-10", count: 7 },
{ date: "2026-03-11", count: 4 },
{ date: "2026-03-12", count: 5 },
{ date: "2026-03-13", count: 9 },
{ date: "2026-03-14", count: 4 },
{ date: "2026-03-15", count: 3 },
{ date: "2026-03-16", count: 5 },
{ date: "2026-03-17", count: 0 },
{ date: "2026-03-18", count: 0 },
{ date: "2026-03-19", count: 11 },
{ date: "2026-03-20", count: 8 },
{ date: "2026-03-21", count: 2 },
{ date: "2026-03-22", count: 3 },
{ date: "2026-03-23", count: 12 },
{ date: "2026-03-24", count: 12 },
{ date: "2026-03-25", count: 8 },
{ date: "2026-03-26", count: 0 },
{ date: "2026-03-27", count: 0 },
{ date: "2026-03-28", count: 5 },
{ date: "2026-03-29", count: 4 },
{ date: "2026-03-30", count: 8 },
{ date: "2026-03-31", count: 8 },
{ date: "2026-04-01", count: 11 },
{ date: "2026-04-02", count: 14 },
{ date: "2026-04-03", count: 12 },
{ date: "2026-04-04", count: 0 },
{ date: "2026-04-05", count: 0 },
{ date: "2026-04-06", count: 12 },
{ date: "2026-04-07", count: 14 },
{ date: "2026-04-08", count: 11 },
{ date: "2026-04-09", count: 8 },
{ date: "2026-04-10", count: 9 },
{ date: "2026-04-11", count: 4 },
{ date: "2026-04-12", count: 5 },
{ date: "2026-04-13", count: 0 },
{ date: "2026-04-14", count: 0 },
{ date: "2026-04-15", count: 9 },
{ date: "2026-04-16", count: 13 },
{ date: "2026-04-17", count: 13 },
{ date: "2026-04-18", count: 3 },
{ date: "2026-04-19", count: 3 },
{ date: "2026-04-20", count: 10 },
{ date: "2026-04-21", count: 13 },
{ date: "2026-04-22", count: 0 },
{ date: "2026-04-23", count: 0 },
{ date: "2026-04-24", count: 7 },
{ date: "2026-04-25", count: 3 },
{ date: "2026-04-26", count: 4 },
{ date: "2026-04-27", count: 10 },
{ date: "2026-04-28", count: 7 },
{ date: "2026-04-29", count: 6 },
{ date: "2026-04-30", count: 9 },
{ date: "2026-05-01", count: 0 },
{ date: "2026-05-02", count: 0 },
{ date: "2026-05-03", count: 2 },
{ date: "2026-05-04", count: 5 },
{ date: "2026-05-05", count: 8 },
{ date: "2026-05-06", count: 10 },
{ date: "2026-05-07", count: 7 },
{ date: "2026-05-08", count: 4 },
{ date: "2026-05-09", count: 2 },
{ date: "2026-05-10", count: 0 },
{ date: "2026-05-11", count: 0 },
{ date: "2026-05-12", count: 5 },
{ date: "2026-05-13", count: 2 },
{ date: "2026-05-14", count: 4 },
{ date: "2026-05-15", count: 7 },
{ date: "2026-05-16", count: 2 },
{ date: "2026-05-17", count: 1 },
{ date: "2026-05-18", count: 1 },
{ date: "2026-05-19", count: 0 },
{ date: "2026-05-20", count: 0 },
{ date: "2026-05-21", count: 5 },
{ date: "2026-05-22", count: 2 },
{ date: "2026-05-23", count: 0 },
{ date: "2026-05-24", count: 1 },
{ date: "2026-05-25", count: 5 },
{ date: "2026-05-26", count: 4 },
{ date: "2026-05-27", count: 0 },
{ date: "2026-05-28", count: 0 },
{ date: "2026-05-29", count: 0 },
{ date: "2026-05-30", count: 2 },
{ date: "2026-05-31", count: 1 },
{ date: "2026-06-01", count: 0 },
{ date: "2026-06-02", count: 0 },
{ date: "2026-06-03", count: 3 },
{ date: "2026-06-04", count: 4 },
{ date: "2026-06-05", count: 1 },
{ date: "2026-06-06", count: 0 },
{ date: "2026-06-07", count: 0 },
{ date: "2026-06-08", count: 3 },
{ date: "2026-06-09", count: 4 },
{ date: "2026-06-10", count: 1 },
{ date: "2026-06-11", count: 0 },
{ date: "2026-06-12", count: 0 },
{ date: "2026-06-13", count: 1 },
{ date: "2026-06-14", count: 1 },
{ date: "2026-06-15", count: 0 },
{ date: "2026-06-16", count: 0 },
{ date: "2026-06-17", count: 1 },
{ date: "2026-06-18", count: 4 },
{ date: "2026-06-19", count: 4 },
{ date: "2026-06-20", count: 0 },
{ date: "2026-06-21", count: 0 },
{ date: "2026-06-22", count: 2 },
{ date: "2026-06-23", count: 5 },
{ date: "2026-06-24", count: 0 },
{ date: "2026-06-25", count: 0 },
{ date: "2026-06-26", count: 0 },
{ date: "2026-06-27", count: 1 },
{ date: "2026-06-28", count: 2 },
{ date: "2026-06-29", count: 4 },
{ date: "2026-06-30", count: 1 },
{ date: "2026-07-01", count: 1 },
{ date: "2026-07-02", count: 5 },
{ date: "2026-07-03", count: 0 },
{ date: "2026-07-04", count: 0 },
{ date: "2026-07-05", count: 1 },
{ date: "2026-07-06", count: 3 },
{ date: "2026-07-07", count: 7 },
{ date: "2026-07-08", count: 8 },
{ date: "2026-07-09", count: 5 },
{ date: "2026-07-10", count: 3 },
{ date: "2026-07-11", count: 2 },
{ date: "2026-07-12", count: 0 },
{ date: "2026-07-13", count: 0 },
{ date: "2026-07-14", count: 6 },
{ date: "2026-07-15", count: 4 },
{ date: "2026-07-16", count: 7 },
{ date: "2026-07-17", count: 10 },
{ date: "2026-07-18", count: 3 },
{ date: "2026-07-19", count: 2 },
{ date: "2026-07-20", count: 5 },
{ date: "2026-07-21", count: 0 },
{ date: "2026-07-22", count: 0 },
{ date: "2026-07-23", count: 10 },
{ date: "2026-07-24", count: 7 },
{ date: "2026-07-25", count: 2 },
{ date: "2026-07-26", count: 4 },
{ date: "2026-07-27", count: 13 },
{ date: "2026-07-28", count: 11 },
{ date: "2026-07-29", count: 7 },
{ date: "2026-07-30", count: 0 },
{ date: "2026-07-31", count: 0 },
{ date: "2026-08-01", count: 5 },
{ date: "2026-08-02", count: 4 },
{ date: "2026-08-03", count: 8 },
{ date: "2026-08-04", count: 9 },
{ date: "2026-08-05", count: 13 },
{ date: "2026-08-06", count: 14 },
{ date: "2026-08-07", count: 11 },
{ date: "2026-08-08", count: 0 },
{ date: "2026-08-09", count: 0 },
{ date: "2026-08-10", count: 13 },
{ date: "2026-08-11", count: 13 },
{ date: "2026-08-12", count: 10 },
{ date: "2026-08-13", count: 8 },
{ date: "2026-08-14", count: 10 },
{ date: "2026-08-15", count: 5 },
{ date: "2026-08-16", count: 5 },
{ date: "2026-08-17", count: 0 },
{ date: "2026-08-18", count: 0 },
{ date: "2026-08-19", count: 11 },
{ date: "2026-08-20", count: 13 },
{ date: "2026-08-21", count: 12 },
{ date: "2026-08-22", count: 3 },
{ date: "2026-08-23", count: 3 },
{ date: "2026-08-24", count: 11 },
{ date: "2026-08-25", count: 13 },
{ date: "2026-08-26", count: 0 },
{ date: "2026-08-27", count: 0 },
{ date: "2026-08-28", count: 7 },
{ date: "2026-08-29", count: 4 },
{ date: "2026-08-30", count: 4 },
{ date: "2026-08-31", count: 9 },
{ date: "2026-09-01", count: 6 },
{ date: "2026-09-02", count: 7 },
{ date: "2026-09-03", count: 10 },
{ date: "2026-09-04", count: 0 },
{ date: "2026-09-05", count: 0 },
{ date: "2026-09-06", count: 2 },
{ date: "2026-09-07", count: 6 },
{ date: "2026-09-08", count: 9 },
{ date: "2026-09-09", count: 9 },
{ date: "2026-09-10", count: 6 },
{ date: "2026-09-11", count: 3 },
{ date: "2026-09-12", count: 2 },
{ date: "2026-09-13", count: 0 },
{ date: "2026-09-14", count: 0 },
{ date: "2026-09-15", count: 4 },
{ date: "2026-09-16", count: 2 },
{ date: "2026-09-17", count: 5 },
{ date: "2026-09-18", count: 7 },
{ date: "2026-09-19", count: 2 },
{ date: "2026-09-20", count: 1 },
{ date: "2026-09-21", count: 1 },
{ date: "2026-09-22", count: 0 },
{ date: "2026-09-23", count: 0 },
{ date: "2026-09-24", count: 4 },
{ date: "2026-09-25", count: 1 },
{ date: "2026-09-26", count: 0 },
{ date: "2026-09-27", count: 1 },
{ date: "2026-09-28", count: 5 },
{ date: "2026-09-29", count: 3 },
{ date: "2026-09-30", count: 0 },
{ date: "2026-10-01", count: 0 },
{ date: "2026-10-02", count: 0 },
{ date: "2026-10-03", count: 2 },
{ date: "2026-10-04", count: 0 },
{ date: "2026-10-05", count: 0 },
{ date: "2026-10-06", count: 0 },
{ date: "2026-10-07", count: 4 },
{ date: "2026-10-08", count: 4 },
{ date: "2026-10-09", count: 0 },
{ date: "2026-10-10", count: 0 },
{ date: "2026-10-11", count: 0 },
{ date: "2026-10-12", count: 4 },
{ date: "2026-10-13", count: 3 },
{ date: "2026-10-14", count: 0 },
{ date: "2026-10-15", count: 0 },
{ date: "2026-10-16", count: 1 },
{ date: "2026-10-17", count: 1 },
{ date: "2026-10-18", count: 1 },
{ date: "2026-10-19", count: 0 },
{ date: "2026-10-20", count: 0 },
{ date: "2026-10-21", count: 2 },
{ date: "2026-10-22", count: 4 },
{ date: "2026-10-23", count: 2 },
{ date: "2026-10-24", count: 0 },
{ date: "2026-10-25", count: 0 },
{ date: "2026-10-26", count: 3 },
{ date: "2026-10-27", count: 5 },
{ date: "2026-10-28", count: 0 },
{ date: "2026-10-29", count: 0 },
{ date: "2026-10-30", count: 1 },
{ date: "2026-10-31", count: 2 },
]
const chartConfig = {
count: { label: "Contributions" },
} satisfies ChartConfig
export function ChartHeatmapCalendar() {
return (
<HeatmapChart
data={chartData}
config={chartConfig}
dataKey="count"
label="Contributions in the last year"
/>
)
}
Install
Charts install with DitherCharts Pro. See Installation to log in and import the stylesheet.
npx dithercharts add heatmap-chart
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| datarequired | Type readonly ChartRow[] | Default – | One row per day, e.g. { date: "2026-03-04", count: 12 }; repeated dates are summed, missing days are 0. |
| configrequired | Type ChartConfig | Default – | One entry for dataKey: the value's label in the tooltip and the table twin. |
| dataKeyrequired | Type string | Default – | The row key that holds each day's value, e.g. "count". |
| dateKey | Type string | Default "date" | The row key that holds each day's YYYY-MM-DD date. |
| labelrequired | Type string | Default – | Accessible name, e.g. "Contributions in the last year". Also captions the table twin. |
| from | Type string | Default – | The first day shown, as YYYY-MM-DD. Default: the earliest date in data. |
| to | Type string | Default – | The last day shown, as YYYY-MM-DD. Default: the latest date in data. |
| weekStart | Type "sunday" | "monday" | Default "sunday" | The day each week's column starts on. |
| thresholds | Type readonly [number, number, number] | Default – | The upper bounds of steps 1-3, e.g. [2, 5, 10]; anything above the last is step 4. Default: 4 equal steps of the max. |
| legend | Type boolean | Default false | A "Less ... More" scale of the 5 steps under the chart. |
| tooltip | Type TooltipOptions | Default – | The tooltip's indicator and label, and the day it opens on at rest. |
| style | Type StyleId | Default "bayer4" | Dither style. |
| animation | Type "develop" | "none" | Default "develop" | Entrance animation; reduced motion always shows the final frame. |
| cell | Type number | Default 2 | Dither cell size in CSS pixels; a square is 6 cells. |
| className | Type string | Default – | Classes on the chart's outer figure. |
Styles
The dither styles style takes:
"bayer2""bayer4""bayer8""blue-noise""halftone""crosshatch""pixel""stipple""engraved""mezzotint""woodcut""floyd-steinberg""atkinson""riemersma"
Keyboard and accessibility
The chart is one Tab stop. Focusing it from the keyboard puts the cursor on the first day, or where the keys last left it; moving focus away clears it. The keys stop at the ends.
| Key | Action |
|---|---|
| Left arrow Right arrow | Previous / next week |
| Home End | First / last day |
| Up arrow Down arrow | Previous / next day |
| Escape | Dismiss the cursor |
Screen readers
- The chart's label names it, says how many days it has and lists these keys.
- Each key press is announced in a polite live region. Moving the pointer is silent.
- The
tablebutton under the chart shows its data as a table. Screen readers can reach the table even while it's hidden; clicking a row moves the cursor there and announces it. - With
legend, each entry is a toggle button. The last one showing can't be hidden, but its button stays focusable.
On a touch screen, a tap pins the cursor and a tap outside the chart dismisses it.

