Gantt Timeline and Zoom
The Gantt timeline can be configured at two levels:
zoomPresetfor fast setup with built-in levels.zoomfor full control over levels, wheel behavior, and anchor strategy.
Source code
---import GanttScheduling from './GanttScheduling.vue';---
<GanttScheduling client:only="vue" />import { defineCustomElements } from '@revolist/revogrid/loader';defineCustomElements();
import { GanttPlugin, createDefaultTaskTableColumn } from '@revolist/revogrid-enterprise';import type { TaskEntity, DependencyEntity, CalendarEntity } from '@revolist/revogrid-enterprise';import { currentTheme } from '../composables/useRandomData';
const { isDark } = currentTheme();
const PROJECT_ID = 'project-web-redesign';const CALENDAR_ID = 'cal-us';
// Calendar-aware scheduling: durations are in working days (Mon–Fri, excluding holidays)const ganttConfig = { id: PROJECT_ID, name: 'Website Redesign', version: '1', currency: 'USD', timeZone: 'America/New_York', primaryCalendarId: CALENDAR_ID, updatedAt: '2026-04-06T00:00:00Z', zoomPreset: 'week' as const, scheduling: { excludeHolidaysFromDuration: true, // durations skip weekends and holidays }, visuals: { shadeNonWorkingTime: true, // shade weekend columns on the timeline projectLineDate: '2026-04-06', // vertical status-date line },};
// US calendar with public holidaysconst calendars: CalendarEntity[] = [ { id: CALENDAR_ID, name: 'US Standard', timeZone: 'America/New_York', workingDays: [1, 2, 3, 4, 5], // Mon–Fri holidays: [ '2026-05-25', // Memorial Day '2026-07-04', // Independence Day ], hoursPerDay: 8, },];
const tasks: TaskEntity[] = [ { id: 't1', projectId: PROJECT_ID, parentId: null, wbsCode: '1', name: 'Design', type: 'summary', status: 'in-progress', startDate: '2026-04-06', endDate: '2026-04-24', durationDays: 15, progressPercent: 60, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't2', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.1', name: 'Wireframes', type: 'task', status: 'done', startDate: '2026-04-06', endDate: '2026-04-10', durationDays: 5, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't3', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.2', name: 'Design Review', type: 'milestone', status: 'done', startDate: '2026-04-10', endDate: '2026-04-10', durationDays: 0, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], }, { id: 't4', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.3', name: 'Visual Design', type: 'task', status: 'in-progress', startDate: '2026-04-13', endDate: '2026-04-24', durationDays: 10, progressPercent: 40, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't5', projectId: PROJECT_ID, parentId: null, wbsCode: '2', name: 'Development', type: 'summary', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: false, tags: [], }, { id: 't6', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.1', name: 'Frontend', type: 'task', status: 'not-started', // constraint: cannot start before May 4 (waiting on external API) startDate: '2026-05-04', endDate: '2026-05-20', durationDays: 13, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], constraintType: 'start-no-earlier-than', constraintDate: '2026-05-04', }, { id: 't7', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.2', name: 'Backend', type: 'task', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], deadlineDate: '2026-05-22', // deadline marker — project expects early delivery }, { id: 't8', projectId: PROJECT_ID, parentId: null, wbsCode: '3', name: 'Launch', type: 'milestone', status: 'not-started', startDate: '2026-05-28', endDate: '2026-05-28', durationDays: 0, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], },];
const dependencies: DependencyEntity[] = [ { id: 'd1', predecessorTaskId: 't2', successorTaskId: 't3', type: 'finish-to-start', lagDays: 0 }, { id: 'd2', predecessorTaskId: 't3', successorTaskId: 't4', type: 'finish-to-start', lagDays: 1 }, { id: 'd3', predecessorTaskId: 't4', successorTaskId: 't6', type: 'finish-to-start', lagDays: 1 }, { id: 'd4', predecessorTaskId: 't4', successorTaskId: 't7', type: 'finish-to-start', lagDays: 1 }, { id: 'd5', predecessorTaskId: 't6', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 }, { id: 'd6', predecessorTaskId: 't7', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 },];
export function load(parentSelector: string) { const grid = document.createElement('revo-grid');
grid.theme = isDark() ? 'darkCompact' : 'compact'; grid.hideAttribution = true; grid.plugins = [GanttPlugin]; grid.gantt = ganttConfig; grid.ganttCalendars = calendars; grid.ganttDependencies = dependencies; grid.source = tasks; grid.columns = [ createDefaultTaskTableColumn('wbs'), createDefaultTaskTableColumn('name'), createDefaultTaskTableColumn('startDate'), createDefaultTaskTableColumn('endDate'), createDefaultTaskTableColumn('duration'), createDefaultTaskTableColumn('percentDone'), ];
document.querySelector(parentSelector)?.appendChild(grid);}<template> <RevoGrid hide-attribution style="height: 500px" :theme="isDark ? 'darkCompact' : 'compact'" :plugins="plugins" :source="tasks" :columns="columns" :gantt.prop="ganttConfig" :gantt-dependencies.prop="dependencies" :gantt-calendars.prop="calendars" /></template>
<script setup lang="ts">import { ref } from 'vue';import RevoGrid from '@revolist/vue3-datagrid';import { GanttPlugin, createDefaultTaskTableColumn } from '@revolist/revogrid-enterprise';import type { TaskEntity, DependencyEntity, CalendarEntity } from '@revolist/revogrid-enterprise';import { currentThemeVue } from '../composables/useRandomData';
const { isDark } = currentThemeVue();
const PROJECT_ID = 'project-web-redesign';const CALENDAR_ID = 'cal-us';
const plugins = ref([GanttPlugin]);
const ganttConfig = ref({ id: PROJECT_ID, name: 'Website Redesign', version: '1', currency: 'USD', timeZone: 'America/New_York', primaryCalendarId: CALENDAR_ID, updatedAt: '2026-04-06T00:00:00Z', zoomPreset: 'week' as const, scheduling: { excludeHolidaysFromDuration: true, }, visuals: { shadeNonWorkingTime: true, projectLineDate: '2026-04-06', },});
const calendars = ref<CalendarEntity[]>([ { id: CALENDAR_ID, name: 'US Standard', timeZone: 'America/New_York', workingDays: [1, 2, 3, 4, 5], holidays: ['2026-05-25', '2026-07-04'], hoursPerDay: 8, },]);
const tasks = ref<TaskEntity[]>([ { id: 't1', projectId: PROJECT_ID, parentId: null, wbsCode: '1', name: 'Design', type: 'summary', status: 'in-progress', startDate: '2026-04-06', endDate: '2026-04-24', durationDays: 15, progressPercent: 60, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't2', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.1', name: 'Wireframes', type: 'task', status: 'done', startDate: '2026-04-06', endDate: '2026-04-10', durationDays: 5, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't3', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.2', name: 'Design Review', type: 'milestone', status: 'done', startDate: '2026-04-10', endDate: '2026-04-10', durationDays: 0, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], }, { id: 't4', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.3', name: 'Visual Design', type: 'task', status: 'in-progress', startDate: '2026-04-13', endDate: '2026-04-24', durationDays: 10, progressPercent: 40, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't5', projectId: PROJECT_ID, parentId: null, wbsCode: '2', name: 'Development', type: 'summary', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: false, tags: [], }, { id: 't6', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.1', name: 'Frontend', type: 'task', status: 'not-started', startDate: '2026-05-04', endDate: '2026-05-20', durationDays: 13, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], constraintType: 'start-no-earlier-than', constraintDate: '2026-05-04', }, { id: 't7', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.2', name: 'Backend', type: 'task', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], deadlineDate: '2026-05-22', }, { id: 't8', projectId: PROJECT_ID, parentId: null, wbsCode: '3', name: 'Launch', type: 'milestone', status: 'not-started', startDate: '2026-05-28', endDate: '2026-05-28', durationDays: 0, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], },]);
const dependencies = ref<DependencyEntity[]>([ { id: 'd1', predecessorTaskId: 't2', successorTaskId: 't3', type: 'finish-to-start', lagDays: 0 }, { id: 'd2', predecessorTaskId: 't3', successorTaskId: 't4', type: 'finish-to-start', lagDays: 1 }, { id: 'd3', predecessorTaskId: 't4', successorTaskId: 't6', type: 'finish-to-start', lagDays: 1 }, { id: 'd4', predecessorTaskId: 't4', successorTaskId: 't7', type: 'finish-to-start', lagDays: 1 }, { id: 'd5', predecessorTaskId: 't6', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 }, { id: 'd6', predecessorTaskId: 't7', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 },]);
const columns = ref([ createDefaultTaskTableColumn('wbs'), createDefaultTaskTableColumn('name'), createDefaultTaskTableColumn('startDate'), createDefaultTaskTableColumn('endDate'), createDefaultTaskTableColumn('duration'), createDefaultTaskTableColumn('percentDone'),]);</script>import React, { useMemo } from 'react';import { RevoGrid } from '@revolist/react-datagrid';import { GanttPlugin, createDefaultTaskTableColumn } from '@revolist/revogrid-enterprise';import type { TaskEntity, DependencyEntity, CalendarEntity } from '@revolist/revogrid-enterprise';import { currentTheme } from '../composables/useRandomData';
const { isDark } = currentTheme();
const PROJECT_ID = 'project-web-redesign';const CALENDAR_ID = 'cal-us';
const tasks: TaskEntity[] = [ { id: 't1', projectId: PROJECT_ID, parentId: null, wbsCode: '1', name: 'Design', type: 'summary', status: 'in-progress', startDate: '2026-04-06', endDate: '2026-04-24', durationDays: 15, progressPercent: 60, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't2', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.1', name: 'Wireframes', type: 'task', status: 'done', startDate: '2026-04-06', endDate: '2026-04-10', durationDays: 5, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't3', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.2', name: 'Design Review', type: 'milestone', status: 'done', startDate: '2026-04-10', endDate: '2026-04-10', durationDays: 0, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], }, { id: 't4', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.3', name: 'Visual Design', type: 'task', status: 'in-progress', startDate: '2026-04-13', endDate: '2026-04-24', durationDays: 10, progressPercent: 40, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't5', projectId: PROJECT_ID, parentId: null, wbsCode: '2', name: 'Development', type: 'summary', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: false, tags: [], }, { id: 't6', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.1', name: 'Frontend', type: 'task', status: 'not-started', startDate: '2026-05-04', endDate: '2026-05-20', durationDays: 13, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], constraintType: 'start-no-earlier-than', constraintDate: '2026-05-04', }, { id: 't7', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.2', name: 'Backend', type: 'task', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], deadlineDate: '2026-05-22', }, { id: 't8', projectId: PROJECT_ID, parentId: null, wbsCode: '3', name: 'Launch', type: 'milestone', status: 'not-started', startDate: '2026-05-28', endDate: '2026-05-28', durationDays: 0, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], },];
const dependencies: DependencyEntity[] = [ { id: 'd1', predecessorTaskId: 't2', successorTaskId: 't3', type: 'finish-to-start', lagDays: 0 }, { id: 'd2', predecessorTaskId: 't3', successorTaskId: 't4', type: 'finish-to-start', lagDays: 1 }, { id: 'd3', predecessorTaskId: 't4', successorTaskId: 't6', type: 'finish-to-start', lagDays: 1 }, { id: 'd4', predecessorTaskId: 't4', successorTaskId: 't7', type: 'finish-to-start', lagDays: 1 }, { id: 'd5', predecessorTaskId: 't6', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 }, { id: 'd6', predecessorTaskId: 't7', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 },];
const calendars: CalendarEntity[] = [ { id: CALENDAR_ID, name: 'US Standard', timeZone: 'America/New_York', workingDays: [1, 2, 3, 4, 5], holidays: ['2026-05-25', '2026-07-04'], hoursPerDay: 8, },];
function GanttScheduling() { const ganttConfig = useMemo(() => ({ id: PROJECT_ID, name: 'Website Redesign', version: '1', currency: 'USD', timeZone: 'America/New_York', primaryCalendarId: CALENDAR_ID, updatedAt: '2026-04-06T00:00:00Z', zoomPreset: 'week' as const, scheduling: { excludeHolidaysFromDuration: true, }, visuals: { shadeNonWorkingTime: true, projectLineDate: '2026-04-06', }, }), []);
const columns = useMemo(() => [ createDefaultTaskTableColumn('wbs'), createDefaultTaskTableColumn('name'), createDefaultTaskTableColumn('startDate'), createDefaultTaskTableColumn('endDate'), createDefaultTaskTableColumn('duration'), createDefaultTaskTableColumn('percentDone'), ], []);
return ( <RevoGrid style={{ height: '500px' }} theme={isDark() ? 'darkCompact' : 'compact'} hideAttribution plugins={[GanttPlugin]} source={tasks} columns={columns} gantt={ganttConfig} ganttDependencies={dependencies} ganttCalendars={calendars} /> );}
export default GanttScheduling;import { Component, NO_ERRORS_SCHEMA, ViewEncapsulation } from '@angular/core';import { RevoGrid } from '@revolist/angular-datagrid';import { GanttPlugin, createDefaultTaskTableColumn } from '@revolist/revogrid-enterprise';import type { TaskEntity, DependencyEntity, CalendarEntity } from '@revolist/revogrid-enterprise';import { currentTheme } from '../composables/useRandomData';
const PROJECT_ID = 'project-web-redesign';const CALENDAR_ID = 'cal-us';
@Component({ selector: 'gantt-scheduling', standalone: true, imports: [RevoGrid], schemas: [NO_ERRORS_SCHEMA], template: ` <revo-grid style="height: 500px" [theme]="theme" [hideAttribution]="true" [plugins]="plugins" [source]="tasks" [columns]="columns" [gantt]="ganttConfig" [ganttDependencies]="dependencies" [ganttCalendars]="calendars" ></revo-grid> `, encapsulation: ViewEncapsulation.None,})export class GanttSchedulingComponent { theme = currentTheme().isDark() ? 'darkCompact' : 'compact'; plugins = [GanttPlugin];
ganttConfig = { id: PROJECT_ID, name: 'Website Redesign', version: '1', currency: 'USD', timeZone: 'America/New_York', primaryCalendarId: CALENDAR_ID, updatedAt: '2026-04-06T00:00:00Z', zoomPreset: 'week' as const, scheduling: { excludeHolidaysFromDuration: true, }, visuals: { shadeNonWorkingTime: true, projectLineDate: '2026-04-06', }, };
calendars: CalendarEntity[] = [ { id: CALENDAR_ID, name: 'US Standard', timeZone: 'America/New_York', workingDays: [1, 2, 3, 4, 5], holidays: ['2026-05-25', '2026-07-04'], hoursPerDay: 8, }, ];
tasks: TaskEntity[] = [ { id: 't1', projectId: PROJECT_ID, parentId: null, wbsCode: '1', name: 'Design', type: 'summary', status: 'in-progress', startDate: '2026-04-06', endDate: '2026-04-24', durationDays: 15, progressPercent: 60, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't2', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.1', name: 'Wireframes', type: 'task', status: 'done', startDate: '2026-04-06', endDate: '2026-04-10', durationDays: 5, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't3', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.2', name: 'Design Review', type: 'milestone', status: 'done', startDate: '2026-04-10', endDate: '2026-04-10', durationDays: 0, progressPercent: 100, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], }, { id: 't4', projectId: PROJECT_ID, parentId: 't1', wbsCode: '1.3', name: 'Visual Design', type: 'task', status: 'in-progress', startDate: '2026-04-13', endDate: '2026-04-24', durationDays: 10, progressPercent: 40, calendarId: CALENDAR_ID, isCritical: true, tags: [], }, { id: 't5', projectId: PROJECT_ID, parentId: null, wbsCode: '2', name: 'Development', type: 'summary', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: false, tags: [], }, { id: 't6', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.1', name: 'Frontend', type: 'task', status: 'not-started', startDate: '2026-05-04', endDate: '2026-05-20', durationDays: 13, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], constraintType: 'start-no-earlier-than', constraintDate: '2026-05-04', }, { id: 't7', projectId: PROJECT_ID, parentId: 't5', wbsCode: '2.2', name: 'Backend', type: 'task', status: 'not-started', startDate: '2026-04-27', endDate: '2026-05-28', durationDays: 24, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: [], deadlineDate: '2026-05-22', }, { id: 't8', projectId: PROJECT_ID, parentId: null, wbsCode: '3', name: 'Launch', type: 'milestone', status: 'not-started', startDate: '2026-05-28', endDate: '2026-05-28', durationDays: 0, progressPercent: 0, calendarId: CALENDAR_ID, isCritical: true, tags: ['milestone'], }, ];
dependencies: DependencyEntity[] = [ { id: 'd1', predecessorTaskId: 't2', successorTaskId: 't3', type: 'finish-to-start', lagDays: 0 }, { id: 'd2', predecessorTaskId: 't3', successorTaskId: 't4', type: 'finish-to-start', lagDays: 1 }, { id: 'd3', predecessorTaskId: 't4', successorTaskId: 't6', type: 'finish-to-start', lagDays: 1 }, { id: 'd4', predecessorTaskId: 't4', successorTaskId: 't7', type: 'finish-to-start', lagDays: 1 }, { id: 'd5', predecessorTaskId: 't6', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 }, { id: 'd6', predecessorTaskId: 't7', successorTaskId: 't8', type: 'finish-to-start', lagDays: 0 }, ];
columns = [ createDefaultTaskTableColumn('wbs'), createDefaultTaskTableColumn('name'), createDefaultTaskTableColumn('startDate'), createDefaultTaskTableColumn('endDate'), createDefaultTaskTableColumn('duration'), createDefaultTaskTableColumn('percentDone'), ];}Quick Start with zoomPreset
Section titled “Quick Start with zoomPreset”Use a built-in preset when you only need a standard timeline scale:
grid.gantt = { // ...required project fields zoomPreset: 'week-month',};Supported presets:
'day-week''week-month''month-quarter''quarter-year''year-quarter''multi-year-quarter'
Full Zoom Configuration
Section titled “Full Zoom Configuration”Use zoom when you need custom levels, min/max bounds, locale, or wheel interaction rules.
grid.gantt = { // ...required project fields zoomPreset: 'week-month', zoom: { enabled: true, defaultLevelId: 'week-month', minLevelId: 'day-week', maxLevelId: 'quarter-year', locale: 'en-US', zoomAnchorMode: 'pointer', wheelZoomEnabled: true, wheelZoomTrigger: 'ctrlKey', wheelZoomMode: 'discrete', invertWheelDirection: false, },};Custom Zoom Levels
Section titled “Custom Zoom Levels”You can define your own zoom.levels list from finest to coarsest.
grid.gantt = { // ...required project fields zoom: { levels: [ { id: 'day-week', label: 'Day / Week', tickUnit: 'day', tickWidth: 56, headerRows: [ { id: 'week', unit: 'week' }, { id: 'day', unit: 'day' }, ], }, { id: 'week-month', label: 'Week / Month', tickUnit: 'week', tickWidth: 84, headerRows: [ { id: 'month', unit: 'month' }, { id: 'week', unit: 'week' }, ], }, { id: 'month-quarter', label: 'Month / Quarter', tickUnit: 'month', tickWidth: 120, headerRows: [ { id: 'year', unit: 'year' }, { id: 'month', unit: 'month' }, ], }, ], defaultLevelId: 'week-month', },};Wheel Zoom Options
Section titled “Wheel Zoom Options”Control whether users can zoom with the mouse wheel and which modifier key is required.
grid.gantt = { // ...required project fields zoom: { wheelZoomEnabled: true, wheelZoomTrigger: 'metaKey', // macOS Cmd key wheelZoomMode: 'smooth-discrete', invertWheelDirection: false, },};Available wheelZoomTrigger values:
'ctrlKey''metaKey''altKey''shiftKey''none'
Anchor Behavior During Zoom
Section titled “Anchor Behavior During Zoom”zoomAnchorMode controls which point in the viewport stays stable when switching levels:
'pointer': keeps the date under the mouse pointer fixed.'center': keeps the center date fixed.'start': keeps the left edge date fixed.
grid.gantt = { // ...required project fields zoom: { zoomAnchorMode: 'center', },};Timeline Overlays
Section titled “Timeline Overlays”Timeline visuals are configured in visuals.
grid.gantt = { // ...required project fields visuals: { projectLineDate: '2026-04-06', timeRanges: [ { id: 'sprint-1', startDate: '2026-04-06', endDate: '2026-04-17', label: 'Sprint 1', color: '#5B8DEF', }, { id: 'freeze', startDate: '2026-05-18', endDate: '2026-05-22', label: 'Code Freeze', color: '#F59E0B', }, ], shadeNonWorkingTime: true, },};