Interactive

Contribution Graph

A calendar heatmap of a year of activity, with five intensity levels, month headers and keyboard-reachable day tooltips.

A year of activity laid out as a calendar: one column per week, one row per weekday, and a cell for every day. data only needs the days that have activity — the rest of the grid is filled in as empty days, so you never have to generate a full year yourself.

Intensity comes from each entry's level, a 0–4 bucket. Those buckets are mixed from the primary colour rather than hard-coded greens, so the heatmap follows the app's theme in both light and dark mode. Empty days are still drawn, as muted cells, because a calendar with holes in it reads as broken rather than empty.

The grid is a real <table>. Months are column headers grouped by week, weekdays are row headers, and every day with activity is focusable and carries its date and count as text. Hovering or focusing a day opens a small tooltip with the full date and the number of contributions; the animation is a short spring-driven scale, honouring prefers-reduced-motion.

Usage

Pass data with local YYYY-MM-DD keys and the year to display. Entries outside that year are ignored, and days without an entry render at level 0. count is used for the label, level for the colour.

Contribution graph for 2026
DecJanFebMarAprMayJunJulAugSepOctNovDec
SunSunday, December 28, 2025: No contributionsSunday, January 4, 2026: 1 contributionSunday, January 11, 2026: 17 contributionsSunday, January 18, 2026: 22 contributionsSunday, January 25, 2026: 17 contributionsSunday, February 1, 2026: 5 contributionsSunday, February 8, 2026: No contributionsSunday, February 15, 2026: No contributionsSunday, February 22, 2026: No contributionsSunday, March 1, 2026: 7 contributionsSunday, March 8, 2026: 13 contributionsSunday, March 15, 2026: 10 contributionsSunday, March 22, 2026: No contributionsSunday, March 29, 2026: No contributionsSunday, April 5, 2026: No contributionsSunday, April 12, 2026: No contributionsSunday, April 19, 2026: No contributionsSunday, April 26, 2026: No contributionsSunday, May 3, 2026: No contributionsSunday, May 10, 2026: No contributionsSunday, May 17, 2026: No contributionsSunday, May 24, 2026: No contributionsSunday, May 31, 2026: No contributionsSunday, June 7, 2026: No contributionsSunday, June 14, 2026: No contributionsSunday, June 21, 2026: 12 contributionsSunday, June 28, 2026: 25 contributionsSunday, July 5, 2026: 28 contributionsSunday, July 12, 2026: 20 contributionsSunday, July 19, 2026: 3 contributionsSunday, July 26, 2026: No contributionsSunday, August 2, 2026: No contributionsSunday, August 9, 2026: No contributionsSunday, August 16, 2026: No contributionsSunday, August 23, 2026: No contributionsSunday, August 30, 2026: No contributionsSunday, September 6, 2026: No contributionsSunday, September 13, 2026: No contributionsSunday, September 20, 2026: No contributionsSunday, September 27, 2026: No contributionsSunday, October 4, 2026: No contributionsSunday, October 11, 2026: No contributionsSunday, October 18, 2026: 7 contributionsSunday, October 25, 2026: 17 contributionsSunday, November 1, 2026: 16 contributionsSunday, November 8, 2026: 8 contributionsSunday, November 15, 2026: No contributionsSunday, November 22, 2026: No contributionsSunday, November 29, 2026: No contributionsSunday, December 6, 2026: 7 contributionsSunday, December 13, 2026: 16 contributionsSunday, December 20, 2026: 17 contributionsSunday, December 27, 2026: 7 contributions
MonMonday, December 29, 2025: No contributionsMonday, January 5, 2026: 4 contributionsMonday, January 12, 2026: 18 contributionsMonday, January 19, 2026: 22 contributionsMonday, January 26, 2026: 15 contributionsMonday, February 2, 2026: 3 contributionsMonday, February 9, 2026: No contributionsMonday, February 16, 2026: No contributionsMonday, February 23, 2026: No contributionsMonday, March 2, 2026: 9 contributionsMonday, March 9, 2026: 13 contributionsMonday, March 16, 2026: 8 contributionsMonday, March 23, 2026: No contributionsMonday, March 30, 2026: No contributionsMonday, April 6, 2026: No contributionsMonday, April 13, 2026: No contributionsMonday, April 20, 2026: No contributionsMonday, April 27, 2026: No contributionsMonday, May 4, 2026: No contributionsMonday, May 11, 2026: No contributionsMonday, May 18, 2026: No contributionsMonday, May 25, 2026: No contributionsMonday, June 1, 2026: No contributionsMonday, June 8, 2026: No contributionsMonday, June 15, 2026: No contributionsMonday, June 22, 2026: 14 contributionsMonday, June 29, 2026: 26 contributionsMonday, July 6, 2026: 28 contributionsMonday, July 13, 2026: 18 contributionsMonday, July 20, 2026: 1 contributionMonday, July 27, 2026: No contributionsMonday, August 3, 2026: No contributionsMonday, August 10, 2026: No contributionsMonday, August 17, 2026: No contributionsMonday, August 24, 2026: No contributionsMonday, August 31, 2026: No contributionsMonday, September 7, 2026: No contributionsMonday, September 14, 2026: No contributionsMonday, September 21, 2026: No contributionsMonday, September 28, 2026: No contributionsMonday, October 5, 2026: No contributionsMonday, October 12, 2026: No contributionsMonday, October 19, 2026: 9 contributionsMonday, October 26, 2026: 18 contributionsMonday, November 2, 2026: 15 contributionsMonday, November 9, 2026: 6 contributionsMonday, November 16, 2026: No contributionsMonday, November 23, 2026: No contributionsMonday, November 30, 2026: No contributionsMonday, December 7, 2026: 9 contributionsMonday, December 14, 2026: 17 contributionsMonday, December 21, 2026: 16 contributionsMonday, December 28, 2026: 5 contributions
TueTuesday, December 30, 2025: No contributionsTuesday, January 6, 2026: 6 contributionsTuesday, January 13, 2026: 19 contributionsTuesday, January 20, 2026: 21 contributionsTuesday, January 27, 2026: 14 contributionsTuesday, February 3, 2026: 2 contributionsTuesday, February 10, 2026: No contributionsTuesday, February 17, 2026: No contributionsTuesday, February 24, 2026: 1 contributionTuesday, March 3, 2026: 10 contributionsTuesday, March 10, 2026: 13 contributionsTuesday, March 17, 2026: 7 contributionsTuesday, March 24, 2026: No contributionsTuesday, March 31, 2026: No contributionsTuesday, April 7, 2026: No contributionsTuesday, April 14, 2026: No contributionsTuesday, April 21, 2026: No contributionsTuesday, April 28, 2026: No contributionsTuesday, May 5, 2026: No contributionsTuesday, May 12, 2026: No contributionsTuesday, May 19, 2026: No contributionsTuesday, May 26, 2026: No contributionsTuesday, June 2, 2026: No contributionsTuesday, June 9, 2026: No contributionsTuesday, June 16, 2026: No contributionsTuesday, June 23, 2026: 16 contributionsTuesday, June 30, 2026: 27 contributionsTuesday, July 7, 2026: 27 contributionsTuesday, July 14, 2026: 15 contributionsTuesday, July 21, 2026: No contributionsTuesday, July 28, 2026: No contributionsTuesday, August 4, 2026: No contributionsTuesday, August 11, 2026: No contributionsTuesday, August 18, 2026: No contributionsTuesday, August 25, 2026: No contributionsTuesday, September 1, 2026: No contributionsTuesday, September 8, 2026: No contributionsTuesday, September 15, 2026: No contributionsTuesday, September 22, 2026: No contributionsTuesday, September 29, 2026: No contributionsTuesday, October 6, 2026: No contributionsTuesday, October 13, 2026: No contributionsTuesday, October 20, 2026: 11 contributionsTuesday, October 27, 2026: 18 contributionsTuesday, November 3, 2026: 14 contributionsTuesday, November 10, 2026: 4 contributionsTuesday, November 17, 2026: No contributionsTuesday, November 24, 2026: No contributionsTuesday, December 1, 2026: No contributionsTuesday, December 8, 2026: 10 contributionsTuesday, December 15, 2026: 17 contributionsTuesday, December 22, 2026: 15 contributionsTuesday, December 29, 2026: 3 contributions
WedWednesday, December 31, 2025: No contributionsWednesday, January 7, 2026: 9 contributionsWednesday, January 14, 2026: 20 contributionsWednesday, January 21, 2026: 21 contributionsWednesday, January 28, 2026: 12 contributionsWednesday, February 4, 2026: No contributionsWednesday, February 11, 2026: No contributionsWednesday, February 18, 2026: No contributionsWednesday, February 25, 2026: 2 contributionsWednesday, March 4, 2026: 11 contributionsWednesday, March 11, 2026: 13 contributionsWednesday, March 18, 2026: 5 contributionsWednesday, March 25, 2026: No contributionsWednesday, April 1, 2026: No contributionsWednesday, April 8, 2026: No contributionsWednesday, April 15, 2026: No contributionsWednesday, April 22, 2026: No contributionsWednesday, April 29, 2026: No contributionsWednesday, May 6, 2026: No contributionsWednesday, May 13, 2026: No contributionsWednesday, May 20, 2026: No contributionsWednesday, May 27, 2026: No contributionsWednesday, June 3, 2026: No contributionsWednesday, June 10, 2026: No contributionsWednesday, June 17, 2026: 3 contributionsWednesday, June 24, 2026: 18 contributionsWednesday, July 1, 2026: 28 contributionsWednesday, July 8, 2026: 26 contributionsWednesday, July 15, 2026: 13 contributionsWednesday, July 22, 2026: No contributionsWednesday, July 29, 2026: No contributionsWednesday, August 5, 2026: No contributionsWednesday, August 12, 2026: No contributionsWednesday, August 19, 2026: No contributionsWednesday, August 26, 2026: No contributionsWednesday, September 2, 2026: No contributionsWednesday, September 9, 2026: No contributionsWednesday, September 16, 2026: No contributionsWednesday, September 23, 2026: No contributionsWednesday, September 30, 2026: No contributionsWednesday, October 7, 2026: No contributionsWednesday, October 14, 2026: No contributionsWednesday, October 21, 2026: 12 contributionsWednesday, October 28, 2026: 18 contributionsWednesday, November 4, 2026: 13 contributionsWednesday, November 11, 2026: 3 contributionsWednesday, November 18, 2026: No contributionsWednesday, November 25, 2026: No contributionsWednesday, December 2, 2026: 1 contributionWednesday, December 9, 2026: 12 contributionsWednesday, December 16, 2026: 18 contributionsWednesday, December 23, 2026: 14 contributionsWednesday, December 30, 2026: No contributions
ThuThursday, January 1, 2026: No contributionsThursday, January 8, 2026: 11 contributionsThursday, January 15, 2026: 21 contributionsThursday, January 22, 2026: 20 contributionsThursday, January 29, 2026: 10 contributionsThursday, February 5, 2026: No contributionsThursday, February 12, 2026: No contributionsThursday, February 19, 2026: No contributionsThursday, February 26, 2026: 3 contributionsThursday, March 5, 2026: 12 contributionsThursday, March 12, 2026: 13 contributionsThursday, March 19, 2026: 3 contributionsThursday, March 26, 2026: No contributionsThursday, April 2, 2026: No contributionsThursday, April 9, 2026: No contributionsThursday, April 16, 2026: No contributionsThursday, April 23, 2026: No contributionsThursday, April 30, 2026: No contributionsThursday, May 7, 2026: No contributionsThursday, May 14, 2026: No contributionsThursday, May 21, 2026: No contributionsThursday, May 28, 2026: No contributionsThursday, June 4, 2026: No contributionsThursday, June 11, 2026: No contributionsThursday, June 18, 2026: 5 contributionsThursday, June 25, 2026: 20 contributionsThursday, July 2, 2026: 28 contributionsThursday, July 9, 2026: 25 contributionsThursday, July 16, 2026: 11 contributionsThursday, July 23, 2026: No contributionsThursday, July 30, 2026: No contributionsThursday, August 6, 2026: No contributionsThursday, August 13, 2026: No contributionsThursday, August 20, 2026: No contributionsThursday, August 27, 2026: No contributionsThursday, September 3, 2026: No contributionsThursday, September 10, 2026: No contributionsThursday, September 17, 2026: No contributionsThursday, September 24, 2026: No contributionsThursday, October 1, 2026: No contributionsThursday, October 8, 2026: No contributionsThursday, October 15, 2026: No contributionsThursday, October 22, 2026: 14 contributionsThursday, October 29, 2026: 18 contributionsThursday, November 5, 2026: 12 contributionsThursday, November 12, 2026: 1 contributionThursday, November 19, 2026: No contributionsThursday, November 26, 2026: No contributionsThursday, December 3, 2026: 2 contributionsThursday, December 10, 2026: 13 contributionsThursday, December 17, 2026: 18 contributionsThursday, December 24, 2026: 13 contributionsThursday, December 31, 2026: No contributions
FriFriday, January 2, 2026: No contributionsFriday, January 9, 2026: 13 contributionsFriday, January 16, 2026: 22 contributionsFriday, January 23, 2026: 19 contributionsFriday, January 30, 2026: 8 contributionsFriday, February 6, 2026: No contributionsFriday, February 13, 2026: No contributionsFriday, February 20, 2026: No contributionsFriday, February 27, 2026: 5 contributionsFriday, March 6, 2026: 12 contributionsFriday, March 13, 2026: 12 contributionsFriday, March 20, 2026: 1 contributionFriday, March 27, 2026: No contributionsFriday, April 3, 2026: No contributionsFriday, April 10, 2026: No contributionsFriday, April 17, 2026: No contributionsFriday, April 24, 2026: No contributionsFriday, May 1, 2026: No contributionsFriday, May 8, 2026: No contributionsFriday, May 15, 2026: No contributionsFriday, May 22, 2026: No contributionsFriday, May 29, 2026: No contributionsFriday, June 5, 2026: No contributionsFriday, June 12, 2026: No contributionsFriday, June 19, 2026: 7 contributionsFriday, June 26, 2026: 22 contributionsFriday, July 3, 2026: 29 contributionsFriday, July 10, 2026: 23 contributionsFriday, July 17, 2026: 8 contributionsFriday, July 24, 2026: No contributionsFriday, July 31, 2026: No contributionsFriday, August 7, 2026: No contributionsFriday, August 14, 2026: No contributionsFriday, August 21, 2026: No contributionsFriday, August 28, 2026: No contributionsFriday, September 4, 2026: No contributionsFriday, September 11, 2026: No contributionsFriday, September 18, 2026: No contributionsFriday, September 25, 2026: No contributionsFriday, October 2, 2026: No contributionsFriday, October 9, 2026: No contributionsFriday, October 16, 2026: 2 contributionsFriday, October 23, 2026: 15 contributionsFriday, October 30, 2026: 18 contributionsFriday, November 6, 2026: 11 contributionsFriday, November 13, 2026: No contributionsFriday, November 20, 2026: No contributionsFriday, November 27, 2026: No contributionsFriday, December 4, 2026: 4 contributionsFriday, December 11, 2026: 14 contributionsFriday, December 18, 2026: 18 contributionsFriday, December 25, 2026: 11 contributionsFriday, January 1, 2027: No contributions
SatSaturday, January 3, 2026: No contributionsSaturday, January 10, 2026: 15 contributionsSaturday, January 17, 2026: 22 contributionsSaturday, January 24, 2026: 18 contributionsSaturday, January 31, 2026: 7 contributionsSaturday, February 7, 2026: No contributionsSaturday, February 14, 2026: No contributionsSaturday, February 21, 2026: No contributionsSaturday, February 28, 2026: 6 contributionsSaturday, March 7, 2026: 13 contributionsSaturday, March 14, 2026: 11 contributionsSaturday, March 21, 2026: No contributionsSaturday, March 28, 2026: No contributionsSaturday, April 4, 2026: No contributionsSaturday, April 11, 2026: No contributionsSaturday, April 18, 2026: No contributionsSaturday, April 25, 2026: No contributionsSaturday, May 2, 2026: No contributionsSaturday, May 9, 2026: No contributionsSaturday, May 16, 2026: No contributionsSaturday, May 23, 2026: No contributionsSaturday, May 30, 2026: No contributionsSaturday, June 6, 2026: No contributionsSaturday, June 13, 2026: No contributionsSaturday, June 20, 2026: 10 contributionsSaturday, June 27, 2026: 24 contributionsSaturday, July 4, 2026: 29 contributionsSaturday, July 11, 2026: 22 contributionsSaturday, July 18, 2026: 6 contributionsSaturday, July 25, 2026: No contributionsSaturday, August 1, 2026: No contributionsSaturday, August 8, 2026: No contributionsSaturday, August 15, 2026: No contributionsSaturday, August 22, 2026: No contributionsSaturday, August 29, 2026: No contributionsSaturday, September 5, 2026: No contributionsSaturday, September 12, 2026: No contributionsSaturday, September 19, 2026: No contributionsSaturday, September 26, 2026: No contributionsSaturday, October 3, 2026: No contributionsSaturday, October 10, 2026: No contributionsSaturday, October 17, 2026: 4 contributionsSaturday, October 24, 2026: 16 contributionsSaturday, October 31, 2026: 17 contributionsSaturday, November 7, 2026: 9 contributionsSaturday, November 14, 2026: No contributionsSaturday, November 21, 2026: No contributionsSaturday, November 28, 2026: No contributionsSaturday, December 5, 2026: 5 contributionsSaturday, December 12, 2026: 15 contributionsSaturday, December 19, 2026: 18 contributionsSaturday, December 26, 2026: 9 contributionsSaturday, January 2, 2027: No contributions
LessMore
<template>
  <div class="flex w-full justify-center py-4">
    <MContributionGraph
      :data="contributions"
      :year="year"
      class="max-w-full"
    />
  </div>
