Skip to content

Recipes

Data

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<script setup lang="ts">
const data = {
  '2025-01-14': 3,
  '2025-01-15': 7,
  '2025-03-22': 1,
}
</script>
<template>
  <CalendarHeatmap :data="data" />
</template>

Array of { date, value }

vue
<script setup lang="ts">
import type { HeatmapDataArray } from 'vue-calendar-activity'

const data: HeatmapDataArray = [
  { date: '2025-01-14', value: 3 },
  { date: '2025-01-15', value: 7 },
]
</script>
<template>
  <CalendarHeatmap :data="data" />
</template>

Date Range

Range presets

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" range="year" />
<CalendarHeatmap :data="data" range="6months" />
<CalendarHeatmap :data="data" range="3months" />
<CalendarHeatmap :data="data" range="month" />

Custom start / end dates

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap
  :data="data"
  start-date="2025-01-01"
  end-date="2025-06-30"
/>

Colors

Built-in color presets

Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<!-- github (default), blue, orange, red, purple, teal -->
<CalendarHeatmap :data="data" color-preset="blue" />
<CalendarHeatmap :data="data" color-preset="purple" />
<CalendarHeatmap :data="data" color-preset="teal" />

Auto-palette from one target color

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" color-to="#0ea5e9" />

Gradient scale

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap
  :data="data"
  scale-mode="gradient"
  color-from="#fef9c3"
  color-to="#854d0e"
/>

Explicit colors per level

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<!-- index 0 = empty day -->
<CalendarHeatmap
  :data="data"
  :colors="['#f1f5f9', '#bae6fd', '#38bdf8', '#0284c7', '#0c4a6e']"
/>

Custom empty (level 0) color

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" color-preset="blue" empty-color="#f8fafc" />

More / fewer levels

Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" :levels="3" />
<CalendarHeatmap :data="data" :levels="8" />

Layout & Style

Vertical orientation

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" orientation="vertical" range="3months" />

Cell size and gap

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" :cell-size="16" :cell-gap="4" />

Circle cells (Duolingo-style)

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" :cell-size="14" :cell-gap="4" :cell-radius="50" />

Dark theme

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" theme="dark" />

Minimal — no labels, no legend

vue
<CalendarHeatmap
  :data="data"
  :show-months="false"
  :show-weekdays="false"
  :show-legend="false"
  :tooltip-enabled="false"
/>

Week starts on Sunday

Sun
Mon
Tue
Wed
Thu
Fri
Sat
vue
<CalendarHeatmap :data="data" :week-start="0" />

Locale

Built-in Russian locale

Пн
Вт
Ср
Чт
Пт
Сб
Вс
vue
<CalendarHeatmap :data="data" locale="ru" />

Custom locale (French)

Lun
Mar
Mer
Jeu
Ven
Sam
Dim
vue
<script setup lang="ts">
import type { HeatmapLocale } from 'vue-calendar-activity'

const locale: HeatmapLocale = {
  monthsShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
                'Jul','Aoû','Sep','Oct','Nov','Déc'],
  weekdaysShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
  noDataLabel: 'Aucune activité',
  on: 'le',
}
</script>
<template>
  <CalendarHeatmap :data="data" :locale="locale" :week-start="1" />
</template>

Custom date format in tooltip

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<!-- tokens: YYYY, MM, DD -->
<CalendarHeatmap :data="data" date-format="DD.MM.YYYY" />

Interaction

Click to select a day

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { HeatmapDay } from 'vue-calendar-activity'

const selected = ref<HeatmapDay | null>(null)
</script>
<template>
  <CalendarHeatmap :data="data" @cell-click="(day) => selected = day" />
  <p v-if="selected">{{ selected.date }} — {{ selected.value }}</p>
</template>

Reactive / live-updating data

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<script setup lang="ts">
import { ref } from 'vue'

const data = ref<Record<string, number>>({})

function addToday() {
  const today = new Date().toISOString().slice(0, 10)
  data.value = { ...data.value, [today]: (data.value[today] ?? 0) + 1 }
}
</script>
<template>
  <CalendarHeatmap :data="data" />
  <button @click="addToday">+1 today</button>
</template>

Tooltip

Custom tooltip text (prop)

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<script setup lang="ts">
import type { HeatmapDay } from 'vue-calendar-activity'

function formatter(day: HeatmapDay): string {
  if (day.value === 0) return `No commits on ${day.date}`
  return `${day.value} commit${day.value !== 1 ? 's' : ''} on ${day.date}`
}
</script>
<template>
  <CalendarHeatmap :data="data" :tooltip-formatter="formatter" />
</template>

Custom tooltip slot (full HTML)

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data">
  <template #tooltip="{ day }">
    <div style="text-align:center">
      <strong>{{ day.date }}</strong><br />
      <span>{{ day.value }} commits</span>
    </div>
  </template>
</CalendarHeatmap>

Today Highlight

Default (ring)

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" today />

Both styles

Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<!-- ring — inset border -->
<CalendarHeatmap :data="data" :today="{ style: 'ring', color: '#0969da', size: 2 }" />

<!-- fill — overrides heat color -->
<CalendarHeatmap :data="data" :today="{ style: 'fill', color: '#0969da' }" />

Custom color

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" :today="{ style: 'ring', color: '#f97316', size: 2 }" />

Legend

Legend with label

Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<CalendarHeatmap :data="data" :show-legend="true" legend-label="Commits" />

Scale

Shared max value across multiple charts

Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun
vue
<!-- both charts use the same scale -->
<CalendarHeatmap :data="teamA" :max-value="100" legend-label="Team A" />
<CalendarHeatmap :data="teamB" :max-value="100" legend-label="Team B" />