</template>

<script setup lang="ts">
type Contribution = {
  count: number
  date: string
  level: number
}

const year = new Date().getFullYear()

function pad(value: number) {
  return `${value}`.padStart(2, '0')
}

function toKey(date: Date) {
  return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`
}

const contributions: Contribution[] = []
const cursor = new Date(year, 0, 1)
let index = 0

while (cursor.getFullYear() === year) {
  const wave = Math.sin(index / 9) + Math.sin(index / 23)
  const count = wave > 0.4 ? Math.round((wave - 0.4) * 18) : 0

  contributions.push({
    count,
    date: toKey(cursor),
    level: count === 0 ? 0 : Math.min(4, Math.ceil(count / 4)),
  })

  cursor.setDate(cursor.getDate() + 1)
  index += 1
}
</script>

Customize

showTooltips turns the hover and focus bubble off without changing the grid, and showLegend removes the Less → More scale underneath. The tooltip is the only animated part, so the graph is fully static when both are off.

Contribution graph for 2026
DecJanFebMarAprMayJunJulAugSepOctNovDec
SunSunday, December 28, 2025: No contributionsSunday, January 4, 2026: No contributionsSunday, January 11, 2026: No contributionsSunday, January 18, 2026: No contributionsSunday, January 25, 2026: 2 contributionsSunday, February 1, 2026: No contributionsSunday, February 8, 2026: No contributionsSunday, February 15, 2026: No contributionsSunday, February 22, 2026: No contributionsSunday, March 1, 2026: No contributionsSunday, March 8, 2026: 12 contributionsSunday, March 15, 2026: No contributionsSunday, March 22, 2026: No contributionsSunday, March 29, 2026: No contributionsSunday, April 5, 2026: No contributionsSunday, April 12, 2026: No contributionsSunday, April 19, 2026: 9 contributionsSunday, April 26, 2026: No contributionsSunday, May 3, 2026: No contributionsSunday, May 10, 2026: No contributionsSunday, May 17, 2026: No contributionsSunday, May 24, 2026: No contributionsSunday, May 31, 2026: 6 contributionsSunday, June 7, 2026: No contributionsSunday, June 14, 2026: No contributionsSunday, June 21, 2026: No contributionsSunday, June 28, 2026: No contributionsSunday, July 5, 2026: No contributionsSunday, July 12, 2026: 3 contributionsSunday, July 19, 2026: No contributionsSunday, July 26, 2026: No contributionsSunday, August 2, 2026: No contributionsSunday, August 9, 2026: No contributionsSunday, August 16, 2026: No contributionsSunday, August 23, 2026: No contributionsSunday, August 30, 2026: No contributionsSunday, September 6, 2026: No contributionsSunday, September 13, 2026: No contributionsSunday, September 20, 2026: No contributionsSunday, September 27, 2026: No contributionsSunday, October 4, 2026: 10 contributionsSunday, October 11, 2026: No contributionsSunday, October 18, 2026: No contributionsSunday, October 25, 2026: No contributionsSunday, November 1, 2026: No contributionsSunday, November 8, 2026: No contributionsSunday, November 15, 2026: 7 contributionsSunday, November 22, 2026: No contributionsSunday, November 29, 2026: No contributionsSunday, December 6, 2026: No contributionsSunday, December 13, 2026: No contributionsSunday, December 20, 2026: No contributionsSunday, December 27, 2026: No contributions
MonMonday, December 29, 2025: No contributionsMonday, January 5, 2026: No contributionsMonday, January 12, 2026: No contributionsMonday, January 19, 2026: 8 contributionsMonday, January 26, 2026: No contributionsMonday, February 2, 2026: No contributionsMonday, February 9, 2026: No contributionsMonday, February 16, 2026: No contributionsMonday, February 23, 2026: No contributionsMonday, March 2, 2026: 5 contributionsMonday, March 9, 2026: No contributionsMonday, March 16, 2026: No contributionsMonday, March 23, 2026: No contributionsMonday, March 30, 2026: No contributionsMonday, April 6, 2026: No contributionsMonday, April 13, 2026: 2 contributionsMonday, April 20, 2026: No contributionsMonday, April 27, 2026: No contributionsMonday, May 4, 2026: No contributionsMonday, May 11, 2026: No contributionsMonday, May 18, 2026: No contributionsMonday, May 25, 2026: 12 contributionsMonday, June 1, 2026: No contributionsMonday, June 8, 2026: No contributionsMonday, June 15, 2026: No contributionsMonday, June 22, 2026: No contributionsMonday, June 29, 2026: No contributionsMonday, July 6, 2026: 9 contributionsMonday, July 13, 2026: No contributionsMonday, July 20, 2026: No contributionsMonday, July 27, 2026: No contributionsMonday, August 3, 2026: No contributionsMonday, August 10, 2026: No contributionsMonday, August 17, 2026: 6 contributionsMonday, August 24, 2026: No contributionsMonday, August 31, 2026: No contributionsMonday, September 7, 2026: No contributionsMonday, September 14, 2026: No contributionsMonday, September 21, 2026: No contributionsMonday, September 28, 2026: 3 contributionsMonday, October 5, 2026: No contributionsMonday, October 12, 2026: No contributionsMonday, October 19, 2026: No contributionsMonday, October 26, 2026: No contributionsMonday, November 2, 2026: No contributionsMonday, November 9, 2026: No contributionsMonday, November 16, 2026: No contributionsMonday, November 23, 2026: No contributionsMonday, November 30, 2026: No contributionsMonday, December 7, 2026: No contributionsMonday, December 14, 2026: No contributionsMonday, December 21, 2026: 10 contributionsMonday, December 28, 2026: No contributions
TueTuesday, December 30, 2025: No contributionsTuesday, January 6, 2026: No contributionsTuesday, January 13, 2026: 1 contributionTuesday, January 20, 2026: No contributionsTuesday, January 27, 2026: No contributionsTuesday, February 3, 2026: No contributionsTuesday, February 10, 2026: No contributionsTuesday, February 17, 2026: No contributionsTuesday, February 24, 2026: 11 contributionsTuesday, March 3, 2026: No contributionsTuesday, March 10, 2026: No contributionsTuesday, March 17, 2026: No contributionsTuesday, March 24, 2026: No contributionsTuesday, March 31, 2026: No contributionsTuesday, April 7, 2026: 8 contributionsTuesday, April 14, 2026: No contributionsTuesday, April 21, 2026: No contributionsTuesday, April 28, 2026: No contributionsTuesday, May 5, 2026: No contributionsTuesday, May 12, 2026: No contributionsTuesday, May 19, 2026: 5 contributionsTuesday, May 26, 2026: No contributionsTuesday, June 2, 2026: No contributionsTuesday, June 9, 2026: No contributionsTuesday, June 16, 2026: No contributionsTuesday, June 23, 2026: No contributionsTuesday, June 30, 2026: 2 contributionsTuesday, July 7, 2026: No contributionsTuesday, July 14, 2026: No contributionsTuesday, July 21, 2026: No contributionsTuesday, July 28, 2026: No contributionsTuesday, August 4, 2026: No contributionsTuesday, August 11, 2026: 12 contributionsTuesday, August 18, 2026: No contributionsTuesday, August 25, 2026: No contributionsTuesday, September 1, 2026: No contributionsTuesday, September 8, 2026: No contributionsTuesday, September 15, 2026: No contributionsTuesday, September 22, 2026: 9 contributionsTuesday, September 29, 2026: No contributionsTuesday, October 6, 2026: No contributionsTuesday, October 13, 2026: No contributionsTuesday, October 20, 2026: No contributionsTuesday, October 27, 2026: No contributionsTuesday, November 3, 2026: 6 contributionsTuesday, November 10, 2026: No contributionsTuesday, November 17, 2026: No contributionsTuesday, November 24, 2026: No contributionsTuesday, December 1, 2026: No contributionsTuesday, December 8, 2026: No contributionsTuesday, December 15, 2026: 3 contributionsTuesday, December 22, 2026: No contributionsTuesday, December 29, 2026: No contributions
WedWednesday, December 31, 2025: No contributionsWednesday, January 7, 2026: 7 contributionsWednesday, January 14, 2026: No contributionsWednesday, January 21, 2026: No contributionsWednesday, January 28, 2026: No contributionsWednesday, February 4, 2026: No contributionsWednesday, February 11, 2026: No contributionsWednesday, February 18, 2026: 4 contributionsWednesday, February 25, 2026: No contributionsWednesday, March 4, 2026: No contributionsWednesday, March 11, 2026: No contributionsWednesday, March 18, 2026: No contributionsWednesday, March 25, 2026: No contributionsWednesday, April 1, 2026: 1 contributionWednesday, April 8, 2026: No contributionsWednesday, April 15, 2026: No contributionsWednesday, April 22, 2026: No contributionsWednesday, April 29, 2026: No contributionsWednesday, May 6, 2026: No contributionsWednesday, May 13, 2026: 11 contributionsWednesday, May 20, 2026: No contributionsWednesday, May 27, 2026: No contributionsWednesday, June 3, 2026: No contributionsWednesday, June 10, 2026: No contributionsWednesday, June 17, 2026: No contributionsWednesday, June 24, 2026: 8 contributionsWednesday, July 1, 2026: No contributionsWednesday, July 8, 2026: No contributionsWednesday, July 15, 2026: No contributionsWednesday, July 22, 2026: No contributionsWednesday, July 29, 2026: No contributionsWednesday, August 5, 2026: 5 contributionsWednesday, August 12, 2026: No contributionsWednesday, August 19, 2026: No contributionsWednesday, August 26, 2026: No contributionsWednesday, September 2, 2026: No contributionsWednesday, September 9, 2026: No contributionsWednesday, September 16, 2026: 2 contributionsWednesday, September 23, 2026: No contributionsWednesday, September 30, 2026: No contributionsWednesday, October 7, 2026: No contributionsWednesday, October 14, 2026: No contributionsWednesday, October 21, 2026: No contributionsWednesday, October 28, 2026: 12 contributionsWednesday, November 4, 2026: No contributionsWednesday, November 11, 2026: No contributionsWednesday, November 18, 2026: No contributionsWednesday, November 25, 2026: No contributionsWednesday, December 2, 2026: No contributionsWednesday, December 9, 2026: 9 contributionsWednesday, December 16, 2026: No contributionsWednesday, December 23, 2026: No contributionsWednesday, December 30, 2026: No contributions
ThuThursday, January 1, 2026: No contributionsThursday, January 8, 2026: No contributionsThursday, January 15, 2026: No contributionsThursday, January 22, 2026: No contributionsThursday, January 29, 2026: No contributionsThursday, February 5, 2026: No contributionsThursday, February 12, 2026: 10 contributionsThursday, February 19, 2026: No contributionsThursday, February 26, 2026: No contributionsThursday, March 5, 2026: No contributionsThursday, March 12, 2026: No contributionsThursday, March 19, 2026: No contributionsThursday, March 26, 2026: 7 contributionsThursday, April 2, 2026: No contributionsThursday, April 9, 2026: No contributionsThursday, April 16, 2026: No contributionsThursday, April 23, 2026: No contributionsThursday, April 30, 2026: No contributionsThursday, May 7, 2026: 4 contributionsThursday, May 14, 2026: No contributionsThursday, May 21, 2026: No contributionsThursday, May 28, 2026: No contributionsThursday, June 4, 2026: No contributionsThursday, June 11, 2026: No contributionsThursday, June 18, 2026: 1 contributionThursday, June 25, 2026: No contributionsThursday, July 2, 2026: No contributionsThursday, July 9, 2026: No contributionsThursday, July 16, 2026: No contributionsThursday, July 23, 2026: No contributionsThursday, July 30, 2026: 11 contributionsThursday, August 6, 2026: No contributionsThursday, August 13, 2026: No contributionsThursday, August 20, 2026: No contributionsThursday, August 27, 2026: No contributionsThursday, September 3, 2026: No contributionsThursday, September 10, 2026: 8 contributionsThursday, September 17, 2026: No contributionsThursday, September 24, 2026: No contributionsThursday, October 1, 2026: No contributionsThursday, October 8, 2026: No contributionsThursday, October 15, 2026: No contributionsThursday, October 22, 2026: 5 contributionsThursday, October 29, 2026: No contributionsThursday, November 5, 2026: No contributionsThursday, November 12, 2026: No contributionsThursday, November 19, 2026: No contributionsThursday, November 26, 2026: No contributionsThursday, December 3, 2026: 2 contributionsThursday, December 10, 2026: No contributionsThursday, December 17, 2026: No contributionsThursday, December 24, 2026: No contributionsThursday, December 31, 2026: No contributions
FriFriday, January 2, 2026: No contributionsFriday, January 9, 2026: No contributionsFriday, January 16, 2026: No contributionsFriday, January 23, 2026: No contributionsFriday, January 30, 2026: No contributionsFriday, February 6, 2026: 3 contributionsFriday, February 13, 2026: No contributionsFriday, February 20, 2026: No contributionsFriday, February 27, 2026: No contributionsFriday, March 6, 2026: No contributionsFriday, March 13, 2026: No contributionsFriday, March 20, 2026: No contributionsFriday, March 27, 2026: No contributionsFriday, April 3, 2026: No contributionsFriday, April 10, 2026: No contributionsFriday, April 17, 2026: No contributionsFriday, April 24, 2026: No contributionsFriday, May 1, 2026: 10 contributionsFriday, May 8, 2026: No contributionsFriday, May 15, 2026: No contributionsFriday, May 22, 2026: No contributionsFriday, May 29, 2026: No contributionsFriday, June 5, 2026: No contributionsFriday, June 12, 2026: 7 contributionsFriday, June 19, 2026: No contributionsFriday, June 26, 2026: No contributionsFriday, July 3, 2026: No contributionsFriday, July 10, 2026: No contributionsFriday, July 17, 2026: No contributionsFriday, July 24, 2026: 4 contributionsFriday, July 31, 2026: No contributionsFriday, August 7, 2026: No contributionsFriday, August 14, 2026: No contributionsFriday, August 21, 2026: No contributionsFriday, August 28, 2026: No contributionsFriday, September 4, 2026: 1 contributionFriday, September 11, 2026: No contributionsFriday, September 18, 2026: No contributionsFriday, September 25, 2026: No contributionsFriday, October 2, 2026: No contributionsFriday, October 9, 2026: No contributionsFriday, October 16, 2026: 11 contributionsFriday, October 23, 2026: No contributionsFriday, October 30, 2026: No contributionsFriday, November 6, 2026: No contributionsFriday, November 13, 2026: No contributionsFriday, November 20, 2026: No contributionsFriday, November 27, 2026: 8 contributionsFriday, December 4, 2026: No contributionsFriday, December 11, 2026: No contributionsFriday, December 18, 2026: No contributionsFriday, December 25, 2026: No contributionsFriday, January 1, 2027: No contributions
SatSaturday, January 3, 2026: No contributionsSaturday, January 10, 2026: No contributionsSaturday, January 17, 2026: No contributionsSaturday, January 24, 2026: No contributionsSaturday, January 31, 2026: 9 contributionsSaturday, February 7, 2026: No contributionsSaturday, February 14, 2026: No contributionsSaturday, February 21, 2026: No contributionsSaturday, February 28, 2026: No contributionsSaturday, March 7, 2026: No contributionsSaturday, March 14, 2026: 6 contributionsSaturday, March 21, 2026: No contributionsSaturday, March 28, 2026: No contributionsSaturday, April 4, 2026: No contributionsSaturday, April 11, 2026: No contributionsSaturday, April 18, 2026: No contributionsSaturday, April 25, 2026: 3 contributionsSaturday, May 2, 2026: No contributionsSaturday, May 9, 2026: No contributionsSaturday, May 16, 2026: No contributionsSaturday, May 23, 2026: No contributionsSaturday, May 30, 2026: No contributionsSaturday, June 6, 2026: No contributionsSaturday, June 13, 2026: No contributionsSaturday, June 20, 2026: No contributionsSaturday, June 27, 2026: No contributionsSaturday, July 4, 2026: No contributionsSaturday, July 11, 2026: No contributionsSaturday, July 18, 2026: 10 contributionsSaturday, July 25, 2026: No contributionsSaturday, August 1, 2026: No contributionsSaturday, August 8, 2026: No contributionsSaturday, August 15, 2026: No contributionsSaturday, August 22, 2026: No contributionsSaturday, August 29, 2026: 7 contributionsSaturday, September 5, 2026: No contributionsSaturday, September 12, 2026: No contributionsSaturday, September 19, 2026: No contributionsSaturday, September 26, 2026: No contributionsSaturday, October 3, 2026: No contributionsSaturday, October 10, 2026: 4 contributionsSaturday, October 17, 2026: No contributionsSaturday, October 24, 2026: No contributionsSaturday, October 31, 2026: No contributionsSaturday, November 7, 2026: No contributionsSaturday, November 14, 2026: No contributionsSaturday, November 21, 2026: 1 contributionSaturday, November 28, 2026: No contributionsSaturday, December 5, 2026: No contributionsSaturday, December 12, 2026: No contributionsSaturday, December 19, 2026: No contributionsSaturday, December 26, 2026: No contributionsSaturday, January 2, 2027: No contributions
LessMore

Customize

Data (JSON)
Legend
Tooltips
Year2026

Props

Prop Type Default Description
dataContributionData[][]Days with activity. Each entry is { count, date, level }, where date is a local YYYY-MM-DD key and level is the intensity bucket. Days missing from the array are rendered empty; entries outside year are ignored.
yearnumbercurrent yearCalendar year to lay out. The grid always starts on the Sunday on or before January 1st, so the first and last columns can include a few days from the neighbouring year.
showTooltipsbooleantrueShow the date-and-count bubble on hover and on keyboard focus. It is pointer-events-none and aria-hidden, so it never intercepts the pointer or duplicates the screen-reader text.
showLegendbooleantrueRender the five-swatch Less → More legend under the grid.
classstring-Merged onto the root wrapper, which is relative w-fit max-w-full.

Accessibility

The graph is a <table> with a visually hidden caption naming the year. Months are <th scope="col"> and weekdays are <th scope="row">, so the grid can be navigated cell by cell with the table commands a screen reader already knows.

Every day with activity is focusable and contains a visually hidden label such as Monday, January 5, 2026: 3 contributions. Days with no activity are skipped in the tab order, so a full year does not become 365 stops. The colour blocks themselves are aria-hidden; all information is in the text.

The tooltip repeats the same date and count visually, but it is decorative: it is aria-hidden and never receives focus. prefers-reduced-motion removes the scale and slide, leaving the bubble to appear without movement.

Performance

  • The year is resolved once into 53 × 7 day objects in a computed value. Changing data or year rebuilds that array; hovering does not.
  • Each day is a <td> plus one inner block. The five level classes are static strings, so a tooltip opening only mutates the tooltip, never the grid.
  • Tooltip position is written from the pointer or focus event directly to a fixed element — no measuring pass, no scroll listener and no layout read in a render.
  • AnimatePresence mounts one tooltip at a time, and the enter/exit transition is limited to opacity, scale and y, all compositor-friendly properties.
Copyright © 2026