<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>React Gantt - A Super Fast Gantt Chart For React Apps Blog</title>
        <link>https://www.react-gantt.com/content/</link>
        <description>React Gantt - A Super Fast Gantt Chart For React Apps Blog</description>
        <lastBuildDate>Mon, 18 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Best Angular calendar components]]></title>
            <link>https://www.react-gantt.com/content/best-angular-calendar-components/</link>
            <guid>https://www.react-gantt.com/content/best-angular-calendar-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When choosing a calendar component for an Angular application, it helps to know where each library stops.]]></description>
            <content:encoded><![CDATA[<p>When choosing a calendar component for an Angular application, it helps to know where each library stops. A calendar component in this article means an appointment calendar with day, week, and month views where users create, edit, and move events. That is a different problem from selecting a date in a form. For a framework-agnostic perspective, our article on the <a href="https://bryntum.com/blog/best-javascript-calendar-components/" target="_blank" rel="noopener noreferrer" class="">best JavaScript calendar components</a> covers more options.</p>
<p>This article compares five Angular calendar options using the criteria below.</p>
<ul>
<li class="">Installation and Angular integration.</li>
<li class="">Resource scheduling and recurring events.</li>
<li class="">Pricing and license tiers.</li>
<li class="">Trade-offs that matter before production use.</li>
<li class="">When Bryntum Calendar is the better fit.</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar">Bryntum Calendar<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#bryntum-calendar" class="hash-link" aria-label="Direct link to Bryntum Calendar" title="Direct link to Bryntum Calendar" translate="no">​</a></h2>
<p>Bryntum Calendar is a full-featured scheduling component built by Bryntum. It ships a dedicated Angular wrapper, so it fits naturally into Angular projects without manual DOM manipulation. The <a href="https://bryntum.com/products/calendar/docs/guide/Calendar/gettingstarted/api/integration-angular" target="_blank" rel="noopener noreferrer" class="">Bryntum Calendar Angular quick start</a> covers the full setup path.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Calendar showing a week view with color-coded events" src="https://www.react-gantt.com/assets/images/bryntum-calendar-70dce206121152f0d903196195e93e01.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-setup-with-angular">Bryntum Calendar setup with Angular<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#bryntum-calendar-setup-with-angular" class="hash-link" aria-label="Direct link to Bryntum Calendar setup with Angular" title="Direct link to Bryntum Calendar setup with Angular" translate="no">​</a></h3>
<p>Bryntum packages are hosted on a private npm registry, so authentication is required before installing. Once authenticated, install the trial package and the Angular wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar@npm:@bryntum/calendar-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar-angular@7.3.0</span><br></div></code></pre></div></div>
<p>Add the required stylesheets to <code>angular.json</code>. The order matters: Font Awesome base styles must come before the icon variant, and the theme file must come after the core calendar stylesheet.</p>
<div class="language-json codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-json codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token property">"styles"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/calendar/fontawesome/css/fontawesome.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/calendar/fontawesome/css/solid.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/calendar/calendar.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/calendar/svalbard-light.css"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><br></div></code></pre></div></div>
<p>Import <code>BryntumCalendarModule</code> in your app module:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">NgModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/platform-browser'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumCalendarModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">AppComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    declarations </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    imports      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BrowserModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">BryntumCalendarModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    bootstrap    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Then create a calendar component. All configuration goes through a single <code>CalendarConfig</code> object, which keeps the template clean:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">CalendarConfig</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;bryntum-calendar [config]="calendarConfig"&gt;&lt;/bryntum-calendar&gt;'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    styles   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">':host { display: block; height: 100vh; }'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">CalendarComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    calendarConfig</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Partial</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token maybe-class-name">CalendarConfig</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        date      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bryntum team'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hotel Park'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'michael'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Michael Johnson'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'deep-orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hackathon 2025'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                       startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-11T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-18T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> allDay </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'green'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Breakfast'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                            startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team Scrum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                           startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Scheduler Grid introduction + review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-gives-angular-apps-built-in-resource-scheduling">Bryntum Calendar gives Angular apps built-in resource scheduling<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#bryntum-calendar-gives-angular-apps-built-in-resource-scheduling" class="hash-link" aria-label="Direct link to Bryntum Calendar gives Angular apps built-in resource scheduling" title="Direct link to Bryntum Calendar gives Angular apps built-in resource scheduling" translate="no">​</a></h3>
<p>Bryntum Calendar covers a full set of scheduling features.</p>
<ul>
<li class=""><strong>Day, week, month, year, and agenda views</strong> available out of the box without plugins.</li>
<li class=""><strong>RFC 5545 RRULE recurring events</strong> so patterns like "every weekday" or "last Friday of the month" work without custom logic.</li>
<li class=""><strong>Drag-and-drop</strong> for both moving and resizing events.</li>
<li class=""><strong>Resource calendar view</strong> to display multiple calendars side by side, each with its own color.</li>
<li class=""><strong>Event editor dialog</strong> for create and edit flows with built-in validation.</li>
<li class=""><strong>Ten built-in themes</strong>, including dark mode variants.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-starts-with-a-small-team-license">Bryntum Calendar starts with a Small Team license<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#bryntum-calendar-starts-with-a-small-team-license" class="hash-link" aria-label="Direct link to Bryntum Calendar starts with a Small Team license" title="Direct link to Bryntum Calendar starts with a Small Team license" translate="no">​</a></h3>
<p>Bryntum Calendar costs $680 per developer for the <strong>Small Team</strong> license, with a three-developer minimum and 12 months of updates. A free trial is available without a time limit, though a watermark appears.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-brings-resource-recurrence-and-editing-features-to-angular">Bryntum Calendar brings resource, recurrence, and editing features to Angular<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#bryntum-calendar-brings-resource-recurrence-and-editing-features-to-angular" class="hash-link" aria-label="Direct link to Bryntum Calendar brings resource, recurrence, and editing features to Angular" title="Direct link to Bryntum Calendar brings resource, recurrence, and editing features to Angular" translate="no">​</a></h3>
<p>Bryntum Calendar stands out in five areas.</p>
<ul>
<li class="">Native Angular wrapper with a fully typed configuration API.</li>
<li class="">RFC 5545 RRULE support for complex recurring event patterns.</li>
<li class="">Resource calendar included at no extra cost.</li>
<li class="">Ten themes, including dark mode, with the ability to create custom themes.</li>
<li class="">Active support team and detailed documentation.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-adds-cost-and-setup-rules-to-angular">Bryntum Calendar adds cost and setup rules to Angular<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#bryntum-calendar-adds-cost-and-setup-rules-to-angular" class="hash-link" aria-label="Direct link to Bryntum Calendar adds cost and setup rules to Angular" title="Direct link to Bryntum Calendar adds cost and setup rules to Angular" translate="no">​</a></h3>
<p>Two limitations apply when evaluating Bryntum Calendar.</p>
<ul>
<li class="">Commercial license required for production use.</li>
<li class="">The private npm registry adds a one-time authentication step during setup.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar">FullCalendar<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#fullcalendar" class="hash-link" aria-label="Direct link to FullCalendar" title="Direct link to FullCalendar" translate="no">​</a></h2>
<p>FullCalendar is one of the most widely used open-source calendar libraries across the JavaScript ecosystem. Its Angular package wraps the core library in a component that accepts a configuration object.</p>
<p><img decoding="async" loading="lazy" alt="FullCalendar showing a month view with events" src="https://www.react-gantt.com/assets/images/fullcalendar-df057831af5c203a5d79b5eb0dbe34a6.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-setup-with-angular-plugins">FullCalendar setup with Angular plugins<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#fullcalendar-setup-with-angular-plugins" class="hash-link" aria-label="Direct link to FullCalendar setup with Angular plugins" title="Direct link to FullCalendar setup with Angular plugins" translate="no">​</a></h3>
<p>Install the Angular package along with the plugins you need:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @fullcalendar/angular @fullcalendar/core @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/list @fullcalendar/interaction @fullcalendar/rrule</span><br></div></code></pre></div></div>
<p>Add <code>FullCalendarModule</code> to your app module imports:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">FullCalendarModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// add to imports array</span><br></div></code></pre></div></div>
<p>Configure the calendar in your component:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">CalendarOptions</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">dayGridPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/daygrid'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">timeGridPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/timegrid'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">listPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/list'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">interactionPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/interaction'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">rrulePlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/rrule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;full-calendar [options]="calendarOptions"&gt;&lt;/full-calendar&gt;'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">CalendarComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    calendarOptions</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">CalendarOptions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        plugins      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">dayGridPlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> timeGridPlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> listPlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> interactionPlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> rrulePlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        initialView  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dayGridMonth'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        headerToolbar </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> left </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'prev,next today'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> center </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'title'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> right </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dayGridMonth,timeGridWeek,listWeek'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        editable   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        selectable </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> rrule </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> freq </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'weekly'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> byweekday </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'mo'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token string" style="color:rgb(206, 145, 120)">'tu'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token string" style="color:rgb(206, 145, 120)">'we'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token string" style="color:rgb(206, 145, 120)">'th'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token string" style="color:rgb(206, 145, 120)">'fr'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dtstart </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15T09:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'00:30'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T15:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-keeps-standard-angular-calendars-free">FullCalendar keeps standard Angular calendars free<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#fullcalendar-keeps-standard-angular-calendars-free" class="hash-link" aria-label="Direct link to FullCalendar keeps standard Angular calendars free" title="Direct link to FullCalendar keeps standard Angular calendars free" translate="no">​</a></h3>
<p>FullCalendar covers day, week, month, and list views through its plugin system. Recurring events are handled via the <code>@fullcalendar/rrule</code> plugin, which follows the iCalendar RRULE format. Drag-and-drop and resize are provided by the <code>@fullcalendar/interaction</code> plugin. Resource views, which display events grouped by person, room, or asset, require the <strong>Premium</strong> package. Dark mode is not built in but can be achieved with custom CSS overrides.</p>
<p>FullCalendar works well for standard Angular calendars, but Bryntum Calendar is the better fit once resource scheduling becomes part of the product instead of a paid add-on.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-resource-views-require-a-paid-add-on">FullCalendar resource views require a paid add-on<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#fullcalendar-resource-views-require-a-paid-add-on" class="hash-link" aria-label="Direct link to FullCalendar resource views require a paid add-on" title="Direct link to FullCalendar resource views require a paid add-on" translate="no">​</a></h3>
<p>The core FullCalendar library is MIT-licensed and free for all projects. The <strong>Premium</strong> package, which adds resource timeline and resource grid views, starts at $480 per year.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-suits-angular-teams-that-need-a-mature-free-core">FullCalendar suits Angular teams that need a mature free core<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#fullcalendar-suits-angular-teams-that-need-a-mature-free-core" class="hash-link" aria-label="Direct link to FullCalendar suits Angular teams that need a mature free core" title="Direct link to FullCalendar suits Angular teams that need a mature free core" translate="no">​</a></h3>
<p>FullCalendar has four clear advantages.</p>
<ul>
<li class="">MIT license for the core library with no cost for most use cases.</li>
<li class="">Large community and extensive documentation.</li>
<li class="">Plugin architecture keeps the bundle lean when only specific features are needed.</li>
<li class="">Angular integration follows standard Angular patterns.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-needs-plugins-and-css-work-for-richer-angular-apps">FullCalendar needs plugins and CSS work for richer Angular apps<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#fullcalendar-needs-plugins-and-css-work-for-richer-angular-apps" class="hash-link" aria-label="Direct link to FullCalendar needs plugins and CSS work for richer Angular apps" title="Direct link to FullCalendar needs plugins and CSS work for richer Angular apps" translate="no">​</a></h3>
<p>Three limitations come with FullCalendar.</p>
<ul>
<li class="">Resource views require a paid premium license.</li>
<li class="">Dark mode requires custom CSS overrides.</li>
<li class="">The plugin system means more packages to manage compared to an all-in-one library.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x">Schedule-X<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#schedule-x" class="hash-link" aria-label="Direct link to Schedule-X" title="Direct link to Schedule-X" translate="no">​</a></h2>
<p>Schedule-X takes a framework-agnostic, TypeScript-first core built around a plugin architecture and wraps it in framework-specific packages, including one for Angular.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-setup-with-its-angular-adapter">Schedule-X setup with its Angular adapter<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#schedule-x-setup-with-its-angular-adapter" class="hash-link" aria-label="Direct link to Schedule-X setup with its Angular adapter" title="Direct link to Schedule-X setup with its Angular adapter" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @schedule-x/angular @schedule-x/calendar @schedule-x/theme-default @schedule-x/event-recurrence</span><br></div></code></pre></div></div>
<p>Import <code>ScheduleXModule</code> in your app module. Then create the calendar instance in your component:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> createCalendar</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> createViewWeek</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> createViewMonthGrid </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> createEventRecurrencePlugin </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/event-recurrence'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/theme-default/dist/index.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;sx-calendar [calendarApp]="calendar"&gt;&lt;/sx-calendar&gt;'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">CalendarComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    calendar </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createCalendar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        views   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token function" style="color:rgb(220, 220, 170)">createViewWeek</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createViewMonthGrid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15 09:30'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16 14:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16 15:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        plugins </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token function" style="color:rgb(220, 220, 170)">createEventRecurrencePlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-gives-angular-teams-a-typescript-first-calendar-core">Schedule-X gives Angular teams a TypeScript-first calendar core<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#schedule-x-gives-angular-teams-a-typescript-first-calendar-core" class="hash-link" aria-label="Direct link to Schedule-X gives Angular teams a TypeScript-first calendar core" title="Direct link to Schedule-X gives Angular teams a TypeScript-first calendar core" translate="no">​</a></h3>
<p>Schedule-X provides week and month grid views, with a day view and agenda view also available as plugins. Recurring events are handled through the recurrence plugin using the iCalendar RRULE format. Drag-and-drop is available as a separate plugin. Dark mode is supported through CSS custom properties that ship with the default theme. The library is written entirely in TypeScript, so type inference works well across the configuration API.</p>
<p>Schedule-X keeps the Angular setup lighter than Bryntum Calendar, but that smaller footprint comes with fewer built-in scheduling features.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-keeps-core-views-free-and-charges-for-premium-plugins">Schedule-X keeps core views free and charges for Premium plugins<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#schedule-x-keeps-core-views-free-and-charges-for-premium-plugins" class="hash-link" aria-label="Direct link to Schedule-X keeps core views free and charges for Premium plugins" title="Direct link to Schedule-X keeps core views free and charges for Premium plugins" translate="no">​</a></h3>
<p>Schedule-X core is MIT-licensed and free for commercial use. <strong>Premium</strong> plugins, including resource view, drag-and-drop, drag-to-create, and event forms, require a paid Schedule-X <strong>Premium</strong> license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-keeps-lightweight-angular-calendars-simple">Schedule-X keeps lightweight Angular calendars simple<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#schedule-x-keeps-lightweight-angular-calendars-simple" class="hash-link" aria-label="Direct link to Schedule-X keeps lightweight Angular calendars simple" title="Direct link to Schedule-X keeps lightweight Angular calendars simple" translate="no">​</a></h3>
<p>Schedule-X suits TypeScript-first teams for four reasons.</p>
<ul>
<li class="">MIT license with no commercial restrictions.</li>
<li class="">TypeScript-first design with strong type inference.</li>
<li class="">Built-in dark mode support.</li>
<li class="">Lightweight plugin architecture.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-leaves-resource-scheduling-to-premium-plugins">Schedule-X leaves resource scheduling to Premium plugins<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#schedule-x-leaves-resource-scheduling-to-premium-plugins" class="hash-link" aria-label="Direct link to Schedule-X leaves resource scheduling to Premium plugins" title="Direct link to Schedule-X leaves resource scheduling to Premium plugins" translate="no">​</a></h3>
<p>Three limitations restrict Schedule-X for some projects.</p>
<ul>
<li class="">No resource calendar view.</li>
<li class="">Smaller community than FullCalendar.</li>
<li class="">Fewer built-in view options than more mature libraries.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p>DHTMLX Scheduler has a long track record as a JavaScript scheduling component. DHTMLX offers Angular integration guidance and a Scheduler for Angular product page, while the public <code>dhtmlx-scheduler</code> package still uses direct initialization with Angular lifecycle hooks.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler showing a calendar view with events" src="https://www.react-gantt.com/assets/images/dhtmlx-calendar-0badd0ee8aa95ff28eb2967b0663d105.png" width="2880" height="1564" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-setup-with-angular-lifecycle-hooks">DHTMLX Scheduler setup with Angular lifecycle hooks<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#dhtmlx-scheduler-setup-with-angular-lifecycle-hooks" class="hash-link" aria-label="Direct link to DHTMLX Scheduler setup with Angular lifecycle hooks" title="Direct link to DHTMLX Scheduler setup with Angular lifecycle hooks" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>The public package can be initialized directly against a DOM element inside <code>ngAfterViewInit</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">AfterViewInit</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewChild</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ElementRef</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">OnDestroy</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">scheduler</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-dhtmlx-calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;div #container style="width:100%;height:100vh;"&gt;&lt;/div&gt;'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">DhtmlxCalendarComponent</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">implements</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AfterViewInit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">OnDestroy</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">ViewChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> containerRef</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">ElementRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">ngAfterViewInit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">xml_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d %H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">containerRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">nativeElement</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'month'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15 09:30'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16 14:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16 15:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">ngOnDestroy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">destructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Note that direct DOM manipulation sits outside the Angular change detection cycle. Updates to the scheduler from Angular need to be applied through the DHTMLX API rather than through data bindings.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-suits-angular-apps-that-can-use-imperative-setup">DHTMLX Scheduler suits Angular apps that can use imperative setup<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#dhtmlx-scheduler-suits-angular-apps-that-can-use-imperative-setup" class="hash-link" aria-label="Direct link to DHTMLX Scheduler suits Angular apps that can use imperative setup" title="Direct link to DHTMLX Scheduler suits Angular apps that can use imperative setup" translate="no">​</a></h3>
<p>DHTMLX Scheduler offers day, week, and month views, plus a timeline view and mini-calendar. Recurring events are supported through an extension that follows the iCalendar RRULE standard. Drag-and-drop is built in. A resource timeline extension allows displaying events grouped by resource. The scheduler has been in active development for many years, which means it covers a wide range of edge cases.</p>
<p>DHTMLX Scheduler has a long feature history, but Bryntum Calendar fits Angular's component model more cleanly through its first-party wrapper.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-separates-gpl-use-from-paid-pro-tiers">DHTMLX Scheduler separates GPL use from paid PRO tiers<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#dhtmlx-scheduler-separates-gpl-use-from-paid-pro-tiers" class="hash-link" aria-label="Direct link to DHTMLX Scheduler separates GPL use from paid PRO tiers" title="Direct link to DHTMLX Scheduler separates GPL use from paid PRO tiers" translate="no">​</a></h3>
<p>DHTMLX Scheduler <strong>Standard</strong> is free for GPL-compatible open-source projects. Paid <strong>PRO</strong> licenses start with the <strong>Individual</strong> tier at $599, and DHTMLX lists <strong>Commercial</strong>, <strong>Enterprise</strong>, and <strong>Ultimate</strong> tiers for larger teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-brings-mature-views-to-angular-projects">DHTMLX Scheduler brings mature views to Angular projects<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#dhtmlx-scheduler-brings-mature-views-to-angular-projects" class="hash-link" aria-label="Direct link to DHTMLX Scheduler brings mature views to Angular projects" title="Direct link to DHTMLX Scheduler brings mature views to Angular projects" translate="no">​</a></h3>
<p>DHTMLX Scheduler has three notable strengths.</p>
<ul>
<li class="">Mature library with a long history of production use.</li>
<li class="">Wide range of views including timeline and mini-calendar.</li>
<li class="">Free for open-source GPL projects.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-creates-angular-change-detection-friction">DHTMLX Scheduler creates Angular change detection friction<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#dhtmlx-scheduler-creates-angular-change-detection-friction" class="hash-link" aria-label="Direct link to DHTMLX Scheduler creates Angular change detection friction" title="Direct link to DHTMLX Scheduler creates Angular change detection friction" translate="no">​</a></h3>
<p>Three drawbacks apply when using DHTMLX Scheduler in Angular.</p>
<ul>
<li class="">The public package uses manual DOM initialization in Angular.</li>
<li class="">Direct DOM manipulation creates friction with Angular change detection.</li>
<li class="">Commercial pricing varies and is difficult to compare at a glance.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p>Mobiscroll Event Calendar ships a native Angular package and focuses on touch-friendly interactions that look polished on small screens without extra configuration.</p>
<p><img decoding="async" loading="lazy" alt="Mobiscroll Event Calendar showing a week calendar view with events" src="https://www.react-gantt.com/assets/images/mobiscroll-calendar-cd4f3cb5356370346e5d25e1de657bbe.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-setup-with-angular">Mobiscroll Event Calendar setup with Angular<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#mobiscroll-event-calendar-setup-with-angular" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar setup with Angular" title="Direct link to Mobiscroll Event Calendar setup with Angular" translate="no">​</a></h3>
<p>Configure the Mobiscroll private npm registry before installing the Angular package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/angular</span><br></div></code></pre></div></div>
<p>Add the stylesheet in <code>angular.json</code>:</p>
<div class="language-json codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-json codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token property">"styles"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@mobiscroll/angular/dist/css/mobiscroll.min.css"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><br></div></code></pre></div></div>
<p>Import <code>MbscModule</code> in your app module, then configure the component:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscCalendarEvent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">        &lt;mbsc-eventcalendar [data]="events" [view]="myView" [dragToMove]="true" [dragToCreate]="true"&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">        &lt;/mbsc-eventcalendar&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">    </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">CalendarComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscCalendarEvent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15T09:30:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> recurring </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> repeat </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'weekly'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> weekDays </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'MO,TU,WE,TH,FR'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T15:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    myView </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> calendar </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'week'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> popover </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-focuses-on-mobile-angular-scheduling">Mobiscroll Event Calendar focuses on mobile Angular scheduling<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#mobiscroll-event-calendar-focuses-on-mobile-angular-scheduling" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar focuses on mobile Angular scheduling" title="Direct link to Mobiscroll Event Calendar focuses on mobile Angular scheduling" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar provides day, week, and month views, along with an agenda view and timeline view. Recurring events are configured through a simple object API rather than raw RRULE strings, which lowers the learning curve for common patterns. Drag-and-drop and resize are included with the <code>dragToMove</code> and <code>dragToResize</code> options. A resource calendar view is available through the scheduler component. Dark mode is available via a built-in theme option. The mobile-first design means touch interactions such as swipe-to-scroll and pinch-to-zoom work without extra setup.</p>
<p>Mobiscroll gives Angular teams stronger touch-first interactions, while Bryntum Calendar gives them a deeper scheduling model for resource calendars and recurring events.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-starts-with-an-internal-project-license">Mobiscroll Event Calendar starts with an internal project license<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#mobiscroll-event-calendar-starts-with-an-internal-project-license" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar starts with an internal project license" title="Direct link to Mobiscroll Event Calendar starts with an internal project license" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 for a single internal project as a perpetual license. The <strong>Complete</strong> internal project license starts at $1,955 and adds the full product set, source code, and priority support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-gives-angular-apps-touch-first-controls">Mobiscroll Event Calendar gives Angular apps touch-first controls<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#mobiscroll-event-calendar-gives-angular-apps-touch-first-controls" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar gives Angular apps touch-first controls" title="Direct link to Mobiscroll Event Calendar gives Angular apps touch-first controls" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar is a strong fit for mobile-first Angular projects.</p>
<ul>
<li class="">Mobile-first design with polished touch interactions out of the box.</li>
<li class="">Native Angular wrapper with data-binding support.</li>
<li class="">Built-in dark mode.</li>
<li class="">The <strong>Complete</strong> internal project license covers the full Mobiscroll product set.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-costs-more-for-multi-project-teams">Mobiscroll Event Calendar costs more for multi-project teams<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#mobiscroll-event-calendar-costs-more-for-multi-project-teams" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar costs more for multi-project teams" title="Direct link to Mobiscroll Event Calendar costs more for multi-project teams" translate="no">​</a></h3>
<p>Three limitations apply before choosing Mobiscroll.</p>
<ul>
<li class="">Multi-project product teams need a higher tier or a SaaS license.</li>
<li class="">The starting price is higher than some single-component alternatives.</li>
<li class="">Resource calendar requires switching to the scheduler component rather than the event calendar component.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="which-angular-calendar-component-should-you-choose">Which Angular calendar component should you choose?<a href="https://www.react-gantt.com/content/best-angular-calendar-components/#which-angular-calendar-component-should-you-choose" class="hash-link" aria-label="Direct link to Which Angular calendar component should you choose?" title="Direct link to Which Angular calendar component should you choose?" translate="no">​</a></h2>
<p>The table below compares the five libraries across the features that matter most for appointment-style calendar applications.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Calendar</th><th>FullCalendar</th><th>Schedule-X</th><th>DHTMLX Scheduler</th><th>Mobiscroll</th></tr></thead><tbody><tr><td>Day/week/month views</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Recurring events</td><td>Yes (RFC 5545)</td><td>Yes (plugin)</td><td>Yes (plugin)</td><td>Yes (extension)</td><td>Yes</td></tr><tr><td>Drag-and-drop</td><td>Yes</td><td>Yes (plugin)</td><td>Yes (plugin)</td><td>Yes</td><td>Yes</td></tr><tr><td>Resource calendar</td><td>Yes</td><td><strong>Premium</strong> only</td><td>No</td><td>Yes (extension)</td><td>Yes (scheduler)</td></tr><tr><td>Dark mode</td><td>Yes</td><td>CSS only</td><td>Yes</td><td>No</td><td>Yes</td></tr><tr><td>Native Angular wrapper</td><td>Yes</td><td>Yes</td><td>Yes</td><td>No</td><td>Yes</td></tr><tr><td>Free/open-source</td><td>No</td><td>Core only</td><td>Yes</td><td>GPL only</td><td>No</td></tr></tbody></table></div>
<p>The table below maps common scenarios to the most appropriate option.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Scenario</th><th>Recommended option</th></tr></thead><tbody><tr><td>Production app needing resource calendars, recurring events, and full Angular support</td><td>Bryntum Calendar</td></tr><tr><td>Open-source or budget-constrained project that needs a proven calendar without resource views</td><td>FullCalendar (core)</td></tr><tr><td>Modern TypeScript project that values a lightweight, plugin-based approach</td><td>Schedule-X</td></tr><tr><td>Mobile-heavy Angular app where touch UX is the top priority</td><td>Mobiscroll Event Calendar</td></tr></tbody></table></div>
<p>For applications centered on scheduling appointments, managing team calendars, or building any kind of day/week/month planner, Bryntum Calendar offers the most complete Angular-native solution. It handles resource views, RRULE recurring events, and dark mode without reaching for external plugins or workarounds, and the commercial license includes long-term support.</p>
<p>FullCalendar remains a strong choice when budget is the primary constraint and resource views are not required. Schedule-X is worth considering for TypeScript-first projects that want a lightweight foundation to build on. DHTMLX Scheduler suits teams that are comfortable with imperative DOM initialization and need a mature feature set. Mobiscroll Event Calendar stands out for teams building mobile-first Angular apps where touch interaction quality is non-negotiable.</p>
<p>The code samples above provide a working starting point for each library. Each library has detailed documentation covering data loading from APIs, custom event rendering, timezone handling, and accessibility considerations.</p>]]></content:encoded>
            <category>calendar</category>
        </item>
        <item>
            <title><![CDATA[Best Angular Gantt chart components]]></title>
            <link>https://www.react-gantt.com/content/best-angular-gantt-chart-components/</link>
            <guid>https://www.react-gantt.com/content/best-angular-gantt-chart-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Choosing the right Gantt chart component for an Angular application depends on how much scheduling logic the library handles, how it integrates with.]]></description>
            <content:encoded><![CDATA[<p>Choosing the right Gantt chart component for an Angular application depends on how much scheduling logic the library handles, how it integrates with Angular's component model, and what the license allows. This comparison covers five options: Bryntum Gantt, DHTMLX Gantt, Syncfusion Gantt, DayPilot Gantt, and ScheduleJS.</p>
<p>The comparison uses these criteria: installation, Angular integration, scheduling features, export support, pricing, and production trade-offs. Four of the five libraries ship native Angular wrappers. DHTMLX Gantt uses a container approach where you initialize the library inside <code>ngAfterViewInit</code>. If you are comparing libraries across frameworks rather than Angular specifically, see our article on <a class="" href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/">the best JavaScript Gantt chart libraries for enterprise projects</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt">Bryntum Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#bryntum-gantt" class="hash-link" aria-label="Direct link to Bryntum Gantt" title="Direct link to Bryntum Gantt" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a> is a commercial JavaScript Gantt component built on <a href="https://github.com/bryntum/chronograph" target="_blank" rel="noopener noreferrer" class="">ChronoGraph</a>, an open-source reactive scheduling engine. When a predecessor task changes its duration, dependent tasks reschedule automatically, working-time calendars skip non-working days, and constraints interact the way they do in Microsoft Project. The left panel is built on Bryntum Grid, giving it full sorting, filtering, grouping, and column configuration without extra setup.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-gantt">Getting started with Bryntum Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#getting-started-with-bryntum-gantt" class="hash-link" aria-label="Direct link to Getting started with Bryntum Gantt" title="Direct link to Getting started with Bryntum Gantt" translate="no">​</a></h3>
<p>Install the trial package and the Angular wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt@npm:@bryntum/gantt-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt-angular@7.3.0</span><br></div></code></pre></div></div>
<p>Add the required stylesheets to the <code>styles</code> array in <code>angular.json</code>, in this order:</p>
<div class="language-json codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-json codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/gantt/fontawesome/css/fontawesome.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/gantt/fontawesome/css/solid.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/gantt/gantt.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/gantt/svalbard-light.css"</span><br></div></code></pre></div></div>
<p>Import <code>BryntumGanttModule</code> in your <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumGanttModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    imports </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BryntumGanttModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Define the Gantt configuration in the component class:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumGanttProps</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-root'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    templateUrl </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component.html'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ganttConfig </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">BryntumGanttProps</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        columns </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">        width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'percentdone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        project </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          tasks </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Launch SaaS Product'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> expanded </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">35.7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  children </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Install Apache'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Configure firewall'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Run tests'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-21'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          dependencies </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> fromTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> toTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> lag </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> fromTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> toTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Bind the configuration properties in the template:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">&lt;!-- app.component.html --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">bryntum-gantt</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[columns]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">ganttConfig.columns</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[project]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">ganttConfig.project</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">bryntum-gantt</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-627cdc5a5d97c6a596d5b811f1dc7b71.png" width="2880" height="1562" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-features">Bryntum Gantt features<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#bryntum-gantt-features" class="hash-link" aria-label="Direct link to Bryntum Gantt features" title="Direct link to Bryntum Gantt features" translate="no">​</a></h3>
<p>Bryntum Gantt includes auto-scheduling via ChronoGraph, critical path analysis, resource management, baselines, split tasks, and undo/redo. Client-side export covers PDF, PNG, Excel, ICS, and MS Project XML without requiring a server-side export module. The library also supports importing MS Project and Primavera P6 files. Ten built-in themes and 45 locales are included in the base license. Bryntum ships an MCP server and a Claude Code skill, so AI coding agents can reference the API documentation directly during development.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-pricing">Bryntum Gantt pricing<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#bryntum-gantt-pricing" class="hash-link" aria-label="Direct link to Bryntum Gantt pricing" title="Direct link to Bryntum Gantt pricing" translate="no">​</a></h3>
<p>The license costs $940 per developer as a perpetual license that includes 12 months of updates. After the update period, you keep the last version you received. A free 45-day trial is available at <a href="https://bryntum.com/download/?product=gantt" target="_blank" rel="noopener noreferrer" class="">bryntum.com/download</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-gantt">Pros of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#pros-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Pros of Bryntum Gantt" title="Direct link to Pros of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">Native Angular wrapper ships with full TypeScript type definitions.</li>
<li class="">The ChronoGraph scheduling engine handles all dependency recalculation, constraint resolution, and calendar-aware scheduling.</li>
<li class="">All features (export, baselines, resource management, and critical path) are included in the base license without add-ons.</li>
<li class="">Ten built-in themes cover most visual requirements without custom CSS.</li>
<li class="">MCP server and Claude Code skill support AI-assisted development workflows.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-gantt">Cons of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#cons-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Cons of Bryntum Gantt" title="Direct link to Cons of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">No free tier beyond the 45-day trial.</li>
<li class="">Higher per-developer entry cost compared to some alternatives.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt">DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#dhtmlx-gantt" class="hash-link" aria-label="Direct link to DHTMLX Gantt" title="Direct link to DHTMLX Gantt" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxGantt/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Gantt</a> is one of the oldest JavaScript Gantt libraries available. It offers a GPL Standard edition for open-source use and several commercial tiers for production applications. DHTMLX does not ship an official Angular wrapper, so Angular integration requires initializing the library against a DOM element inside <code>ngAfterViewInit</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-gantt">Getting started with DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#getting-started-with-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Gantt" title="Direct link to Getting started with DHTMLX Gantt" translate="no">​</a></h3>
<p>Install the package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-gantt@9.1.4</span><br></div></code></pre></div></div>
<p>Create an Angular component that initializes DHTMLX Gantt against a container element:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">OnInit</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">OnDestroy</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ElementRef</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewChild</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">AfterViewInit</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> gantt </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-dhtmlx-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;div #ganttContainer style="width:100%;height:500px;"&gt;&lt;/div&gt;'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    styleUrls   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'../node_modules/dhtmlx-gantt/codebase/dhtmlxgantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">DhtmlxGanttComponent</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">implements</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AfterViewInit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">OnDestroy</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">ViewChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'ganttContainer'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> ganttContainer</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">ElementRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">ngAfterViewInit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">date_format</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">ganttContainer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">nativeElement</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            data  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">14</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> open </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  parent </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  parent </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            links </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> source </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> target </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'0'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">ngOnDestroy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">clearAll</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="DHTMLX Gantt" src="https://www.react-gantt.com/assets/images/dhtmlx-gantt-ff658910fe3ae8368cfabb8d895d8c43.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-features">DHTMLX Gantt features<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#dhtmlx-gantt-features" class="hash-link" aria-label="Direct link to DHTMLX Gantt features" title="Direct link to DHTMLX Gantt features" translate="no">​</a></h3>
<p>The Standard (GPL) edition includes drag-and-drop task editing, dependency links, zoom levels, and collapsible task trees. Auto-scheduling, critical path analysis, resource management, baselines, and split tasks are available in the Pro edition only.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-pricing">DHTMLX Gantt pricing<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#dhtmlx-gantt-pricing" class="hash-link" aria-label="Direct link to DHTMLX Gantt pricing" title="Direct link to DHTMLX Gantt pricing" translate="no">​</a></h3>
<p>The Standard edition is free under the GPL license for open-source projects. Commercial licenses are per-developer perpetual: Individual at $699, Commercial at $1,399, Enterprise at $2,999, and Ultimate at $5,999.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-gantt">Pros of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#pros-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Pros of DHTMLX Gantt" title="Direct link to Pros of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard edition is genuinely free for open-source projects.</li>
<li class="">Pricing is published and per-developer perpetual.</li>
<li class="">Package is available on the public npm registry without authentication.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-gantt">Cons of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#cons-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Cons of DHTMLX Gantt" title="Direct link to Cons of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">No official Angular wrapper: you manage DOM initialization and teardown manually.</li>
<li class="">The <code>gantt</code> export is a global singleton, which complicates running multiple Gantt instances on the same page.</li>
<li class="">Advanced scheduling features (auto-scheduling, critical path, resource management) require the Pro edition.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt">Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#syncfusion-gantt" class="hash-link" aria-label="Direct link to Syncfusion Gantt" title="Direct link to Syncfusion Gantt" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/angular-components/angular-gantt-chart" target="_blank" rel="noopener noreferrer" class="">Syncfusion Gantt</a> ships as a first-party Angular component through the <code>@syncfusion/ej2-angular-gantt</code> package. It covers the full scheduling feature set, including auto-scheduling, critical path, baselines, split tasks, and resource management. It is available under a Community License for qualifying teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-gantt">Getting started with Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#getting-started-with-syncfusion-gantt" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Gantt" title="Direct link to Getting started with Syncfusion Gantt" translate="no">​</a></h3>
<p>Install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-angular-gantt@33.2.4</span><br></div></code></pre></div></div>
<p>Register the license key and import <code>GanttModule</code> in <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">GanttModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-angular-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> registerLicense </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key-here'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> imports</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">GanttModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Define the data source and task field mapping in the component:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-root'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    templateUrl </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component.html'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token maybe-class-name">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            subtasks </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       </span><span class="token maybe-class-name">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Predecessor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    taskFields </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        id         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskID'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        name       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'StartDate'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        duration   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        progress   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Progress'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        dependency </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Predecessor'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        child      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'subtasks'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Render the component in the template:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">&lt;!-- app.component.html --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">ejs-gantt</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[dataSource]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">data</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[taskFields]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">taskFields</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">100%</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">ejs-gantt</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Syncfusion requires multiple stylesheet imports in <code>angular.json</code>. Add the following to the <code>styles</code> array:</p>
<div class="language-json codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-json codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-base/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-buttons/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-calendars/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-dropdowns/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-inputs/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-navigations/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-popups/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-richtexteditor/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-treegrid/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-grids/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-gantt/styles/material.css"</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Syncfusion Gantt" src="https://www.react-gantt.com/assets/images/syncfusion-gantt-77a9b1156ed39130b3014fcc7a7d47a8.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-features">Syncfusion Gantt features<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#syncfusion-gantt-features" class="hash-link" aria-label="Direct link to Syncfusion Gantt features" title="Direct link to Syncfusion Gantt features" translate="no">​</a></h3>
<p>Syncfusion Gantt includes auto-scheduling, critical path analysis, baselines, split tasks, resource management, undo/redo, and export. The feature set is comparable to Bryntum Gantt in breadth.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-pricing">Syncfusion Gantt pricing<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#syncfusion-gantt-pricing" class="hash-link" aria-label="Direct link to Syncfusion Gantt pricing" title="Direct link to Syncfusion Gantt pricing" translate="no">​</a></h3>
<p>The Community License is free for organizations with annual gross revenue under $1 million, five or fewer developers, and 10 or fewer total employees. Commercial licensing is quote-based. The Community License covers the full feature set with no feature restrictions.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-gantt">Pros of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#pros-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Pros of Syncfusion Gantt" title="Direct link to Pros of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Native Angular component with first-party support.</li>
<li class="">Community License covers all features at no cost for qualifying teams.</li>
<li class="">Comprehensive feature set including auto-scheduling, baselines, and export.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-gantt">Cons of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#cons-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Cons of Syncfusion Gantt" title="Direct link to Cons of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">The setup requires importing 11 separate CSS files from different packages.</li>
<li class="">Commercial pricing is not publicly listed.</li>
<li class="">MCP servers are stdio-only, which limits integration with some AI tooling.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt">DayPilot Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#daypilot-gantt" class="hash-link" aria-label="Direct link to DayPilot Gantt" title="Direct link to DayPilot Gantt" translate="no">​</a></h2>
<p><a href="https://doc.daypilot.org/gantt/" target="_blank" rel="noopener noreferrer" class="">DayPilot Pro</a> provides a native Angular Gantt component through the <code>daypilot-pro-angular</code> package. It covers dependency links, drag-and-drop scheduling, and task completion tracking. The package is distributed after purchasing a DayPilot Pro license and is not available on the public npm registry.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-gantt">Getting started with DayPilot Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#getting-started-with-daypilot-gantt" class="hash-link" aria-label="Direct link to Getting started with DayPilot Gantt" title="Direct link to Getting started with DayPilot Gantt" translate="no">​</a></h3>
<p>After obtaining a license, install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-angular</span><br></div></code></pre></div></div>
<p>Import <code>DayPilotModule</code> in <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilotModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> imports</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">DayPilotModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Configure the Gantt in the component:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewChild</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilotGanttComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-root'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;daypilot-gantt [config]="config"&gt;&lt;/daypilot-gantt&gt;</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    config </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        days      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        tasks     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> completion </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-20'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  completion </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        links </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> to </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-features">DayPilot Gantt features<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#daypilot-gantt-features" class="hash-link" aria-label="Direct link to DayPilot Gantt features" title="Direct link to DayPilot Gantt features" translate="no">​</a></h3>
<p>DayPilot Gantt supports dependency links, drag-and-drop task editing, task completion percentages, and a UI Builder for configuring the component visually. A 60-day trial is available. It does not include an auto-scheduling engine, so task dates do not recalculate automatically when dependencies change.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-pricing">DayPilot Gantt pricing<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#daypilot-gantt-pricing" class="hash-link" aria-label="Direct link to DayPilot Gantt pricing" title="Direct link to DayPilot Gantt pricing" translate="no">​</a></h3>
<p>DayPilot Pro licenses start at $649 per developer as a perpetual license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-gantt">Pros of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#pros-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Pros of DayPilot Gantt" title="Direct link to Pros of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">Native Angular component.</li>
<li class="">UI Builder lets you configure the Gantt visually and export the resulting configuration.</li>
<li class="">60-day trial period.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-gantt">Cons of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#cons-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Cons of DayPilot Gantt" title="Direct link to Cons of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">No auto-scheduling engine: dependent task dates must be managed manually.</li>
<li class="">Feature set is narrower than Bryntum Gantt or Syncfusion Gantt.</li>
<li class="">Package is not on the public npm registry.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs">ScheduleJS<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#schedulejs" class="hash-link" aria-label="Direct link to ScheduleJS" title="Direct link to ScheduleJS" translate="no">​</a></h2>
<p><a href="https://schedulejs.com/" target="_blank" rel="noopener noreferrer" class="">ScheduleJS</a> is a commercial Gantt library from AISO SA that targets Angular exclusively and renders to HTML Canvas. It is the only Angular-native canvas-based Gantt in this comparison. Canvas rendering maintains performance at high activity counts where DOM-based rendering can slow down. The package is not published on the public npm registry and is distributed as a local file after purchase.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-schedulejs">Getting started with ScheduleJS<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#getting-started-with-schedulejs" class="hash-link" aria-label="Direct link to Getting started with ScheduleJS" title="Direct link to Getting started with ScheduleJS" translate="no">​</a></h3>
<p>ScheduleJS requires a new Angular project created with SCSS:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">ng new project-name </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">--style</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">scss</span><br></div></code></pre></div></div>
<p>Add the local package after obtaining it from AISO SA:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">add</span><span class="token plain"> file:./local_modules/schedule</span><br></div></code></pre></div></div>
<p>Import <code>ScheduleModule</code> and initialize the license in <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">NgModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/platform-browser'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Locale</span><span class="token imports"> </span><span class="token imports keyword module" style="color:rgb(86, 156, 214)">as</span><span class="token imports"> </span><span class="token imports maybe-class-name">BaseLocaleEnUs</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@js-joda/locale/dist/prebuilt/en-us'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">LicenseManager</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Locale</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ScheduleModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">AppComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    declarations </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    imports      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BrowserModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ScheduleModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    bootstrap    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">constructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token maybe-class-name">Locale</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">updateDefault</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token maybe-class-name">BaseLocaleEnUs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token constant" style="color:rgb(100, 102, 149)">US</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token maybe-class-name">LicenseManager</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">setLicenseFromKey</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key-here'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>The package name is <code>schedule</code>, not <code>schedulejs</code>. <code>LicenseManager.setLicenseFromKey()</code> must run before any ScheduleJS component mounts. The data model uses class extension: activities and rows are defined by extending <code>MutableActivityBase</code> and <code>Row</code> subclasses rather than plain configuration objects.</p>
<p><img decoding="async" loading="lazy" alt="ScheduleJS" src="https://www.react-gantt.com/assets/images/schedulejs-gantt-e1757a56f158db618475011ecc54bb6d.png" width="684" height="380" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-features">ScheduleJS features<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#schedulejs-features" class="hash-link" aria-label="Direct link to ScheduleJS features" title="Direct link to ScheduleJS features" translate="no">​</a></h3>
<p>ScheduleJS uses canvas rendering to display large numbers of activities without DOM overhead. It supports <code>ActivityLink</code> visualization for dependency display and integrates with Angular's component lifecycle. The library does not include auto-scheduling, critical path analysis, baselines, or export functionality.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-pricing">ScheduleJS pricing<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#schedulejs-pricing" class="hash-link" aria-label="Direct link to ScheduleJS pricing" title="Direct link to ScheduleJS pricing" translate="no">​</a></h3>
<p>Licenses start at 1,500 EUR per developer as a perpetual license per application.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-schedulejs">Pros of ScheduleJS<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#pros-of-schedulejs" class="hash-link" aria-label="Direct link to Pros of ScheduleJS" title="Direct link to Pros of ScheduleJS" translate="no">​</a></h3>
<ul>
<li class="">Canvas rendering maintains performance when displaying very large numbers of activities.</li>
<li class="">Native Angular lifecycle integration.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-schedulejs">Cons of ScheduleJS<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#cons-of-schedulejs" class="hash-link" aria-label="Direct link to Cons of ScheduleJS" title="Direct link to Cons of ScheduleJS" translate="no">​</a></h3>
<ul>
<li class="">Angular-only: not usable in React, Vue, or plain JavaScript projects.</li>
<li class="">No auto-scheduling engine, no critical path, no baselines, and no export.</li>
<li class="">Package is distributed as a local file, not through a package registry.</li>
<li class="">Starting price of 1,500 EUR per developer is among the highest in this comparison.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-angular-gantt-chart-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below summarizes the key capabilities across all five libraries.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:left">Bryntum Gantt</th><th style="text-align:left">DHTMLX Gantt</th><th style="text-align:left">Syncfusion Gantt</th><th style="text-align:left">DayPilot Gantt</th><th style="text-align:left">ScheduleJS</th></tr></thead><tbody><tr><td style="text-align:left">Auto-scheduling</td><td style="text-align:left">Yes</td><td style="text-align:left">Pro only</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Critical path</td><td style="text-align:left">Yes</td><td style="text-align:left">Pro only</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Resource management</td><td style="text-align:left">Yes</td><td style="text-align:left">Pro only</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Angular native wrapper</td><td style="text-align:left">Yes</td><td style="text-align:left">No (container approach)</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Canvas rendering</td><td style="text-align:left">No</td><td style="text-align:left">No</td><td style="text-align:left">No</td><td style="text-align:left">No</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Export</td><td style="text-align:left">PDF/PNG/Excel/ICS/XML</td><td style="text-align:left">Online or add-on</td><td style="text-align:left">Yes</td><td style="text-align:left">Limited</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Open-source / free tier</td><td style="text-align:left">Trial only</td><td style="text-align:left">GPL Standard</td><td style="text-align:left">Community License</td><td style="text-align:left">Trial only</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">MCP server</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Stdio only</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr></tbody></table></div>
<p>The table below maps common project requirements to the library best suited for each.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Use case</th><th style="text-align:left">Recommended library</th></tr></thead><tbody><tr><td style="text-align:left">Enterprise Angular app requiring a full scheduling engine</td><td style="text-align:left">Bryntum Gantt</td></tr><tr><td style="text-align:left">Full-featured Gantt with a free Community License</td><td style="text-align:left">Syncfusion Gantt</td></tr><tr><td style="text-align:left">Canvas rendering for very large activity counts</td><td style="text-align:left">ScheduleJS</td></tr><tr><td style="text-align:left">Open-source or GPL-licensed project</td><td style="text-align:left">DHTMLX Gantt Standard</td></tr></tbody></table></div>
<p>For most Angular teams building a project management interface, Bryntum Gantt and Syncfusion Gantt are the strongest choices because both ship native Angular wrappers and include a complete scheduling engine in the base product. Bryntum Gantt adds MCP server support and a Claude Code skill that make it well suited to teams using AI coding assistants. Syncfusion Gantt's Community License makes it the practical choice for smaller teams that qualify.</p>
<p>DHTMLX Gantt is the best option when the project is open-source and the GPL license fits. The lack of an official Angular wrapper is a real integration cost, but the public npm package and transparent pricing make it straightforward to evaluate. DayPilot is suitable when you need a native Angular component with a UI Builder and are not relying on automatic dependency scheduling. ScheduleJS serves a narrow use case: Angular-only projects that must render an unusually high number of activities on screen, where canvas rendering justifies the trade-offs in features and distribution.</p>]]></content:encoded>
            <category>gantt</category>
        </item>
        <item>
            <title><![CDATA[Best Angular scheduler components]]></title>
            <link>https://www.react-gantt.com/content/best-angular-scheduler-components/</link>
            <guid>https://www.react-gantt.com/content/best-angular-scheduler-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This comparison covers five Angular resource scheduling libraries: Bryntum Scheduler, DHTMLX Scheduler, Syncfusion Schedule, DayPilot Scheduler Pro, and.]]></description>
            <content:encoded><![CDATA[<p>This comparison covers five Angular resource scheduling libraries: Bryntum Scheduler, DHTMLX Scheduler, Syncfusion Schedule, DayPilot Scheduler Pro, and Mobiscroll Event Calendar. A resource scheduler, also called a timeline scheduler, places resources on the Y-axis and a time axis on the X-axis, then renders event bars for each resource across that timeline. This is distinct from a Gantt chart, which models task dependencies and work breakdown structures, and from a calendar, which shows personal appointment views.</p>
<p>Vendor naming is inconsistent. Bryntum calls this product a Scheduler, Mobiscroll calls it an Event Calendar with a timeline view, and Syncfusion calls it Schedule. For a framework-agnostic comparison, see our article on <a href="https://bryntum.com/blog/best-javascript-scheduler-components/" target="_blank" rel="noopener noreferrer" class="">the best JavaScript scheduler components</a>.</p>
<p>Each section covers installation, a working Angular code sample, features, pricing, and trade-offs. Four of the five libraries ship a native Angular wrapper. DHTMLX Scheduler uses a container approach where you initialize the library inside <code>ngAfterViewInit</code> rather than through a declarative component.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler">Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#bryntum-scheduler" class="hash-link" aria-label="Direct link to Bryntum Scheduler" title="Direct link to Bryntum Scheduler" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/scheduler/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler</a> is a commercial JavaScript resource scheduler that ships a first-party Angular wrapper. It renders resources on rows and places event bars on a configurable time axis. The library includes 18 built-in view presets, virtual scrolling for large datasets, and an event editor out of the box. Bryntum Scheduler Pro extends the base product with a ChronoGraph scheduling engine that handles travel time between events and constraint-based scheduling.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-scheduler">Getting started with Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#getting-started-with-bryntum-scheduler" class="hash-link" aria-label="Direct link to Getting started with Bryntum Scheduler" title="Direct link to Getting started with Bryntum Scheduler" translate="no">​</a></h3>
<p>Install the trial package and the Angular wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler@npm:@bryntum/scheduler-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler-angular@7.3.0</span><br></div></code></pre></div></div>
<p>Add the required stylesheets to the <code>styles</code> array in <code>angular.json</code>. CSS load order matters here: FontAwesome must come before the component stylesheet, and the theme file must come last.</p>
<div class="language-json codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-json codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token property">"styles"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/scheduler/fontawesome/css/fontawesome.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/scheduler/fontawesome/css/solid.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/scheduler/scheduler.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@bryntum/scheduler/svalbard-light.css"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><br></div></code></pre></div></div>
<p>Import <code>BryntumSchedulerModule</code> in your <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">NgModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/platform-browser'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumSchedulerModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">AppComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    declarations </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    imports      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BrowserModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">BryntumSchedulerModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    bootstrap    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Define the scheduler configuration in the component class and bind it to the <code>&lt;bryntum-scheduler&gt;</code> element:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// scheduler.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">SchedulerConfig</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;bryntum-scheduler [config]="schedulerConfig"&gt;&lt;/bryntum-scheduler&gt;'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    styles   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">':host { display: block; height: 100vh; }'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">SchedulerComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    schedulerConfig</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Partial</span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token maybe-class-name">SchedulerConfig</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        endDate    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-26'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        viewPreset </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hourAndDay'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        columns    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> field </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">130</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Celia'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sales'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Fancy law firm'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'teal'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Small boutique'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Grocery store'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lime'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Busy'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">              startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'red'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">           startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'clients office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">             startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Suggested meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-11'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grocery store'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Bryntum Scheduler" src="https://www.react-gantt.com/assets/images/bryntum-scheduler-cdea645a1b76ea741b10ad1742864273.png" width="2558" height="1188" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-features">Bryntum Scheduler features<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#bryntum-scheduler-features" class="hash-link" aria-label="Direct link to Bryntum Scheduler features" title="Direct link to Bryntum Scheduler features" translate="no">​</a></h3>
<p>Bryntum Scheduler supports multi-resource event assignments, event overlap detection, drag-and-drop resize, a built-in event editor, recurring events, resource grouping, and virtual scrolling. It ships 18 view presets (from minutes to years) and 10 built-in themes. Bryntum also provides an MCP server and a Claude Code skill so AI coding assistants can reference the API documentation directly during development. Scheduler Pro adds travel time between events and the ChronoGraph reactive scheduling engine.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-pricing">Bryntum Scheduler pricing<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#bryntum-scheduler-pricing" class="hash-link" aria-label="Direct link to Bryntum Scheduler pricing" title="Direct link to Bryntum Scheduler pricing" translate="no">​</a></h3>
<p>The small-team license costs $680 per developer as a perpetual license, with a three-developer minimum and 12 months of updates. After the update period, you retain the last version received. A trial is available via npm using the install command above.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-scheduler">Pros of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#pros-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Pros of Bryntum Scheduler" title="Direct link to Pros of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Native Angular wrapper with full TypeScript type definitions.</li>
<li class="">18 built-in view presets cover most time scales without custom configuration.</li>
<li class="">Virtual scrolling maintains performance with large resource and event sets.</li>
<li class="">MCP server and Claude Code skill support AI-assisted development workflows.</li>
<li class="">All features are included in the base license without paid add-ons.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-scheduler">Cons of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#cons-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Cons of Bryntum Scheduler" title="Direct link to Cons of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">No free tier beyond the npm trial.</li>
<li class="">Per-developer pricing is higher than some alternatives in this list.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Scheduler</a> is a mature JavaScript calendar and scheduling library. It supports multiple calendar views and adds a Timeline view for resource scheduling. DHTMLX does not ship an official Angular wrapper, so Angular integration requires initializing the library against a DOM element inside <code>ngAfterViewInit</code> and cleaning up in <code>ngOnDestroy</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-scheduler">Getting started with DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#getting-started-with-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Scheduler" title="Direct link to Getting started with DHTMLX Scheduler" translate="no">​</a></h3>
<p>Install the package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>Create an Angular component that initializes the DHTMLX Scheduler Timeline view against a container element:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// dhtmlx-scheduler.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">AfterViewInit</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewChild</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ElementRef</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">OnDestroy</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">scheduler</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;div #container style="width:100%;height:100vh;"&gt;&lt;/div&gt;'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">DhtmlxSchedulerComponent</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">implements</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AfterViewInit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">OnDestroy</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">ViewChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> containerRef</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">ElementRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">ngAfterViewInit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">xml_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d %H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">createTimelineView</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            name       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_unit     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_date     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_step     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_size     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_start    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_length   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            y_unit     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'people'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            y_property </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'section_id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            render     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bar'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">containerRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">nativeElement</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'people'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> key </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> key </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 10:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 12:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> section_id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 17:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> section_id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">ngOnDestroy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">destructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>The Timeline view for resource scheduling requires the DHTMLX Scheduler PRO edition. The Standard edition does not include it.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler" src="https://www.react-gantt.com/assets/images/dhtmlx-scheduler-8a45f0e64d65f3372e6310101f1f0116.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-features">DHTMLX Scheduler features<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#dhtmlx-scheduler-features" class="hash-link" aria-label="Direct link to DHTMLX Scheduler features" title="Direct link to DHTMLX Scheduler features" translate="no">​</a></h3>
<p>DHTMLX Scheduler provides multiple calendar views (day, week, month, agenda), a Timeline view for resource scheduling (Pro), recurring events, and touch support. Because <code>scheduler</code> is a global singleton, running multiple scheduler instances on the same page requires careful management.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing">DHTMLX Scheduler pricing<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#dhtmlx-scheduler-pricing" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing" title="Direct link to DHTMLX Scheduler pricing" translate="no">​</a></h3>
<p>The Standard edition is free under the GPL license for open-source projects. Commercial PRO licenses are perpetual and range from $599 for an individual license to $3,999 for an enterprise license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-scheduler">Pros of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#pros-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Pros of DHTMLX Scheduler" title="Direct link to Pros of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard edition is free for open-source projects.</li>
<li class="">Package is available on the public npm registry without authentication.</li>
<li class="">Published pricing tiers make budgeting straightforward.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-scheduler">Cons of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#cons-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Cons of DHTMLX Scheduler" title="Direct link to Cons of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">No official Angular wrapper: DOM initialization and teardown must be handled manually.</li>
<li class="">The Timeline view for resource scheduling requires the PRO edition.</li>
<li class="">The global singleton pattern complicates multiple-instance scenarios.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule">Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#syncfusion-schedule" class="hash-link" aria-label="Direct link to Syncfusion Schedule" title="Direct link to Syncfusion Schedule" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/angular-components/angular-scheduler" target="_blank" rel="noopener noreferrer" class="">Syncfusion Schedule</a> ships as a first-party Angular component through the <code>@syncfusion/ej2-angular-schedule</code> package. Timeline Day, Timeline Week, and Timeline Month views provide the resource scheduling layout. The component is available under a Community License for qualifying organizations.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-schedule">Getting started with Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#getting-started-with-syncfusion-schedule" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Schedule" title="Direct link to Getting started with Syncfusion Schedule" translate="no">​</a></h3>
<p>Install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-angular-schedule</span><br></div></code></pre></div></div>
<p>Import <code>ScheduleModule</code> and register the required view services in <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">NgModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/platform-browser'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">ScheduleModule</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">TimelineViewsService</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">TimelineMonthService</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-angular-schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">AppComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    declarations </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    imports      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BrowserModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ScheduleModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    providers    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">TimelineViewsService</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">TimelineMonthService</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    bootstrap    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Define the resource data and event data in the component, and register the Syncfusion license key before rendering:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// scheduler.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">OnInit</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> registerLicense </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">        &lt;ejs-schedule height="550px" [selectedDate]="selectedDate" [eventSettings]="eventSettings"&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;e-resources&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">                &lt;e-resource field="ResourceId" title="Resource" name="Resources"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">                    [dataSource]="resourceData" textField="text" idField="id"&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">                &lt;/e-resource&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;/e-resources&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;e-views&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">                &lt;e-view option="TimelineDay"&gt;&lt;/e-view&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">                &lt;e-view option="TimelineWeek"&gt;&lt;/e-view&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;/e-views&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">        &lt;/ejs-schedule&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">    </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">SchedulerComponent</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">implements</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">OnInit</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selectedDate </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    resourceData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    eventSettings </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        dataSource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">17</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">ngOnInit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Syncfusion requires multiple stylesheet imports. Add the following to the <code>styles</code> array in <code>angular.json</code>:</p>
<div class="language-json codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-json codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token property">"styles"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-base/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-buttons/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-calendars/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-dropdowns/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-inputs/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-navigations/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-popups/styles/material.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@syncfusion/ej2-angular-schedule/styles/material.css"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-features">Syncfusion Schedule features<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#syncfusion-schedule-features" class="hash-link" aria-label="Direct link to Syncfusion Schedule features" title="Direct link to Syncfusion Schedule features" translate="no">​</a></h3>
<p>Syncfusion Schedule includes Timeline Day, Timeline Week, and Timeline Month views, drag-and-drop event editing, recurring events, resource grouping, virtual scrolling, and export. The standard calendar views (Day, Week, Month) are also available alongside the timeline views.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-pricing">Syncfusion Schedule pricing<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#syncfusion-schedule-pricing" class="hash-link" aria-label="Direct link to Syncfusion Schedule pricing" title="Direct link to Syncfusion Schedule pricing" translate="no">​</a></h3>
<p>The Community License is free for organizations with annual gross revenue under $1 million and five or fewer developers. Commercial licensing is quote-based and not publicly listed.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-schedule">Pros of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#pros-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Pros of Syncfusion Schedule" title="Direct link to Pros of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">Native Angular component with first-party support.</li>
<li class="">Community License covers all features at no cost for qualifying teams.</li>
<li class="">Multiple timeline views (day, week, month) are included in the base package.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-schedule">Cons of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#cons-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Cons of Syncfusion Schedule" title="Direct link to Cons of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">Setup requires importing eight separate CSS files from different packages.</li>
<li class="">Commercial pricing requires contacting Syncfusion for a quote.</li>
<li class="">The license registration call must appear before any component renders.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pro">DayPilot Scheduler Pro<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#daypilot-scheduler-pro" class="hash-link" aria-label="Direct link to DayPilot Scheduler Pro" title="Direct link to DayPilot Scheduler Pro" translate="no">​</a></h2>
<p><a href="https://doc.daypilot.org/scheduler/" target="_blank" rel="noopener noreferrer" class="">DayPilot Pro</a> provides a native Angular scheduler component through the <code>daypilot-pro-angular</code> package. It renders resource rows on the Y-axis and a configurable time axis on the X-axis, with drag-and-drop event editing and a hierarchical resource tree. A DayPilot Lite version with limited features is freely available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-scheduler-pro">Getting started with DayPilot Scheduler Pro<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#getting-started-with-daypilot-scheduler-pro" class="hash-link" aria-label="Direct link to Getting started with DayPilot Scheduler Pro" title="Direct link to Getting started with DayPilot Scheduler Pro" translate="no">​</a></h3>
<p>Install the package (distributed after purchasing a license):</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-angular</span><br></div></code></pre></div></div>
<p>Import <code>DayPilotModule</code> in <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">NgModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/platform-browser'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilotModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">AppComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    declarations </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    imports      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BrowserModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">DayPilotModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    bootstrap    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Configure the scheduler in the component class:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// scheduler.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilot</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'&lt;daypilot-scheduler [config]="config"&gt;&lt;/daypilot-scheduler&gt;'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">SchedulerComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    config</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">DayPilot</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access maybe-class-name">SchedulerConfig</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        days       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scale      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        cellWidth  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">40</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T17:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pro-features">DayPilot Scheduler Pro features<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#daypilot-scheduler-pro-features" class="hash-link" aria-label="Direct link to DayPilot Scheduler Pro features" title="Direct link to DayPilot Scheduler Pro features" translate="no">​</a></h3>
<p>DayPilot Scheduler Pro supports resource rows, drag-and-drop event editing, a hierarchical resource tree, multi-day events, and event customization callbacks. It does not include a scheduling engine, so event dates do not recalculate automatically when dependencies change. A UI Builder lets you configure the component visually and export the resulting configuration code.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pro-pricing">DayPilot Scheduler Pro pricing<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#daypilot-scheduler-pro-pricing" class="hash-link" aria-label="Direct link to DayPilot Scheduler Pro pricing" title="Direct link to DayPilot Scheduler Pro pricing" translate="no">​</a></h3>
<p>DayPilot Pro starts at $899 per developer as a perpetual license. A Lite version with limited features is free.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-scheduler-pro">Pros of DayPilot Scheduler Pro<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#pros-of-daypilot-scheduler-pro" class="hash-link" aria-label="Direct link to Pros of DayPilot Scheduler Pro" title="Direct link to Pros of DayPilot Scheduler Pro" translate="no">​</a></h3>
<ul>
<li class="">Native Angular component.</li>
<li class="">Hierarchical resource tree is included without additional configuration.</li>
<li class="">Lite version provides a free entry point for simple use cases.</li>
<li class="">UI Builder reduces configuration time for common layouts.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-scheduler-pro">Cons of DayPilot Scheduler Pro<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#cons-of-daypilot-scheduler-pro" class="hash-link" aria-label="Direct link to Cons of DayPilot Scheduler Pro" title="Direct link to Cons of DayPilot Scheduler Pro" translate="no">​</a></h3>
<ul>
<li class="">No scheduling engine: dependent event dates must be managed in application code.</li>
<li class="">Package is not on the public npm registry.</li>
<li class="">Feature set is narrower than Bryntum Scheduler or Syncfusion Schedule.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p><a href="https://mobiscroll.com/event-calendar-scheduler" target="_blank" rel="noopener noreferrer" class="">Mobiscroll Event Calendar</a> is a commercial component suite that includes a timeline view for resource scheduling. Mobiscroll uses the "Event Calendar" name for what other vendors call a scheduler. The library is built with a mobile-first approach and is optimized for touch interaction and responsive layouts across desktop and mobile.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-mobiscroll-event-calendar">Getting started with Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#getting-started-with-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Getting started with Mobiscroll Event Calendar" title="Direct link to Getting started with Mobiscroll Event Calendar" translate="no">​</a></h3>
<p>Install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/angular</span><br></div></code></pre></div></div>
<p>Import <code>MbscModule</code> in <code>AppModule</code>:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">NgModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/platform-browser'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">AppComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    declarations </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    imports      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BrowserModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">MbscModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    bootstrap    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Define resources, events, and the view configuration in the component:</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// scheduler.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscCalendarEvent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscResource</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/angular'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selector </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    template </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">        &lt;mbsc-eventcalendar [data]="myEvents" [resources]="myResources" [view]="myView"&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">        &lt;/mbsc-eventcalendar&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">    </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">SchedulerComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    myResources</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscResource</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    myEvents</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscCalendarEvent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T12:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T17:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    myView </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> timeline </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'week'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventList </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Add the Mobiscroll stylesheet to <code>angular.json</code>:</p>
<div class="language-json codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-json codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token property">"styles"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"node_modules/@mobiscroll/angular/dist/css/mobiscroll.min.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-features">Mobiscroll Event Calendar features<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#mobiscroll-event-calendar-features" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar features" title="Direct link to Mobiscroll Event Calendar features" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar includes a timeline view, drag-and-drop event editing, recurring events, and responsive layouts. The library is mobile-first: it handles touch gestures and adapts the layout for small screens without additional configuration. Among the five options in this article, Mobiscroll provides the best out-of-the-box mobile experience.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-pricing">Mobiscroll Event Calendar pricing<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#mobiscroll-event-calendar-pricing" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar pricing" title="Direct link to Mobiscroll Event Calendar pricing" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 per internal project as a perpetual license. A trial is available on the Mobiscroll website.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-mobiscroll-event-calendar">Pros of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#pros-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Pros of Mobiscroll Event Calendar" title="Direct link to Pros of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">Native Angular component.</li>
<li class="">Best mobile and touch experience among the five options compared here.</li>
<li class="">Single CSS import keeps the setup straightforward.</li>
<li class="">Responsive layout adapts to different screen sizes without custom work.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-mobiscroll-event-calendar">Cons of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#cons-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Cons of Mobiscroll Event Calendar" title="Direct link to Cons of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">SaaS and multi-customer product pricing requires a custom quote.</li>
<li class="">Narrower feature set for resource scheduling compared to Bryntum Scheduler.</li>
<li class="">No free tier beyond the trial.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-angular-scheduler-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below summarizes the key capabilities across all five libraries.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:left">Bryntum Scheduler</th><th style="text-align:left">DHTMLX Scheduler</th><th style="text-align:left">Syncfusion Schedule</th><th style="text-align:left">DayPilot Scheduler Pro</th><th style="text-align:left">Mobiscroll Event Calendar</th></tr></thead><tbody><tr><td style="text-align:left">Resource grouping</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes (Pro)</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Multi-level resources</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes (Pro)</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes (tree)</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Drag-and-drop</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Recurring events</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Virtual scrolling</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Angular native module</td><td style="text-align:left">Yes</td><td style="text-align:left">No (container approach)</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Free tier</td><td style="text-align:left">Trial only</td><td style="text-align:left">GPL Standard</td><td style="text-align:left">Community License</td><td style="text-align:left">Lite version</td><td style="text-align:left">Trial only</td></tr></tbody></table></div>
<p>The table below maps common project requirements to the library best suited for each.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Use case</th><th style="text-align:left">Recommended library</th></tr></thead><tbody><tr><td style="text-align:left">Enterprise Angular app requiring full resource scheduling</td><td style="text-align:left">Bryntum Scheduler</td></tr><tr><td style="text-align:left">Full-featured scheduler with a free Community License</td><td style="text-align:left">Syncfusion Schedule</td></tr><tr><td style="text-align:left">Mobile or touch-first scheduling interface</td><td style="text-align:left">Mobiscroll Event Calendar</td></tr><tr><td style="text-align:left">Open-source project or GPL-licensed application</td><td style="text-align:left">DHTMLX Scheduler Standard</td></tr></tbody></table></div>
<p>For most Angular teams building a resource scheduling UI, Bryntum Scheduler and Syncfusion Schedule are the strongest choices. Both ship native Angular wrappers and include virtual scrolling, resource grouping, and recurring events. Bryntum Scheduler adds an MCP server and Claude Code skill that make it well suited to teams using AI coding assistants during development. The Syncfusion Community License makes it the practical choice for smaller teams that qualify under the revenue and headcount thresholds.</p>
<p>DHTMLX Scheduler is the best option when the project is open-source and the GPL license fits. The lack of an official Angular wrapper is a real integration cost, but the Timeline view covers the resource scheduling use case once you are on the PRO edition. DayPilot Scheduler Pro suits teams that need a native Angular component with a hierarchical resource tree and can accept the absence of a scheduling engine. Mobiscroll Event Calendar is the right choice when mobile and touch support are primary requirements: no other library in this comparison matches its responsive behavior and touch gesture handling out of the box.</p>]]></content:encoded>
            <category>scheduler</category>
        </item>
        <item>
            <title><![CDATA[Best FullCalendar alternatives for React]]></title>
            <link>https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/</link>
            <guid>https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[If we're using FullCalendar in React, the free core gives us day, week, month, and list views quickly.]]></description>
            <content:encoded><![CDATA[<p>If we're using FullCalendar in React, the free core gives us day, week, month, and list views quickly. The limits appear when the product needs resource views, deeper TypeScript ergonomics, and fewer plugin wiring steps. <strong>FullCalendar Premium</strong> starts at $480 per year, and the React package wraps the core DOM library rather than replacing it with a React-native scheduling model.</p>
<p>FullCalendar becomes less attractive when resource views are required, because Bryntum Calendar includes that workflow in the base product instead of making it a <strong>Premium</strong> upgrade.</p>
<p>This article compares four FullCalendar alternatives for React using the criteria below.</p>
<ul>
<li class="">React integration quality.</li>
<li class="">Resource scheduling and recurring event support.</li>
<li class="">TypeScript fit.</li>
<li class="">Pricing and license tiers.</li>
<li class="">Where Bryntum Calendar is the strongest replacement for FullCalendar.</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar">Bryntum Calendar<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#bryntum-calendar" class="hash-link" aria-label="Direct link to Bryntum Calendar" title="Direct link to Bryntum Calendar" translate="no">​</a></h2>
<p>Bryntum Calendar ships resource scheduling, drag-and-drop, recurring events, undo/redo, and 11 view types in a single package with a first-party React wrapper. The <a href="https://bryntum.com/products/calendar/docs/guide/Calendar/gettingstarted/api/integration-react" target="_blank" rel="noopener noreferrer" class="">Bryntum Calendar React quick start</a> covers the full setup path. For React teams that need resource calendaring without paying a premium unlock fee on top of the base license, it is the most complete option in this comparison.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Calendar showing a monthly view with multiple events and a resource sidebar" src="https://www.react-gantt.com/assets/images/bryntum-calendar-70dce206121152f0d903196195e93e01.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-setup-as-a-react-replacement-for-fullcalendar">Bryntum Calendar setup as a React replacement for FullCalendar<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#bryntum-calendar-setup-as-a-react-replacement-for-fullcalendar" class="hash-link" aria-label="Direct link to Bryntum Calendar setup as a React replacement for FullCalendar" title="Direct link to Bryntum Calendar setup as a React replacement for FullCalendar" translate="no">​</a></h3>
<p>Install the trial package from the public npm registry along with the React wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar@npm:@bryntum/calendar-trial@7.3.0 @bryntum/calendar-react@7.3.0</span><br></div></code></pre></div></div>
<p>Bryntum requires four CSS files imported in order. Add these to your main CSS file or <code>index.js</code>:</p>
<div class="language-css codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-css codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fontawesome/css/fontawesome.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fontawesome/css/solid.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/calendar.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/svalbard-light.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Then use the <code>BryntumCalendar</code> component in your app:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumCalendar</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> resources </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bryntum team'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hotel Park'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'michael'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Michael Johnson'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'deep-orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hackathon 2025'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                       startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-11T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-18T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> allDay </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'green'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Breakfast'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                            startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team Scrum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                           startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Scheduler Grid introduction + review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">BryntumCalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">events</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">events</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">resources</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">resources</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">mode</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">week</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">date</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">2025-10-12</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-removes-the-fullcalendar-resource-view-paywall">Bryntum Calendar removes the FullCalendar resource-view paywall<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#bryntum-calendar-removes-the-fullcalendar-resource-view-paywall" class="hash-link" aria-label="Direct link to Bryntum Calendar removes the FullCalendar resource-view paywall" title="Direct link to Bryntum Calendar removes the FullCalendar resource-view paywall" translate="no">​</a></h3>
<p>Bryntum Calendar differs from FullCalendar in several important ways across the React integration, feature set, and developer experience.</p>
<ul>
<li class=""><strong>First-party React wrapper.</strong> The <code>BryntumCalendar</code> component gives React teams a supported component API while keeping the Bryntum scheduling engine underneath.</li>
<li class=""><strong>Resource scheduling included in the base license.</strong> All resource views ship in the standard package, so Bryntum does not require a premium tier for resource views.</li>
<li class=""><strong>Built-in TypeScript definitions.</strong> The library authors ship TypeScript types alongside the source, not as an afterthought, so autocomplete and type checking are consistent throughout.</li>
<li class=""><strong>CSS variable theming.</strong> Bryntum ships 10 themes across five light/dark pairs, all switchable at runtime. FullCalendar offers limited theming without custom CSS work.</li>
<li class=""><strong>No per-feature plugin wiring.</strong> Drag-and-drop, recurring events, and time zone support are available without installing and registering separate plugins for each feature.</li>
<li class=""><strong>Larger bundle size.</strong> The uncompressed bundle exceeds 4 MB. Teams with strict load-time budgets should measure the impact early.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-starts-with-the-small-team-license">Bryntum Calendar starts with the Small Team license<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#bryntum-calendar-starts-with-the-small-team-license" class="hash-link" aria-label="Direct link to Bryntum Calendar starts with the Small Team license" title="Direct link to Bryntum Calendar starts with the Small Team license" translate="no">​</a></h3>
<p>Bryntum Calendar costs $680 per developer for the <strong>Small Team</strong> license, with a three-developer minimum and 12 months of updates included. A free trial is available through the npm registry.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-includes-the-scheduling-features-fullcalendar-paywalls">Bryntum Calendar includes the scheduling features FullCalendar paywalls<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#bryntum-calendar-includes-the-scheduling-features-fullcalendar-paywalls" class="hash-link" aria-label="Direct link to Bryntum Calendar includes the scheduling features FullCalendar paywalls" title="Direct link to Bryntum Calendar includes the scheduling features FullCalendar paywalls" translate="no">​</a></h3>
<p>Bryntum Calendar stands out as a FullCalendar alternative for three reasons.</p>
<ul>
<li class="">Native React component with full TypeScript support throughout the API.</li>
<li class="">Resource scheduling, drag-and-drop, recurring events, and undo/redo are all included at no extra cost.</li>
<li class="">Ten built-in themes covering light and dark appearances, switchable at runtime.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-costs-more-than-fullcalendars-free-core">Bryntum Calendar costs more than FullCalendar's free core<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#bryntum-calendar-costs-more-than-fullcalendars-free-core" class="hash-link" aria-label="Direct link to Bryntum Calendar costs more than FullCalendar's free core" title="Direct link to Bryntum Calendar costs more than FullCalendar's free core" translate="no">​</a></h3>
<p>Three limitations apply when evaluating Bryntum Calendar.</p>
<ul>
<li class="">Commercial-only with no free or open source tier for any project type.</li>
<li class="">CSS import order is strict and will break silently if the four files are not in the correct sequence.</li>
<li class="">The uncompressed bundle size exceeds 4 MB, which requires early evaluation for performance-sensitive applications.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x">Schedule-X<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#schedule-x" class="hash-link" aria-label="Direct link to Schedule-X" title="Direct link to Schedule-X" translate="no">​</a></h2>
<p>Schedule-X offers an MIT-licensed, TypeScript-first calendar with first-party React support via the <code>@schedule-x/react</code> adapter. Its free core is the lightest option in this comparison. The trade-off is a smaller free feature set, because resource scheduling and drag-and-drop require Schedule-X Premium.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-setup-as-a-lightweight-react-calendar">Schedule-X setup as a lightweight React calendar<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#schedule-x-setup-as-a-lightweight-react-calendar" class="hash-link" aria-label="Direct link to Schedule-X setup as a lightweight React calendar" title="Direct link to Schedule-X setup as a lightweight React calendar" translate="no">​</a></h3>
<p>Install the core packages from the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @schedule-x/react @schedule-x/calendar @schedule-x/theme-default</span><br></div></code></pre></div></div>
<p>Set up the calendar and render it with the <code>ScheduleXCalendar</code> component:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">ScheduleXCalendar</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> useCalendarApp </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> createViewWeek</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> createViewMonthGrid</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> createViewDay </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/theme-default/dist/index.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> calendar </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useCalendarApp</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    views</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token function" style="color:rgb(220, 220, 170)">createViewDay</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createViewWeek</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createViewMonthGrid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team Standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    start</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12 09:30'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint Planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12 10:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12 12:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'3'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design Review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   start</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-13 14:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-13 15:30'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleXCalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">calendarApp</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">calendar</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-trades-fullcalendar-maturity-for-a-typescript-first-core">Schedule-X trades FullCalendar maturity for a TypeScript-first core<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#schedule-x-trades-fullcalendar-maturity-for-a-typescript-first-core" class="hash-link" aria-label="Direct link to Schedule-X trades FullCalendar maturity for a TypeScript-first core" title="Direct link to Schedule-X trades FullCalendar maturity for a TypeScript-first core" translate="no">​</a></h3>
<p>Schedule-X takes a different approach to FullCalendar in its architecture, licensing, and scope.</p>
<ul>
<li class=""><strong>MIT-licensed core.</strong> The MIT license covers the core with no watermark and no evaluation restriction, unlike FullCalendar where resource views require a paid upgrade.</li>
<li class=""><strong>TypeScript-first from the ground up.</strong> The API integrates types from the ground up rather than bolting on declarations, giving a more consistent experience than the partial TypeScript coverage in FullCalendar.</li>
<li class=""><strong>Lighter bundle.</strong> Schedule-X ships only what is imported, making it a good fit for apps where bundle size is a constraint.</li>
<li class=""><strong>Resource scheduling is Premium.</strong> Schedule-X gates resource view behind Schedule-X Premium, while FullCalendar gates resource views behind <strong>FullCalendar Premium</strong>.</li>
<li class=""><strong>Newer project with a smaller community.</strong> Schedule-X has less community documentation, fewer Stack Overflow answers, and a shorter issue history than FullCalendar.</li>
<li class=""><strong>Fewer view types.</strong> Schedule-X covers day, week, month grid, and month agenda. FullCalendar adds list view and resource views (with Premium).</li>
</ul>
<p>Schedule-X is a cleaner lightweight alternative to FullCalendar, while Bryntum Calendar is the stronger replacement when the React app needs resource scheduling and editing workflows.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-keeps-core-react-calendars-free">Schedule-X keeps core React calendars free<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#schedule-x-keeps-core-react-calendars-free" class="hash-link" aria-label="Direct link to Schedule-X keeps core React calendars free" title="Direct link to Schedule-X keeps core React calendars free" translate="no">​</a></h3>
<p>Schedule-X core is MIT-licensed and free. Premium plugins, including resource view, drag-and-drop, drag-to-create, and event forms, start at €479 per year for two to three developers or €999 for a lifetime license with one year of updates.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-gives-react-teams-a-small-calendar-core">Schedule-X gives React teams a small calendar core<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#schedule-x-gives-react-teams-a-small-calendar-core" class="hash-link" aria-label="Direct link to Schedule-X gives React teams a small calendar core" title="Direct link to Schedule-X gives React teams a small calendar core" translate="no">​</a></h3>
<p>Schedule-X has three advantages as a FullCalendar alternative.</p>
<ul>
<li class="">Free to use with no per-developer fees and no premium unlock required for core views.</li>
<li class="">TypeScript-first API with consistent type safety throughout the library.</li>
<li class="">Composable plugin architecture keeps the bundle small by default.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-still-charges-for-resource-scheduling">Schedule-X still charges for resource scheduling<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#schedule-x-still-charges-for-resource-scheduling" class="hash-link" aria-label="Direct link to Schedule-X still charges for resource scheduling" title="Direct link to Schedule-X still charges for resource scheduling" translate="no">​</a></h3>
<p>Three limitations make Schedule-X unsuitable for some projects.</p>
<ul>
<li class="">Resource scheduling requires Schedule-X Premium, which reduces its appeal as a free FullCalendar replacement.</li>
<li class="">Newer project with a smaller community and less third-party documentation than FullCalendar.</li>
<li class="">Fewer built-in view types and theming options compared to commercial alternatives.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p>Mobiscroll Event Calendar targets mobile-first interaction with iOS, Material, and Windows themes and native-quality touch gestures. Resource scheduling is included without a premium upgrade. For teams building applications where mobile usability is a primary requirement, it offers a level of polish that FullCalendar does not match out of the box.</p>
<p><img decoding="async" loading="lazy" alt="Mobiscroll Event Calendar showing a resource timeline with color-coded events" src="https://www.react-gantt.com/assets/images/mobiscroll-calendar-cd4f3cb5356370346e5d25e1de657bbe.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-setup-with-react">Mobiscroll Event Calendar setup with React<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#mobiscroll-event-calendar-setup-with-react" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar setup with React" title="Direct link to Mobiscroll Event Calendar setup with React" translate="no">​</a></h3>
<p>Configure the Mobiscroll private npm registry before installing the React package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/react</span><br></div></code></pre></div></div>
<p>Import the CSS and use the <code>Eventcalendar</code> component:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Eventcalendar</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react/dist/css/mobiscroll.min.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team Standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    start</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12T09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12T09:30'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint Planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12T10:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-12T12:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design Review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   start</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-13T14:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-13T15:30'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Eventcalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">view</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> calendar</span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> type</span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'month'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">data</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">events</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dragToMove</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dragToCreate</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-improves-on-fullcalendars-mobile-interaction">Mobiscroll improves on FullCalendar's mobile interaction<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#mobiscroll-improves-on-fullcalendars-mobile-interaction" class="hash-link" aria-label="Direct link to Mobiscroll improves on FullCalendar's mobile interaction" title="Direct link to Mobiscroll improves on FullCalendar's mobile interaction" translate="no">​</a></h3>
<p>Mobiscroll takes a different position from FullCalendar in terms of mobile support, resource scheduling, and recurrence format.</p>
<ul>
<li class=""><strong>Mobile-first design.</strong> Mobiscroll ships platform-specific themes (iOS, Material, Windows) and touch interaction patterns tuned for small screens. FullCalendar requires custom work to match this on mobile.</li>
<li class=""><strong>Built-in resource scheduling.</strong> The timeline and resource calendar views are part of the base package. FullCalendar requires a Premium upgrade for resource views.</li>
<li class=""><strong>Native-quality touch gestures.</strong> Drag-to-create and drag-to-move are optimized for touch, not adapted from mouse interactions.</li>
<li class=""><strong>Proprietary recurrence format.</strong> Mobiscroll uses its own object-based recurrence API rather than RFC 5545 RRULE strings, which can create interoperability issues when exchanging event data with other calendar systems.</li>
<li class=""><strong>Per-project pricing.</strong> Mobiscroll starts at a perpetual internal project license, while FullCalendar Premium starts with annual pricing.</li>
<li class=""><strong>No public npm install without authentication.</strong> Mobiscroll packages require private registry authentication before <code>npm install</code> works, which adds friction in CI/CD pipelines.</li>
</ul>
<p>Mobiscroll solves FullCalendar's mobile limitations better than Bryntum Calendar, but Bryntum is the better replacement when scheduler depth matters more than touch-first UI.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-starts-with-an-internal-project-license">Mobiscroll Event Calendar starts with an internal project license<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#mobiscroll-event-calendar-starts-with-an-internal-project-license" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar starts with an internal project license" title="Direct link to Mobiscroll Event Calendar starts with an internal project license" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 for a single internal project as a perpetual license. The <strong>Complete</strong> internal project license starts at $1,955 and adds the full product set, source code, and priority support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-gives-react-apps-touch-first-ux">Mobiscroll Event Calendar gives React apps touch-first UX<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#mobiscroll-event-calendar-gives-react-apps-touch-first-ux" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar gives React apps touch-first UX" title="Direct link to Mobiscroll Event Calendar gives React apps touch-first UX" translate="no">​</a></h3>
<p>Mobiscroll is a strong FullCalendar alternative for mobile-first projects.</p>
<ul>
<li class="">Mobile-first with platform-specific themes (iOS, Material, Windows) and native touch gesture support.</li>
<li class="">Resource scheduling is included without a premium upgrade.</li>
<li class="">Drag-to-create and drag-to-move work reliably on both desktop and touch devices.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-adds-private-registry-and-project-licensing">Mobiscroll Event Calendar adds private registry and project licensing<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#mobiscroll-event-calendar-adds-private-registry-and-project-licensing" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar adds private registry and project licensing" title="Direct link to Mobiscroll Event Calendar adds private registry and project licensing" translate="no">​</a></h3>
<p>Three limitations apply before choosing Mobiscroll.</p>
<ul>
<li class="">The internal project license is priced per project, so multi-project product teams need a higher tier or a SaaS license.</li>
<li class="">The proprietary recurrence format does not use RFC 5545 RRULE strings, complicating data interoperability with other calendar systems.</li>
<li class="">Private registry configuration may be required before installation, adding friction for CI/CD environments.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule">Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#syncfusion-schedule" class="hash-link" aria-label="Direct link to Syncfusion Schedule" title="Direct link to Syncfusion Schedule" translate="no">​</a></h2>
<p>Syncfusion Schedule ships one of the largest view sets available: Day, Week, Work Week, Month, Agenda, Month Agenda, and Timeline variants including Timeline Day, Timeline Week, Timeline Work Week, and Timeline Month. The component is part of the Syncfusion Essential Studio suite and requires a license key before rendering. For enterprise teams that need an exhaustive range of built-in views and are already inside the Syncfusion product suite, it is the most feature-complete option in this comparison.</p>
<p><img decoding="async" loading="lazy" alt="Syncfusion Schedule showing a week view with multiple event types" src="https://www.react-gantt.com/assets/images/syncfusion-schedule-c4dfd13944376a3415da02c505a1e6b6.png" width="2880" height="1556" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-setup-with-react-services">Syncfusion Schedule setup with React services<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#syncfusion-schedule-setup-with-react-services" class="hash-link" aria-label="Direct link to Syncfusion Schedule setup with React services" title="Direct link to Syncfusion Schedule setup with React services" translate="no">​</a></h3>
<p>Install the schedule package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-react-schedule</span><br></div></code></pre></div></div>
<p>Syncfusion requires multiple CSS imports to cover all the component dependencies. Add these to your main CSS file or <code>index.js</code>:</p>
<div class="language-css codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-css codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-lists/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-splitbuttons/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-schedule/styles/material.css'</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Register your license key before rendering, then use <code>ScheduleComponent</code> with injected view services:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> registerLicense </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">ScheduleComponent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">Day</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">Week</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">Month</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">Inject</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports"></span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team Standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    </span><span class="token maybe-class-name">StartTime</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token maybe-class-name">EndTime</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint Planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartTime</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design Review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token maybe-class-name">StartTime</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">14</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleComponent</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">selectedDate</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript keyword" style="color:rgb(86, 156, 214)">new</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">2026</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">4</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">12</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">eventSettings</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> dataSource</span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> events </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Inject</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">services</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Day</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Week</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Month</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleComponent</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-adds-more-built-in-views-than-fullcalendar">Syncfusion Schedule adds more built-in views than FullCalendar<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#syncfusion-schedule-adds-more-built-in-views-than-fullcalendar" class="hash-link" aria-label="Direct link to Syncfusion Schedule adds more built-in views than FullCalendar" title="Direct link to Syncfusion Schedule adds more built-in views than FullCalendar" translate="no">​</a></h3>
<p>Syncfusion Schedule differs from FullCalendar in its view depth, setup complexity, licensing model, and enterprise positioning.</p>
<ul>
<li class=""><strong>Largest built-in view set.</strong> Syncfusion covers Day, Week, Work Week, Month, Agenda, Month Agenda, and all four Timeline variants in a single package. FullCalendar requires plugins for each view category, and resource views are Premium-only.</li>
<li class=""><strong>Extensive customization options.</strong> Cell templates, event templates, and toolbar customization are available through props and render functions without writing raw CSS overrides.</li>
<li class=""><strong>Community License for smaller teams.</strong> The Syncfusion <strong>Community License</strong> is available for organizations with less than $1 million USD in annual gross revenue, five or fewer developers, 10 or fewer employees, and no more than $3 million USD in outside funding.</li>
<li class=""><strong>More complex setup than any other option.</strong> Syncfusion requires 10 separate CSS imports, a <code>registerLicense()</code> call before rendering, and explicit <code>&lt;Inject services={...} /&gt;</code> for each view type. FullCalendar requires several plugin installs but is simpler to configure.</li>
<li class=""><strong>Paid license required above the free license limits.</strong> Larger organizations need a paid Essential Studio license before using Syncfusion Schedule in production.</li>
</ul>
<p>Syncfusion Schedule gives React teams a broad enterprise component suite, while Bryntum Calendar gives them a more focused scheduling product with less suite-level setup.</p>
<ul>
<li class=""><strong>License key required at render time.</strong> Forgetting to call <code>registerLicense()</code> before the component mounts produces a console warning and watermarked output, which can catch developers off guard during initial setup.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-pricing-depends-on-community-license-eligibility">Syncfusion Schedule pricing depends on Community License eligibility<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#syncfusion-schedule-pricing-depends-on-community-license-eligibility" class="hash-link" aria-label="Direct link to Syncfusion Schedule pricing depends on Community License eligibility" title="Direct link to Syncfusion Schedule pricing depends on Community License eligibility" translate="no">​</a></h3>
<p>Syncfusion Schedule is free under the <strong>Community License</strong> for eligible organizations with less than $1 million USD in annual gross revenue, five or fewer developers, 10 or fewer employees, and no more than $3 million USD in outside funding. Larger organizations need a paid Essential Studio license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-benefits-react-teams-already-using-essential-studio">Syncfusion Schedule benefits React teams already using Essential Studio<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#syncfusion-schedule-benefits-react-teams-already-using-essential-studio" class="hash-link" aria-label="Direct link to Syncfusion Schedule benefits React teams already using Essential Studio" title="Direct link to Syncfusion Schedule benefits React teams already using Essential Studio" translate="no">​</a></h3>
<p>Syncfusion Schedule has three advantages for feature-complete enterprise applications.</p>
<ul>
<li class="">The largest built-in view set of any option in this comparison, including all Timeline variants.</li>
<li class="">Extensive template and customization options available through props without raw CSS overrides.</li>
<li class="">The <strong>Community License</strong> is free for eligible smaller organizations, unlike the FullCalendar resource-view paywall that applies regardless of company size.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-requires-heavier-setup-than-fullcalendar">Syncfusion Schedule requires heavier setup than FullCalendar<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#syncfusion-schedule-requires-heavier-setup-than-fullcalendar" class="hash-link" aria-label="Direct link to Syncfusion Schedule requires heavier setup than FullCalendar" title="Direct link to Syncfusion Schedule requires heavier setup than FullCalendar" translate="no">​</a></h3>
<p>Three limitations apply when evaluating Syncfusion Schedule.</p>
<ul>
<li class="">The most complex setup in this comparison: ten CSS imports, a license registration call, and explicit view injection are all required before the calendar renders.</li>
<li class="">Paid licensing is required once an organization exceeds the <strong>Community License</strong> thresholds.</li>
<li class=""><code>registerLicense()</code> must be called before the component mounts, and omitting it produces a watermarked output that can be confusing during onboarding.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="which-fullcalendar-alternative-should-react-teams-choose">Which FullCalendar alternative should React teams choose?<a href="https://www.react-gantt.com/content/best-fullcalendar-alternatives-for-react/#which-fullcalendar-alternative-should-react-teams-choose" class="hash-link" aria-label="Direct link to Which FullCalendar alternative should React teams choose?" title="Direct link to Which FullCalendar alternative should React teams choose?" translate="no">​</a></h2>
<p>The table below compares all five options, including FullCalendar as the baseline for this comparison.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Component</th><th style="text-align:left">Resource scheduling</th><th style="text-align:left">Open source</th><th style="text-align:left">React-native</th><th style="text-align:left">TypeScript</th><th style="text-align:left">Mobile optimized</th><th style="text-align:left">Price</th></tr></thead><tbody><tr><td style="text-align:left">FullCalendar</td><td style="text-align:left">Premium only ($480/yr)</td><td style="text-align:left">✓ (MIT core)</td><td style="text-align:left">✗ (JS wrapper)</td><td style="text-align:left">Partial</td><td style="text-align:left">✗</td><td style="text-align:left">Free core / $480/yr Premium</td></tr><tr><td style="text-align:left">Bryntum Calendar</td><td style="text-align:left">✓</td><td style="text-align:left">✗</td><td style="text-align:left">✓</td><td style="text-align:left">✓</td><td style="text-align:left">✗</td><td style="text-align:left">$680/developer</td></tr><tr><td style="text-align:left">Schedule-X</td><td style="text-align:left">✗</td><td style="text-align:left">✓ (MIT)</td><td style="text-align:left">✓</td><td style="text-align:left">✓</td><td style="text-align:left">✗</td><td style="text-align:left">Free / Pro add-ons</td></tr><tr><td style="text-align:left">Mobiscroll Event Calendar</td><td style="text-align:left">✓</td><td style="text-align:left">✗</td><td style="text-align:left">✓</td><td style="text-align:left">✓</td><td style="text-align:left">✓</td><td style="text-align:left">From $995/internal project</td></tr><tr><td style="text-align:left">Syncfusion Schedule</td><td style="text-align:left">✓</td><td style="text-align:left">✗</td><td style="text-align:left">✓</td><td style="text-align:left">✓</td><td style="text-align:left">✗</td><td style="text-align:left">Free under <strong>Community License</strong> / paid Essential Studio license</td></tr></tbody></table></div>
<p>The table below maps specific use cases to the best-fit option from this comparison.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Use case</th><th style="text-align:left">Recommended option</th></tr></thead><tbody><tr><td style="text-align:left">Teams that need resource scheduling without a premium unlock</td><td style="text-align:left">Bryntum Calendar</td></tr><tr><td style="text-align:left">Teams that want a free, open source calendar for React</td><td style="text-align:left">Schedule-X</td></tr><tr><td style="text-align:left">Teams building mobile-first applications</td><td style="text-align:left">Mobiscroll Event Calendar</td></tr><tr><td style="text-align:left">Teams that need the most comprehensive view set for an enterprise suite</td><td style="text-align:left">Syncfusion Schedule</td></tr></tbody></table></div>
<p>For teams whose main reason for leaving FullCalendar is the resource view paywall, Bryntum Calendar is the clearest replacement. Resource scheduling, drag-and-drop, recurring events, and undo/redo are all included in the base license, and the first-party React wrapper avoids hand-written DOM lifecycle code.</p>
<p>If budget is the deciding factor, Schedule-X provides a well-typed, composable calendar core for React at no cost. It requires Premium for resource scheduling, but for appointment-style calendaring it is a capable and modern alternative.</p>
<p>For teams where the end user is primarily on a phone or tablet, Mobiscroll Event Calendar has the strongest mobile-specific investment of any option here. For teams already inside the Syncfusion product suite who need a broad view set, the <strong>Community License</strong> makes Syncfusion Schedule worth evaluating before committing to a paid tier.</p>
<p>Start evaluating Bryntum Calendar today with the <a href="https://bryntum.com/download/?product=calendar" target="_blank" rel="noopener noreferrer" class="">free trial available on npm</a>.</p>]]></content:encoded>
            <category>calendar</category>
            <category>fullcalendar</category>
        </item>
        <item>
            <title><![CDATA[Best Gantt chart components for Salesforce Lightning Web Components]]></title>
            <link>https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/</link>
            <guid>https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Salesforce developers who need a custom Gantt view inside a Lightning page face a specific integration challenge.]]></description>
            <content:encoded><![CDATA[<p>Salesforce developers who need a custom Gantt view inside a Lightning page face a specific integration challenge. Lightning Web Components render inside Shadow DOM, which means external libraries cannot use <code>document.querySelector</code> to find a container element. Instead, the component must use <code>this.template.querySelector</code>, and any container where an external library injects DOM must carry the <code>lwc:dom="manual"</code> directive.</p>
<p>External JavaScript packages reach the browser either as Salesforce static resources or, for API version 54 and above, as npm modules configured through the Salesforce DX project. Both paths require extra setup that a standard web project does not need. This comparison covers five Gantt libraries that are compatible with the LWC environment: Bryntum Gantt, DHTMLX Gantt, Syncfusion Gantt, DayPilot Gantt, and Frappe Gantt.</p>
<p>The comparison uses these criteria: Salesforce DX installation, LWC initialization pattern, scheduling features, export support, pricing, and integration documentation.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt">Bryntum Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#bryntum-gantt" class="hash-link" aria-label="Direct link to Bryntum Gantt" title="Direct link to Bryntum Gantt" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a> is a commercial JavaScript Gantt component built on <a href="https://github.com/bryntum/chronograph" target="_blank" rel="noopener noreferrer" class="">ChronoGraph</a>, an open-source reactive scheduling engine. Bryntum provides official LWC support documentation and the npm package works with Salesforce DX npm modules support (API v54+).</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-gantt-in-lwc">Getting started with Bryntum Gantt in LWC<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#getting-started-with-bryntum-gantt-in-lwc" class="hash-link" aria-label="Direct link to Getting started with Bryntum Gantt in LWC" title="Direct link to Getting started with Bryntum Gantt in LWC" translate="no">​</a></h3>
<p>Install the trial package in your Salesforce DX project:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt@npm:@bryntum/gantt-trial@7.3.0</span><br></div></code></pre></div></div>
<p>Create the LWC HTML template (<code>ganttChart.html</code>):</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name namespace" style="color:rgb(156, 220, 254)">lwc:</span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dom</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">manual</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag special-attr attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag special-attr attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag special-attr attr-value value css language-css property" style="color:rgb(206, 145, 120)">height</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token tag special-attr attr-value value css language-css" style="color:rgb(206, 145, 120)"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:rgb(181, 206, 168)">600</span><span class="token tag special-attr attr-value value css language-css unit" style="color:rgb(206, 145, 120)">px</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Create the LWC JavaScript file (<code>ganttChart.js</code>):</p>
<div class="language-javascript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-javascript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> LightningElement </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lwc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Gantt </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">GanttChart</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">LightningElement</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    _gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">renderedCallback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">appendTo</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">template</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">querySelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'.container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">project</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token literal-property property">tasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Launch SaaS Product'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">expanded</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">35.7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token literal-property property">children</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Install Apache'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Configure firewall'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Run tests'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-21'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token literal-property property">dependencies</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">lag</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">disconnectedCallback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt</span><span class="token operator" style="color:rgb(212, 212, 212)">?.</span><span class="token function" style="color:rgb(220, 220, 170)">destroy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>The <code>lwc:dom="manual"</code> directive on the container div is required so that LWC does not clear the DOM injected by Bryntum. The guard in <code>renderedCallback</code> prevents re-initialization on subsequent renders. CSS must be loaded via the <code>@salesforce/resourceUrl</code> static resource API or configured via the Salesforce DX project settings. Bryntum publishes a dedicated <a href="https://bryntum.com/products/gantt/docs/guide/Gantt/integration/salesforce" target="_blank" rel="noopener noreferrer" class="">Salesforce integration guide</a> that covers both the static resource and npm module paths in full.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-627cdc5a5d97c6a596d5b811f1dc7b71.png" width="2880" height="1562" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-features">Bryntum Gantt features<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#bryntum-gantt-features" class="hash-link" aria-label="Direct link to Bryntum Gantt features" title="Direct link to Bryntum Gantt features" translate="no">​</a></h3>
<p>Bryntum Gantt includes the ChronoGraph scheduling engine, which recalculates dependent task dates automatically when any predecessor changes. Additional features include critical path analysis, baselines, four dependency types, resource management, work breakdown structure (WBS), and undo/redo. Client-side export covers PDF, PNG, Excel, ICS, and MS Project XML without requiring a server-side module. Ten built-in themes and 45 locales are included in the base license. Bryntum also ships an MCP server and a Claude Code skill, so AI coding agents can reference the API documentation directly during development.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-pricing">Bryntum Gantt pricing<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#bryntum-gantt-pricing" class="hash-link" aria-label="Direct link to Bryntum Gantt pricing" title="Direct link to Bryntum Gantt pricing" translate="no">​</a></h3>
<p>The license costs $940 per developer as a perpetual license that includes 12 months of updates. After the update period, you keep the last version you received. A free 45-day trial is available at <a href="https://bryntum.com/download/?product=gantt" target="_blank" rel="noopener noreferrer" class="">bryntum.com/download</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-gantt">Pros of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#pros-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Pros of Bryntum Gantt" title="Direct link to Pros of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">Official Salesforce LWC integration guide with both static resource and npm module paths documented.</li>
<li class="">The ChronoGraph scheduling engine handles all dependency recalculation, constraint resolution, and calendar-aware scheduling automatically.</li>
<li class="">All features (export, baselines, resource management, critical path) are included in the base license without add-ons.</li>
<li class="">Ten built-in themes cover most visual requirements without custom CSS.</li>
<li class="">MCP server and Claude Code skill support AI-assisted development workflows.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-gantt">Cons of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#cons-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Cons of Bryntum Gantt" title="Direct link to Cons of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">No free tier beyond the 45-day trial.</li>
<li class="">CSS must be configured as a static resource or through Salesforce DX project settings, which adds setup overhead.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt">DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#dhtmlx-gantt" class="hash-link" aria-label="Direct link to DHTMLX Gantt" title="Direct link to DHTMLX Gantt" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxGantt/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Gantt</a> is one of the oldest JavaScript Gantt libraries available. It ships as a global singleton, which means there is one shared <code>gantt</code> instance per page. DHTMLX does not publish an official LWC integration guide, but the vanilla JavaScript API is compatible with the manual DOM injection pattern that LWC requires.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-gantt-in-lwc">Getting started with DHTMLX Gantt in LWC<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#getting-started-with-dhtmlx-gantt-in-lwc" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Gantt in LWC" title="Direct link to Getting started with DHTMLX Gantt in LWC" translate="no">​</a></h3>
<p>Install the package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-gantt</span><br></div></code></pre></div></div>
<p>Create the LWC HTML template (<code>dhtmlxGantt.html</code>):</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name namespace" style="color:rgb(156, 220, 254)">lwc:</span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dom</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">manual</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag special-attr attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag special-attr attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag special-attr attr-value value css language-css property" style="color:rgb(206, 145, 120)">width</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token tag special-attr attr-value value css language-css" style="color:rgb(206, 145, 120)"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token tag special-attr attr-value value css language-css unit" style="color:rgb(206, 145, 120)">%</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token tag special-attr attr-value value css language-css" style="color:rgb(206, 145, 120)"> </span><span class="token tag special-attr attr-value value css language-css property" style="color:rgb(206, 145, 120)">height</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token tag special-attr attr-value value css language-css" style="color:rgb(206, 145, 120)"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:rgb(181, 206, 168)">600</span><span class="token tag special-attr attr-value value css language-css unit" style="color:rgb(206, 145, 120)">px</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Create the LWC JavaScript file (<code>dhtmlxGantt.js</code>):</p>
<div class="language-javascript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-javascript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> LightningElement </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lwc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> gantt </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DhtmlxGantt</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">LightningElement</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">renderedCallback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_initialized</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_initialized </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">date_format </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">template</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">querySelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'.container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">data</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">open</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">parent</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">parent</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">links</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">source</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">target</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'0'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Because <code>gantt</code> is a global singleton, calling <code>gantt.init</code> more than once on a page will reinitialize the same instance against the new container. The CSS file must be uploaded to Salesforce as a static resource and loaded using the <code>@salesforce/resourceUrl</code> import. There is no official LWC guide from DHTMLX, but the vanilla JS initialization pattern shown above works with the manual DOM injection approach.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Gantt" src="https://www.react-gantt.com/assets/images/dhtmlx-gantt-ff658910fe3ae8368cfabb8d895d8c43.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-features">DHTMLX Gantt features<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#dhtmlx-gantt-features" class="hash-link" aria-label="Direct link to DHTMLX Gantt features" title="Direct link to DHTMLX Gantt features" translate="no">​</a></h3>
<p>The Standard (GPL) edition includes drag-and-drop task editing, dependency links, zoom levels, and collapsible task trees. Auto-scheduling, critical path analysis, resource management, baselines, and split tasks are available in the Pro edition only.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-pricing">DHTMLX Gantt pricing<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#dhtmlx-gantt-pricing" class="hash-link" aria-label="Direct link to DHTMLX Gantt pricing" title="Direct link to DHTMLX Gantt pricing" translate="no">​</a></h3>
<p>The Standard edition is free under the GPL license for open-source projects. Commercial licenses are per-developer perpetual: Individual at $699, Commercial at $1,399, Enterprise at $2,999, and Ultimate at $5,999.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-gantt">Pros of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#pros-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Pros of DHTMLX Gantt" title="Direct link to Pros of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard edition is genuinely free for open-source projects.</li>
<li class="">Pricing is published and per-developer perpetual.</li>
<li class="">Package is available on the public npm registry without authentication.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-gantt">Cons of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#cons-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Cons of DHTMLX Gantt" title="Direct link to Cons of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">No official LWC integration guide.</li>
<li class="">The global singleton architecture means only one Gantt instance can run per page.</li>
<li class="">Auto-scheduling, critical path, and resource management require the Pro edition.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt">Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#syncfusion-gantt" class="hash-link" aria-label="Direct link to Syncfusion Gantt" title="Direct link to Syncfusion Gantt" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/javascript-ui-controls/js-gantt-chart" target="_blank" rel="noopener noreferrer" class="">Syncfusion Gantt</a> provides EJ2 components that work in LWC environments through the npm modules path. Syncfusion publishes a dedicated <a href="https://ej2.syncfusion.com/documentation/gantt/how-to/salesforce" target="_blank" rel="noopener noreferrer" class="">Salesforce integration guide</a> covering the setup steps specific to Salesforce DX. The library covers the full scheduling feature set and is available under a Community License for qualifying teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-gantt-in-lwc">Getting started with Syncfusion Gantt in LWC<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#getting-started-with-syncfusion-gantt-in-lwc" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Gantt in LWC" title="Direct link to Getting started with Syncfusion Gantt in LWC" translate="no">​</a></h3>
<p>Install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-gantt</span><br></div></code></pre></div></div>
<p>Create the LWC HTML template (<code>syncfusionGantt.html</code>):</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name namespace" style="color:rgb(156, 220, 254)">lwc:</span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dom</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">manual</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag special-attr attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag special-attr attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag special-attr attr-value value css language-css property" style="color:rgb(206, 145, 120)">height</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token tag special-attr attr-value value css language-css" style="color:rgb(206, 145, 120)"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:rgb(181, 206, 168)">600</span><span class="token tag special-attr attr-value value css language-css unit" style="color:rgb(206, 145, 120)">px</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Create the LWC JavaScript file (<code>syncfusionGantt.js</code>):</p>
<div class="language-javascript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-javascript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> LightningElement </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lwc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> registerLicense </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Gantt </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">SyncfusionGantt</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">LightningElement</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    _gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">renderedCallback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">template</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">querySelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'.container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">dataSource</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token literal-property property">subtasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">taskFields</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskID'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'StartDate'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">child</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'subtasks'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">enableCriticalPath</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">disconnectedCallback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt</span><span class="token operator" style="color:rgb(212, 212, 212)">?.</span><span class="token function" style="color:rgb(220, 220, 170)">destroy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Syncfusion requires all dependency CSS files to be loaded as static resources in Salesforce. The required packages are base, buttons, calendars, dropdowns, grids, inputs, layouts, navigations, and gantt. Each CSS file must be uploaded as a separate static resource or bundled before upload.</p>
<p><img decoding="async" loading="lazy" alt="Syncfusion Gantt" src="https://www.react-gantt.com/assets/images/syncfusion-gantt-77a9b1156ed39130b3014fcc7a7d47a8.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-features">Syncfusion Gantt features<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#syncfusion-gantt-features" class="hash-link" aria-label="Direct link to Syncfusion Gantt features" title="Direct link to Syncfusion Gantt features" translate="no">​</a></h3>
<p>Syncfusion Gantt includes auto-scheduling, critical path analysis, baselines, split tasks, resource management, undo/redo, and export. The feature set is comparable to Bryntum Gantt in breadth.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-pricing">Syncfusion Gantt pricing<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#syncfusion-gantt-pricing" class="hash-link" aria-label="Direct link to Syncfusion Gantt pricing" title="Direct link to Syncfusion Gantt pricing" translate="no">​</a></h3>
<p>The Community License is free for organizations with annual gross revenue under $1 million and five or fewer developers. Commercial licensing is quote-based. The Community License covers the full feature set with no feature restrictions.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-gantt">Pros of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#pros-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Pros of Syncfusion Gantt" title="Direct link to Pros of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Official Salesforce integration guide covers the full setup.</li>
<li class="">Community License covers all features at no cost for qualifying teams.</li>
<li class="">Comprehensive feature set including auto-scheduling, baselines, and export.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-gantt">Cons of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#cons-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Cons of Syncfusion Gantt" title="Direct link to Cons of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Loading multiple CSS static resources adds significant Salesforce deployment overhead.</li>
<li class="">Commercial pricing is not publicly listed.</li>
<li class="">License key registration must happen at module load time, which requires care in Salesforce's module execution model.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt">DayPilot Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#daypilot-gantt" class="hash-link" aria-label="Direct link to DayPilot Gantt" title="Direct link to DayPilot Gantt" translate="no">​</a></h2>
<p><a href="https://doc.daypilot.org/gantt/" target="_blank" rel="noopener noreferrer" class="">DayPilot</a> provides framework-agnostic JavaScript scheduler components that can be embedded in LWC using manual DOM injection. The free lite package is available on the public npm registry. The Pro version unlocks timeline extensions, drag-and-drop, and row headers.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-gantt-in-lwc">Getting started with DayPilot Gantt in LWC<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#getting-started-with-daypilot-gantt-in-lwc" class="hash-link" aria-label="Direct link to Getting started with DayPilot Gantt in LWC" title="Direct link to Getting started with DayPilot Gantt in LWC" translate="no">​</a></h3>
<p>Install the lite package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @daypilot/daypilot-lite-javascript</span><br></div></code></pre></div></div>
<p>Create the LWC HTML template (<code>daypilotGantt.html</code>):</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name namespace" style="color:rgb(156, 220, 254)">lwc:</span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dom</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">manual</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag special-attr attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag special-attr attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag special-attr attr-value value css language-css property" style="color:rgb(206, 145, 120)">height</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token tag special-attr attr-value value css language-css" style="color:rgb(206, 145, 120)"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:rgb(181, 206, 168)">400</span><span class="token tag special-attr attr-value value css language-css unit" style="color:rgb(206, 145, 120)">px</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token tag special-attr attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Create the LWC JavaScript file (<code>daypilotGantt.js</code>):</p>
<div class="language-javascript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-javascript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> LightningElement </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lwc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> DayPilot </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@daypilot/daypilot-lite-javascript'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DaypilotGantt</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">LightningElement</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    _gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">renderedCallback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DayPilot</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">template</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">querySelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'.container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">days</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">tasks</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-06'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>There is no official LWC guide from DayPilot. The component works through the same manual DOM injection pattern used by the other libraries in this comparison.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-features">DayPilot Gantt features<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#daypilot-gantt-features" class="hash-link" aria-label="Direct link to DayPilot Gantt features" title="Direct link to DayPilot Gantt features" translate="no">​</a></h3>
<p>DayPilot Gantt supports dependency links, drag-and-drop task editing, task completion percentages, and a UI Builder for configuring the component visually. It does not include an auto-scheduling engine, so task dates do not recalculate automatically when dependencies change.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-pricing">DayPilot Gantt pricing<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#daypilot-gantt-pricing" class="hash-link" aria-label="Direct link to DayPilot Gantt pricing" title="Direct link to DayPilot Gantt pricing" translate="no">​</a></h3>
<p>DayPilot Pro licenses start at $899 per developer as a perpetual license. The lite package is free.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-gantt">Pros of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#pros-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Pros of DayPilot Gantt" title="Direct link to Pros of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">Lite package is free and available on the public npm registry.</li>
<li class="">UI Builder lets you configure the Gantt visually and export the resulting configuration.</li>
<li class="">Framework-agnostic API works with LWC's manual DOM injection pattern.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-gantt">Cons of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#cons-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Cons of DayPilot Gantt" title="Direct link to Cons of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">No auto-scheduling engine: dependent task dates must be managed manually.</li>
<li class="">No official LWC integration guide.</li>
<li class="">The Pro package is not available on the public npm registry.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="frappe-gantt">Frappe Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#frappe-gantt" class="hash-link" aria-label="Direct link to Frappe Gantt" title="Direct link to Frappe Gantt" translate="no">​</a></h2>
<p><a href="https://frappe.io/gantt" target="_blank" rel="noopener noreferrer" class="">Frappe Gantt</a> is an MIT-licensed open-source Gantt component built with vanilla JavaScript and SVG. It renders entirely to an SVG element, which means the LWC template must contain an <code>svg</code> element inside the manual DOM container rather than a plain <code>div</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-frappe-gantt-in-lwc">Getting started with Frappe Gantt in LWC<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#getting-started-with-frappe-gantt-in-lwc" class="hash-link" aria-label="Direct link to Getting started with Frappe Gantt in LWC" title="Direct link to Getting started with Frappe Gantt in LWC" translate="no">​</a></h3>
<p>Install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> frappe-gantt</span><br></div></code></pre></div></div>
<p>Create the LWC HTML template (<code>frappeGantt.html</code>):</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name namespace" style="color:rgb(156, 220, 254)">lwc:</span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dom</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">manual</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">svg</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">gantt</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">svg</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">template</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Create the LWC JavaScript file (<code>frappeGantt.js</code>):</p>
<div class="language-javascript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-javascript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> LightningElement </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lwc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> Gantt </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'frappe-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">FrappeGantt</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">LightningElement</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    _gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">renderedCallback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> tasks </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">id</span><span class="token plain">           </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">name</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">start</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">end</span><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-06'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">progress</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">dependencies</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">id</span><span class="token plain">           </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">name</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">start</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">end</span><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">progress</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token literal-property property">dependencies</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-1'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">template</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">querySelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'.gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">view_mode</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Week'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>CSS must be loaded as a static resource in Salesforce. Frappe Gantt has no auto-scheduling engine, no resource management, and no critical path. Tasks are positioned by explicit start and end dates only.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="frappe-gantt-features">Frappe Gantt features<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#frappe-gantt-features" class="hash-link" aria-label="Direct link to Frappe Gantt features" title="Direct link to Frappe Gantt features" translate="no">​</a></h3>
<p>Frappe Gantt renders a visual timeline from explicit task dates with progress indicators and dependency arrows between tasks. It supports view mode switching between Hour, Quarter Day, Half Day, Day, Week, and Month. There is no scheduling engine, no resource management, and no export functionality.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="frappe-gantt-pricing">Frappe Gantt pricing<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#frappe-gantt-pricing" class="hash-link" aria-label="Direct link to Frappe Gantt pricing" title="Direct link to Frappe Gantt pricing" translate="no">​</a></h3>
<p>Frappe Gantt is free under the MIT license. There is no commercial tier.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-frappe-gantt">Pros of Frappe Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#pros-of-frappe-gantt" class="hash-link" aria-label="Direct link to Pros of Frappe Gantt" title="Direct link to Pros of Frappe Gantt" translate="no">​</a></h3>
<ul>
<li class="">MIT license with no cost and no usage restrictions.</li>
<li class="">Zero configuration for basic timeline visualization.</li>
<li class="">SVG-based rendering is lightweight and has no external style dependencies beyond the single CSS file.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-frappe-gantt">Cons of Frappe Gantt<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#cons-of-frappe-gantt" class="hash-link" aria-label="Direct link to Cons of Frappe Gantt" title="Direct link to Cons of Frappe Gantt" translate="no">​</a></h3>
<ul>
<li class="">No auto-scheduling engine, no critical path, and no resource management.</li>
<li class="">No export functionality.</li>
<li class="">No official LWC integration guide.</li>
<li class="">SVG-based rendering requires an <code>svg</code> element in the LWC template rather than a plain container div.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-gantt-chart-components-for-salesforce/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below summarizes the key capabilities across all five libraries.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:left">Bryntum Gantt</th><th style="text-align:left">DHTMLX Gantt</th><th style="text-align:left">Syncfusion Gantt</th><th style="text-align:left">DayPilot Gantt</th><th style="text-align:left">Frappe Gantt</th></tr></thead><tbody><tr><td style="text-align:left">Auto-scheduling</td><td style="text-align:left">Yes</td><td style="text-align:left">Pro only</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Critical path</td><td style="text-align:left">Yes</td><td style="text-align:left">Pro only</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">LWC support</td><td style="text-align:left">Official guide</td><td style="text-align:left">Manual (no guide)</td><td style="text-align:left">Official guide</td><td style="text-align:left">Manual (no guide)</td><td style="text-align:left">Manual (no guide)</td></tr><tr><td style="text-align:left">Client-side export</td><td style="text-align:left">PDF/PNG/Excel/XML</td><td style="text-align:left">Pro only</td><td style="text-align:left">Yes</td><td style="text-align:left">Limited</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Free or open-source tier</td><td style="text-align:left">Trial only</td><td style="text-align:left">GPL Standard</td><td style="text-align:left">Community License</td><td style="text-align:left">Lite package</td><td style="text-align:left">MIT</td></tr></tbody></table></div>
<p>The table below maps common project requirements to the library best suited for each.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Use case</th><th style="text-align:left">Recommended library</th></tr></thead><tbody><tr><td style="text-align:left">Enterprise Salesforce app requiring a full scheduling engine and official LWC guide</td><td style="text-align:left">Bryntum Gantt</td></tr><tr><td style="text-align:left">Full-featured Gantt with a free Community License for qualifying teams</td><td style="text-align:left">Syncfusion Gantt</td></tr><tr><td style="text-align:left">Open-source or GPL-licensed project with minimal integration requirements</td><td style="text-align:left">DHTMLX Gantt Standard</td></tr><tr><td style="text-align:left">Simple read-only Gantt visualization with no licensing cost</td><td style="text-align:left">Frappe Gantt</td></tr></tbody></table></div>
<p>For most Salesforce teams building a project management interface, Bryntum Gantt and Syncfusion Gantt are the strongest choices. Both provide official Salesforce integration documentation, and both include a complete scheduling engine in the base product. Bryntum Gantt adds MCP server support and a Claude Code skill that make it well suited to teams using AI coding assistants. Syncfusion Gantt's Community License is the practical choice for smaller teams that qualify.</p>
<p>DHTMLX Gantt is worth evaluating when the project is open-source and the GPL license fits. The absence of an official LWC guide is a real integration cost, and the global singleton architecture means only one instance can run per Lightning page. DayPilot is a reasonable option when you need a lightweight component and do not require automatic dependency scheduling. Frappe Gantt covers the narrow case where you need a simple, free Gantt timeline with no scheduling logic and no licensing overhead.</p>]]></content:encoded>
            <category>gantt</category>
        </item>
        <item>
            <title><![CDATA[Best JavaScript event calendar components]]></title>
            <link>https://www.react-gantt.com/content/best-javascript-event-calendar-components/</link>
            <guid>https://www.react-gantt.com/content/best-javascript-event-calendar-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When choosing a JavaScript event calendar, the main risk is not picking the wrong month grid.]]></description>
            <content:encoded><![CDATA[<p>When choosing a JavaScript event calendar, the main risk is not picking the wrong month grid. The risk is choosing a library that cannot support the next requirement: resource scheduling, recurrence, mobile interaction, time zone handling, or framework integration. That mistake turns a component decision into weeks of custom scheduling work.</p>
<p>This article compares five JavaScript event calendar components using the criteria below.</p>
<ul>
<li class="">Installation and package access.</li>
<li class="">Standard calendar views.</li>
<li class="">Resource scheduling and recurring events.</li>
<li class="">Pricing and license tiers.</li>
<li class="">When Bryntum Calendar is the better production choice.</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar">Bryntum Calendar<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#bryntum-calendar" class="hash-link" aria-label="Direct link to Bryntum Calendar" title="Direct link to Bryntum Calendar" translate="no">​</a></h2>
<p>Built by Bryntum, a Swedish software company specializing in scheduling and data visualization products, Bryntum Calendar is a commercial JavaScript component. The <a href="https://bryntum.com/products/calendar/docs/guide/Calendar/quick-start/javascript" target="_blank" rel="noopener noreferrer" class="">Bryntum Calendar JavaScript quick start</a> covers the full setup path. It is part of a larger suite that includes Gantt, Scheduler, and Grid components, all of which share a common core and can be combined in a single application. Bryntum Calendar stands out for the depth of its view options, its resource scheduling capabilities, and CSS variable theming that covers most white-labeling requirements without custom overrides.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Calendar" src="https://www.react-gantt.com/assets/images/bryntum-calendar-70dce206121152f0d903196195e93e01.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-setup-with-plain-javascript">Bryntum Calendar setup with plain JavaScript<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#bryntum-calendar-setup-with-plain-javascript" class="hash-link" aria-label="Direct link to Bryntum Calendar setup with plain JavaScript" title="Direct link to Bryntum Calendar setup with plain JavaScript" translate="no">​</a></h3>
<p>Install the package from the Bryntum npm registry after registering for a trial or purchasing a license.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar@7.3.0</span><br></div></code></pre></div></div>
<p>CSS files must be imported in a specific order for the component to render correctly.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fonts/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fonts/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/calendar.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/calendar.svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Calendar </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> calendar </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Calendar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">appendTo</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">date</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">resources</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bryntum team'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hotel Park'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'michael'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Michael Johnson'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'deep-orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">events</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hackathon 2025'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                       </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-11T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-18T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">allDay</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'green'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Breakfast'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                            </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team Scrum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                           </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Scheduler Grid introduction + review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-includes-resource-scheduling-and-theming-depth">Bryntum Calendar includes resource scheduling and theming depth<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#bryntum-calendar-includes-resource-scheduling-and-theming-depth" class="hash-link" aria-label="Direct link to Bryntum Calendar includes resource scheduling and theming depth" title="Direct link to Bryntum Calendar includes resource scheduling and theming depth" translate="no">​</a></h3>
<p>Bryntum Calendar ships with a comprehensive set of built-in capabilities.</p>
<ul>
<li class=""><strong>Multiple views:</strong> Day, week, month, agenda, and year views are all included without requiring separate plugins.</li>
<li class=""><strong>Resource scheduling:</strong> Events can be assigned to named resources and displayed in a resource-aware calendar view for room booking or staff planning scenarios.</li>
<li class=""><strong>Recurring events with RRULE:</strong> The component supports the iCalendar RRULE standard, so recurring patterns such as "every second Tuesday" work without custom logic.</li>
<li class=""><strong>Drag-and-drop and event resizing:</strong> Both are built in and work across all views without any additional configuration.</li>
<li class=""><strong>Time zone support:</strong> The component handles time zone conversion internally, which is critical for applications with users across multiple regions.</li>
<li class=""><strong>CSS variable theming:</strong> All visual properties are exposed as CSS custom properties, making it possible to match any design system without overriding internal styles.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-starts-with-the-small-team-license">Bryntum Calendar starts with the Small Team license<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#bryntum-calendar-starts-with-the-small-team-license" class="hash-link" aria-label="Direct link to Bryntum Calendar starts with the Small Team license" title="Direct link to Bryntum Calendar starts with the Small Team license" translate="no">​</a></h3>
<p>Bryntum Calendar requires a paid license at $680 per developer for the <strong>Small Team</strong> license, with a minimum of three developers and 12 months of updates included. A free trial is available from the Bryntum website.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-scales-with-growing-scheduling-requirements">Bryntum Calendar scales with growing scheduling requirements<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#bryntum-calendar-scales-with-growing-scheduling-requirements" class="hash-link" aria-label="Direct link to Bryntum Calendar scales with growing scheduling requirements" title="Direct link to Bryntum Calendar scales with growing scheduling requirements" translate="no">​</a></h3>
<p>Bryntum Calendar stands out for three reasons.</p>
<ul>
<li class="">All major calendar views and resource scheduling are available without add-on purchases.</li>
<li class="">The TypeScript definitions are comprehensive and maintained alongside the component source.</li>
<li class="">The shared core with other Bryntum products means adding a Gantt or Scheduler to the same project requires no new dependencies.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-adds-commercial-cost-and-bundle-weight">Bryntum Calendar adds commercial cost and bundle weight<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#bryntum-calendar-adds-commercial-cost-and-bundle-weight" class="hash-link" aria-label="Direct link to Bryntum Calendar adds commercial cost and bundle weight" title="Direct link to Bryntum Calendar adds commercial cost and bundle weight" translate="no">​</a></h3>
<p>Three limitations apply when evaluating Bryntum Calendar.</p>
<ul>
<li class="">The per-developer cost adds up quickly for larger teams.</li>
<li class="">The learning curve for the configuration API is steeper than lighter alternatives.</li>
<li class="">Licensed packages require Bryntum npm access, while trial packages can be installed from the public npm registry using package aliases.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar">FullCalendar<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#fullcalendar" class="hash-link" aria-label="Direct link to FullCalendar" title="Direct link to FullCalendar" translate="no">​</a></h2>
<p>Maintained by a small commercial team that also sells premium add-ons, FullCalendar ranks among the most widely used open-source JavaScript calendar libraries. The core package is MIT-licensed and covers the most common calendar views, while resource scheduling and a few other features are gated behind <strong>FullCalendar Premium</strong>. FullCalendar has integrations for React, Vue, and Angular in addition to the framework-agnostic plain JavaScript package.</p>
<p><img decoding="async" loading="lazy" alt="FullCalendar" src="https://www.react-gantt.com/assets/images/fullcalendar-f424f641430ab0ee0ea9a350d153db7b.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-setup-with-plain-javascript-plugins">FullCalendar setup with plain JavaScript plugins<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#fullcalendar-setup-with-plain-javascript-plugins" class="hash-link" aria-label="Direct link to FullCalendar setup with plain JavaScript plugins" title="Direct link to FullCalendar setup with plain JavaScript plugins" translate="no">​</a></h3>
<p>Install the core package along with the view plugins you need.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @fullcalendar/core @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/list</span><br></div></code></pre></div></div>
<p>Pass the plugins to the Calendar constructor and call <code>render()</code> to mount the component.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Calendar </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> dayGridPlugin </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/daygrid'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> el </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> cal </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Calendar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">el</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">plugins</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">dayGridPlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">initialView</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dayGridMonth'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">events</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">end</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10T09:30:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">cal</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">render</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-covers-standard-event-calendars-without-resource-views">FullCalendar covers standard event calendars without resource views<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#fullcalendar-covers-standard-event-calendars-without-resource-views" class="hash-link" aria-label="Direct link to FullCalendar covers standard event calendars without resource views" title="Direct link to FullCalendar covers standard event calendars without resource views" translate="no">​</a></h3>
<p>The FullCalendar core offers a solid baseline for most calendar use cases.</p>
<ul>
<li class=""><strong>Standard calendar views:</strong> Day, week, month, and list views are available as separate plugins, so only the needed views are bundled.</li>
<li class=""><strong>Locale support:</strong> More than 70 locales are included, covering date formatting, week start day, and direction for right-to-left languages.</li>
<li class=""><strong>RRULE recurring events:</strong> The <code>@fullcalendar/rrule</code> plugin adds iCalendar-compliant recurring event support.</li>
<li class=""><strong>Resource views (premium):</strong> Room and staff scheduling views are available through the premium <code>@fullcalendar/resource-*</code> packages.</li>
<li class=""><strong>Drag-and-drop via plugin:</strong> The <code>@fullcalendar/interaction</code> plugin adds dragging, resizing, and date selection.</li>
<li class=""><strong>JSON data source:</strong> Events can be loaded from a remote URL with built-in fetch and date-range parameters.</li>
</ul>
<p>FullCalendar is easier to start with for a free event calendar, but Bryntum Calendar covers more production scheduling needs without assembling plugins.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-keeps-core-views-free-and-charges-for-resource-scheduling">FullCalendar keeps core views free and charges for resource scheduling<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#fullcalendar-keeps-core-views-free-and-charges-for-resource-scheduling" class="hash-link" aria-label="Direct link to FullCalendar keeps core views free and charges for resource scheduling" title="Direct link to FullCalendar keeps core views free and charges for resource scheduling" translate="no">​</a></h3>
<p>The core library is MIT-licensed and free. <strong>FullCalendar Premium</strong>, which includes resource scheduling features, starts at $480 per year.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-has-extensive-open-source-documentation-and-examples">FullCalendar has extensive open-source documentation and examples<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#fullcalendar-has-extensive-open-source-documentation-and-examples" class="hash-link" aria-label="Direct link to FullCalendar has extensive open-source documentation and examples" title="Direct link to FullCalendar has extensive open-source documentation and examples" translate="no">​</a></h3>
<p>FullCalendar has three clear advantages.</p>
<ul>
<li class="">The MIT core covers a large portion of common calendar requirements at no cost.</li>
<li class="">The large community means abundant tutorials, Stack Overflow answers, and third-party plugins.</li>
<li class="">Framework adapters for React, Vue, and Angular are maintained by the same team as the core library.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-needs-paid-add-ons-for-scheduler-style-features">FullCalendar needs paid add-ons for scheduler-style features<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#fullcalendar-needs-paid-add-ons-for-scheduler-style-features" class="hash-link" aria-label="Direct link to FullCalendar needs paid add-ons for scheduler-style features" title="Direct link to FullCalendar needs paid add-ons for scheduler-style features" translate="no">​</a></h3>
<p>Three limitations come with FullCalendar.</p>
<ul>
<li class="">Resource scheduling sits behind <strong>FullCalendar Premium</strong>.</li>
<li class="">The plugin architecture means more packages to install and manage for a fully featured setup.</li>
<li class="">The API surface has changed significantly across major versions, so upgrading can require code changes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x">Schedule-X<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#schedule-x" class="hash-link" aria-label="Direct link to Schedule-X" title="Direct link to Schedule-X" translate="no">​</a></h2>
<p>Schedule-X takes a TypeScript-first, framework-agnostic approach to event calendars, built as a modern alternative to older libraries. It is designed around a plugin architecture where functionality such as drag-and-drop and recurrence are optional add-ons rather than bundled defaults. The project is open source under the MIT license, with Premium plugins available for more advanced features.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-setup-with-its-typescript-first-calendar-core">Schedule-X setup with its TypeScript-first calendar core<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#schedule-x-setup-with-its-typescript-first-calendar-core" class="hash-link" aria-label="Direct link to Schedule-X setup with its TypeScript-first calendar core" title="Direct link to Schedule-X setup with its TypeScript-first calendar core" translate="no">​</a></h3>
<p>Install the calendar core package and the default theme.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @schedule-x/calendar @schedule-x/theme-default</span><br></div></code></pre></div></div>
<p>Use the <code>createCalendar</code> factory function and call <code>render</code> with a DOM element.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> createCalendar </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/theme-default/dist/index.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> cal </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createCalendar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">selectedDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">events</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">id</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">end</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10 09:30'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">cal</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">render</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-keeps-plain-javascript-calendars-modular-and-typed">Schedule-X keeps plain JavaScript calendars modular and typed<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#schedule-x-keeps-plain-javascript-calendars-modular-and-typed" class="hash-link" aria-label="Direct link to Schedule-X keeps plain JavaScript calendars modular and typed" title="Direct link to Schedule-X keeps plain JavaScript calendars modular and typed" translate="no">​</a></h3>
<p>Schedule-X keeps the core lean and builds additional capability through plugins.</p>
<ul>
<li class=""><strong>Day, week, and month views:</strong> The standard calendar views are included in the core package with a clean default visual style.</li>
<li class=""><strong>Plugin architecture:</strong> Features like event recurrence and scroll-to-time are individual plugins, keeping bundle size controlled.</li>
<li class=""><strong>Premium drag-and-drop plugin:</strong> Moving and resizing events requires a Schedule-X <strong>Premium</strong> drag-and-drop plugin.</li>
<li class=""><strong>Recurrence via plugin:</strong> The <code>@schedule-x/event-recurrence</code> package adds RRULE support without bloating the core.</li>
<li class=""><strong>Custom event rendering:</strong> A custom render function controls how events appear in any view.</li>
<li class=""><strong>Keyboard navigation:</strong> Built-in keyboard support improves accessibility without requiring additional configuration.</li>
</ul>
<p>Schedule-X keeps the JavaScript calendar core smaller, while Bryntum Calendar ships more of the scheduling workflow in the base package.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-pricing-separates-free-core-and-premium-plugins">Schedule-X pricing separates free core and Premium plugins<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#schedule-x-pricing-separates-free-core-and-premium-plugins" class="hash-link" aria-label="Direct link to Schedule-X pricing separates free core and Premium plugins" title="Direct link to Schedule-X pricing separates free core and Premium plugins" translate="no">​</a></h3>
<p>Schedule-X core is MIT-licensed and free. Premium plugins, including resource view, drag-and-drop, drag-to-create, and event forms, start at €479 per year for two to three developers or €999 for a lifetime license with one year of updates.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-prioritizes-bundle-size-and-type-safety">Schedule-X prioritizes bundle size and type safety<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#schedule-x-prioritizes-bundle-size-and-type-safety" class="hash-link" aria-label="Direct link to Schedule-X prioritizes bundle size and type safety" title="Direct link to Schedule-X prioritizes bundle size and type safety" translate="no">​</a></h3>
<p>Schedule-X has three notable advantages for TypeScript-first projects.</p>
<ul>
<li class="">The TypeScript-first design gives excellent editor autocompletion and type safety out of the box.</li>
<li class="">The plugin architecture keeps the default bundle small, with byte cost proportional to what is used.</li>
<li class="">Framework adapters for React, Vue, and Angular are available alongside the plain JavaScript package.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-lacks-the-view-depth-of-older-calendar-libraries">Schedule-X lacks the view depth of older calendar libraries<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#schedule-x-lacks-the-view-depth-of-older-calendar-libraries" class="hash-link" aria-label="Direct link to Schedule-X lacks the view depth of older calendar libraries" title="Direct link to Schedule-X lacks the view depth of older calendar libraries" translate="no">​</a></h3>
<p>Three limitations restrict Schedule-X for some projects.</p>
<ul>
<li class="">Resource scheduling is not available in the current version, which rules out room booking and staff planning use cases.</li>
<li class="">The community is smaller than FullCalendar, meaning fewer third-party resources and forum answers.</li>
<li class="">As a newer project, it has less production mileage than the more established alternatives on this list.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p>Produced by DHTMLX, a company with more than 20 years of experience in web UI components, DHTMLX Scheduler is a commercial JavaScript event calendar. The library follows a global-singleton API pattern where a single <code>scheduler</code> object manages all calendar state, which differs from the instance-based approach used by most other libraries on this list. It is available as a trial package on npm and as a licensed package for production use.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler" src="https://www.react-gantt.com/assets/images/dhtmlx-calendar-0fd1d8cd7c8d49686435e42b25656815.png" width="2880" height="1564" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-setup-with-its-singleton-api">DHTMLX Scheduler setup with its singleton API<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#dhtmlx-scheduler-setup-with-its-singleton-api" class="hash-link" aria-label="Direct link to DHTMLX Scheduler setup with its singleton API" title="Direct link to DHTMLX Scheduler setup with its singleton API" translate="no">​</a></h3>
<p>Install the trial package to evaluate the library.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @dhtmlx/trial-scheduler</span><br></div></code></pre></div></div>
<p>Initialize the scheduler on a container element, then load events using <code>parse</code>.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> scheduler </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@dhtmlx/trial-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@dhtmlx/trial-scheduler/codebase/dhtmlxscheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'month'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">text</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">start_date</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">end_date</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10 09:30'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// When unmounting, clear the scheduler state:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// scheduler.clearAll();</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-uses-an-imperative-singleton-api">DHTMLX Scheduler uses an imperative singleton API<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#dhtmlx-scheduler-uses-an-imperative-singleton-api" class="hash-link" aria-label="Direct link to DHTMLX Scheduler uses an imperative singleton API" title="Direct link to DHTMLX Scheduler uses an imperative singleton API" translate="no">​</a></h3>
<p>DHTMLX Scheduler covers a broad range of calendar and scheduling views.</p>
<ul>
<li class=""><strong>Multiple views:</strong> Day, week, month, timeline, and agenda views are included, with the timeline view being particularly useful for resource scheduling.</li>
<li class=""><strong>Recurring events:</strong> The built-in recurring event module supports daily, weekly, monthly, and yearly patterns with exception handling.</li>
<li class=""><strong>Resource view (PRO):</strong> The <strong>PRO</strong> Timeline extension displays events across multiple resources in a horizontal swimlane layout.</li>
<li class=""><strong>Drag-and-drop:</strong> Events can be dragged and resized within and across views without any additional plugins.</li>
<li class=""><strong>Data export:</strong> Built-in support for exporting calendar data to PDF and Excel is available through server-side and client-side export modules.</li>
<li class=""><strong>REST backend integration:</strong> The <code>dataProcessor</code> module keeps the calendar in sync with a REST API, handling create, update, and delete operations automatically.</li>
</ul>
<p>DHTMLX Scheduler gives teams a mature imperative API, but Bryntum Calendar offers a more modern package for teams working across React, Angular, Vue, and plain JavaScript.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing-separates-gpl-and-pro-use">DHTMLX Scheduler pricing separates GPL and PRO use<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#dhtmlx-scheduler-pricing-separates-gpl-and-pro-use" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" title="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" translate="no">​</a></h3>
<p>DHTMLX Scheduler <strong>Standard</strong> is available under GPL v2 for GPL-compatible open-source projects. Paid <strong>PRO</strong> licenses start with the <strong>Individual</strong> tier at $599, and DHTMLX lists <strong>Commercial</strong>, <strong>Enterprise</strong>, and <strong>Ultimate</strong> tiers for larger teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-brings-mature-scheduler-features-to-javascript-apps">DHTMLX Scheduler brings mature scheduler features to JavaScript apps<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#dhtmlx-scheduler-brings-mature-scheduler-features-to-javascript-apps" class="hash-link" aria-label="Direct link to DHTMLX Scheduler brings mature scheduler features to JavaScript apps" title="Direct link to DHTMLX Scheduler brings mature scheduler features to JavaScript apps" translate="no">​</a></h3>
<p>DHTMLX Scheduler has three notable strengths.</p>
<ul>
<li class="">The timeline and swimlane views are well-suited to resource scheduling scenarios such as room booking and equipment allocation.</li>
<li class="">The data export capabilities for PDF and Excel are built in rather than requiring third-party libraries.</li>
<li class="">The long product history means the library is stable and well-documented with many real-world usage examples.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-feels-older-than-modern-modular-calendars">DHTMLX Scheduler feels older than modern modular calendars<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#dhtmlx-scheduler-feels-older-than-modern-modular-calendars" class="hash-link" aria-label="Direct link to DHTMLX Scheduler feels older than modern modular calendars" title="Direct link to DHTMLX Scheduler feels older than modern modular calendars" translate="no">​</a></h3>
<p>Three limitations apply when using DHTMLX Scheduler.</p>
<ul>
<li class="">The global-singleton API makes it harder to mount more than one calendar instance on the same page.</li>
<li class="">TypeScript support is available but less comprehensive than TypeScript-first alternatives.</li>
<li class="">The trial package on npm displays a watermark, so switching to the licensed package requires changing the import path.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p>Produced by Mobiscroll, a company focused on mobile-optimized UI components, Mobiscroll Event Calendar is a commercial component. The library is distributed as part of the <code>@mobiscroll/javascript</code> package and is designed to deliver native-quality touch interactions on iOS and Android web views as well as desktop browsers. It supports multiple themes including iOS, Material, and Windows to match platform conventions.</p>
<p><img decoding="async" loading="lazy" alt="Mobiscroll Event Calendar" src="https://www.react-gantt.com/assets/images/mobiscroll-calendar-cd4f3cb5356370346e5d25e1de657bbe.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-setup-with-private-registry-access">Mobiscroll Event Calendar setup with private registry access<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#mobiscroll-event-calendar-setup-with-private-registry-access" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar setup with private registry access" title="Direct link to Mobiscroll Event Calendar setup with private registry access" translate="no">​</a></h3>
<p>Install the Mobiscroll JavaScript package after registering on the Mobiscroll website.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/javascript</span><br></div></code></pre></div></div>
<p>Import the CSS and initialize the event calendar on a container element.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/javascript/dist/css/mobiscroll.min.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> mobiscroll </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/javascript'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10T09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">end</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2024-06-10T09:30'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">mobiscroll</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">eventcalendar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'#calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">view</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">calendar</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'month'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">data</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> events</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-focuses-on-mobile-web-calendars">Mobiscroll Event Calendar focuses on mobile web calendars<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#mobiscroll-event-calendar-focuses-on-mobile-web-calendars" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar focuses on mobile web calendars" title="Direct link to Mobiscroll Event Calendar focuses on mobile web calendars" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar covers a wide range of views with a strong emphasis on touch usability.</p>
<ul>
<li class=""><strong>Calendar, agenda, timeline, and scheduler views:</strong> All four view types are included, making it possible to switch between summary and detailed resource views within the same application.</li>
<li class=""><strong>Native-quality touch gestures:</strong> Swipe navigation, pinch-to-zoom on timeline views, and momentum scrolling are implemented to match the behavior of native mobile calendar apps.</li>
<li class=""><strong>Recurring events:</strong> The Mobiscroll-specific recurrence configuration handles common patterns and exception dates.</li>
<li class=""><strong>Resource scheduling:</strong> Events can be assigned to resources and displayed in a swimlane timeline or scheduler view.</li>
<li class=""><strong>Platform themes:</strong> Built-in iOS, Material, and Windows themes mean the component can match the platform conventions of the surrounding app without custom CSS.</li>
<li class=""><strong>Offline data support:</strong> The component works with locally cached event data, which is important for progressive web apps that need to function without a network connection.</li>
</ul>
<p>Mobiscroll has the advantage for mobile-first interaction, while Bryntum Calendar has the advantage for resource scheduling depth and multi-framework use.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-starts-with-an-internal-project-license">Mobiscroll Event Calendar starts with an internal project license<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#mobiscroll-event-calendar-starts-with-an-internal-project-license" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar starts with an internal project license" title="Direct link to Mobiscroll Event Calendar starts with an internal project license" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 for a single internal project as a perpetual license. The <strong>Complete</strong> internal project license starts at $1,955 and adds the full product set, source code, and priority support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-prioritizes-touch-interaction">Mobiscroll Event Calendar prioritizes touch interaction<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#mobiscroll-event-calendar-prioritizes-touch-interaction" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar prioritizes touch interaction" title="Direct link to Mobiscroll Event Calendar prioritizes touch interaction" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar is the strongest choice for mobile-first projects.</p>
<ul>
<li class="">The mobile touch experience is the best of any component on this list, making it the right choice for web apps that must feel native on phones and tablets.</li>
<li class="">All four view types, including resource scheduling, are available under a single license with no premium tier.</li>
<li class="">The platform-matching themes reduce the amount of custom CSS needed when targeting iOS or Android web views.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-adds-project-licensing-and-registry-setup">Mobiscroll Event Calendar adds project licensing and registry setup<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#mobiscroll-event-calendar-adds-project-licensing-and-registry-setup" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar adds project licensing and registry setup" title="Direct link to Mobiscroll Event Calendar adds project licensing and registry setup" translate="no">​</a></h3>
<p>Three limitations apply before choosing Mobiscroll.</p>
<ul>
<li class="">Multi-project product teams need a higher tier or a SaaS license.</li>
<li class="">The package requires registration with Mobiscroll before installation, adding friction compared to public npm packages.</li>
<li class="">Framework-specific integrations are sold as separate packages, so teams using React or Angular need to purchase the corresponding product rather than the plain JavaScript one.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="which-javascript-event-calendar-should-you-choose">Which JavaScript event calendar should you choose?<a href="https://www.react-gantt.com/content/best-javascript-event-calendar-components/#which-javascript-event-calendar-should-you-choose" class="hash-link" aria-label="Direct link to Which JavaScript event calendar should you choose?" title="Direct link to Which JavaScript event calendar should you choose?" translate="no">​</a></h2>
<p>The table below summarizes how each component compares across the features that matter most in a production calendar implementation.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Component</th><th>Open source</th><th>Resource scheduling</th><th>Recurring events</th><th>TypeScript</th><th>Mobile optimized</th><th>Price</th></tr></thead><tbody><tr><td>Bryntum Calendar</td><td>✗</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>$680/developer</td></tr><tr><td>FullCalendar</td><td>✓ (core)</td><td>✓ (premium)</td><td>✓</td><td>✓</td><td>✓</td><td>Free / from $480 per year</td></tr><tr><td>Schedule-X</td><td>✓</td><td>Premium</td><td>✓ (plugin)</td><td>✓</td><td>✓</td><td>Free core / Premium plugins</td></tr><tr><td>DHTMLX Scheduler</td><td>✗</td><td>✓ (<strong>PRO</strong>)</td><td>✓</td><td>Partial</td><td>✓</td><td>From $599</td></tr><tr><td>Mobiscroll Event Calendar</td><td>✗</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>From $995/internal project</td></tr></tbody></table></div>
<p>The table below maps common project requirements to the component that fits best.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Recommended component</th></tr></thead><tbody><tr><td>Best for enterprise apps with resource scheduling</td><td>Bryntum Calendar</td></tr><tr><td>Best free and open-source option</td><td>FullCalendar</td></tr><tr><td>Best TypeScript-first modern API</td><td>Schedule-X</td></tr><tr><td>Best mobile and touch UX</td><td>Mobiscroll Event Calendar</td></tr></tbody></table></div>
<p>For teams building an enterprise scheduling application where resource views, recurring events, and TypeScript support are all required from day one, Bryntum Calendar is the strongest all-around choice. The licensing cost is justified by the depth of built-in functionality and the fact that nothing critical sits behind a secondary purchase.</p>
<p>If budget is the primary constraint, the FullCalendar core covers most standard calendar requirements at no cost. Teams that later need resource scheduling can upgrade to the premium tier without migrating to a different library. For projects where TypeScript type safety and a minimal bundle are the priority, Schedule-X offers the cleanest developer experience of any open-source option on this list, provided resource scheduling is not a requirement.</p>
<p>Mobiscroll Event Calendar earns a clear recommendation for any application where mobile users are the primary audience. No other component on this list matches its touch gesture quality, and having all four view types available under a single license removes the uncertainty that comes with tiered pricing.</p>]]></content:encoded>
            <category>calendar</category>
        </item>
        <item>
            <title><![CDATA[Best JavaScript Gantt chart components for enterprise project management]]></title>
            <link>https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/</link>
            <guid>https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Enterprise project management tools place demands on a Gantt chart component that go well beyond basic bar rendering.]]></description>
            <content:encoded><![CDATA[<p>Enterprise project management tools place demands on a Gantt chart component that go well beyond basic bar rendering. Teams need an auto-scheduling engine that propagates changes through task dependencies automatically, critical path visualization to identify schedule risk, resource management to track assignments and capacity, client-side export to PDF or Excel for reporting, and structured data-loading helpers that simplify backend integration. Framework wrappers for React, Angular, and Vue matter too, because most enterprise frontends are built on one of those three. We evaluated five components against those criteria: Bryntum Gantt, DHTMLX Gantt, Syncfusion Gantt, DayPilot Gantt, and Netronic VSW SE.</p>
<p>In this comparison, an enterprise Gantt component ships a scheduling engine rather than drag-and-drop positioning alone. It also includes built-in critical path calculation, resource assignment and histogram views, client-side document export, and framework support for mature engineering organizations. Each section covers installation, a working code example, the enterprise features available, pricing, and trade-offs.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt">Bryntum Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#bryntum-gantt" class="hash-link" aria-label="Direct link to Bryntum Gantt" title="Direct link to Bryntum Gantt" translate="no">​</a></h2>
<p>Bryntum Gantt is a commercial JavaScript component built around the ChronoGraph reactive scheduling engine, which Bryntum open-sources under the MIT license. The engine performs forward- and backward-scheduling automatically whenever task data changes, giving it the broadest scheduling implementation among the components we compared.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-gantt">Getting started with Bryntum Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#getting-started-with-bryntum-gantt" class="hash-link" aria-label="Direct link to Getting started with Bryntum Gantt" title="Direct link to Getting started with Bryntum Gantt" translate="no">​</a></h3>
<p>Bryntum publishes trial packages to the public npm registry. Install the trial with:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt@npm:@bryntum/gantt-trial@7.3.0</span><br></div></code></pre></div></div>
<p>Add a container element and prevent margin collapse on the root:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">html</span><span class="token style language-css selector punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css selector" style="color:rgb(215, 186, 125)"> body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">margin</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">0</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">%</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector id" style="color:rgb(215, 186, 125)">#container</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">vh</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>CSS imports must arrive in this order. The theme file last overrides any defaults:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/gantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Gantt </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">appendTo</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">columns</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">        </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'percentdone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">project</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">tasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Launch SaaS Product'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">expanded</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">35.7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token literal-property property">children</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Install Apache'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Configure firewall'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Run tests'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-21'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">dependencies</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">lag</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Keep all data inside the <code>project</code> property. Never mix the <code>project</code> prop with top-level inline data props such as <code>tasks</code> or <code>dependencies</code>, because that pattern causes the project model to ignore the inline data.</p>
<p>For production backends, replace the inline task data with CrudManager URLs:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token literal-property property">project</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">loadUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/load'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">syncUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/sync'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoLoad</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoSync</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>The CrudManager sends a single HTTP request that loads tasks, dependencies, resources, and assignments in one round trip, and batches writes back in the same structure.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-627cdc5a5d97c6a596d5b811f1dc7b71.png" width="2880" height="1562" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-features">Bryntum Gantt features<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#bryntum-gantt-features" class="hash-link" aria-label="Direct link to Bryntum Gantt features" title="Direct link to Bryntum Gantt features" translate="no">​</a></h3>
<p>Bryntum Gantt covers the full enterprise feature set:</p>
<ul>
<li class="">Auto-scheduling via ChronoGraph with constraint support (start-no-earlier-than, finish-no-later-than, must-start-on, and so on)</li>
<li class="">Critical path visualization with color-coded highlighting</li>
<li class="">Resource management with assignment editing and resource histogram views</li>
<li class="">Baselines and variance tracking against saved snapshots</li>
<li class="">Split tasks and per-task work calendars</li>
<li class="">Undo/redo with configurable history depth</li>
<li class="">Client-side export to PDF, PNG, Excel, ICS, and MS Project XML</li>
<li class="">MS Project and Primavera P6 import via MPXJ</li>
<li class="">45 built-in locales and RTL layout support</li>
<li class="">React, Angular, Vue, and Salesforce LWC wrappers</li>
<li class="">MCP server at <code>mcp.bryntum.com</code> for AI-assisted development</li>
<li class="">A Claude Code skill that catches common setup mistakes automatically</li>
</ul>
<p>The MCP server and Claude Code skill are useful during development because Bryntum's API surface is large. Having accurate, queryable documentation in the AI context reduces the time spent resolving import order issues, scheduling engine configuration errors, and CrudManager payload mismatches.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-pricing">Bryntum Gantt pricing<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#bryntum-gantt-pricing" class="hash-link" aria-label="Direct link to Bryntum Gantt pricing" title="Direct link to Bryntum Gantt pricing" translate="no">​</a></h3>
<p>Bryntum Gantt costs $940 per developer with a perpetual license that includes 12 months of updates. OEM and SaaS distribution require a separate quote. A trial is available at <a href="https://bryntum.com/download/?product=gantt" target="_blank" rel="noopener noreferrer" class="">https://bryntum.com/download/?product=gantt</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-gantt">Pros of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#pros-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Pros of Bryntum Gantt" title="Direct link to Pros of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">Most complete scheduling engine of the five components, open-sourced as ChronoGraph</li>
<li class="">Full enterprise feature set in one package: baselines, split tasks, resource histograms, client-side export</li>
<li class="">Broadest export format coverage including MS Project XML and Primavera P6 import</li>
<li class="">MCP server and Claude Code skill reduce AI-assisted development friction</li>
<li class="">45 built-in locales and RTL support for global deployments</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-gantt">Cons of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#cons-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Cons of Bryntum Gantt" title="Direct link to Cons of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">Commercial license required for production use, and per-developer pricing adds up on large teams</li>
<li class="">Large API surface has a noticeable learning curve</li>
<li class="">OEM/SaaS pricing is not published and requires a quote</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt">DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#dhtmlx-gantt" class="hash-link" aria-label="Direct link to DHTMLX Gantt" title="Direct link to DHTMLX Gantt" translate="no">​</a></h2>
<p>DHTMLX Gantt is one of the older JavaScript Gantt libraries still actively maintained. It ships a Standard tier under the GPL license, making it a viable option for open-source projects. Enterprise features are gated behind the Pro upgrade at higher license tiers.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-gantt">Getting started with DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#getting-started-with-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Gantt" title="Direct link to Getting started with DHTMLX Gantt" translate="no">​</a></h3>
<p>DHTMLX Gantt is on the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-gantt@9.1.4</span><br></div></code></pre></div></div>
<p>The library exposes a global <code>gantt</code> singleton. Multiple simultaneous instances require the Commercial license:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> gantt </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt/codebase/dhtmlxgantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">date_format </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ext</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zoom</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">levels</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'month'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">scale_height</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">min_column_width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">120</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token literal-property property">scales</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">unit</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'month'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">format</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%F %Y'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'week'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">scale_height</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">min_column_width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token literal-property property">scales</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">unit</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'month'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">format</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%F %Y'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">unit</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'week'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">format</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'W%W'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ext</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zoom</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">setLevel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'week'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">data</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">14</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">open</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">parent</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">parent</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">links</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">source</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">target</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'0'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The singleton architecture means a second call to <code>gantt.init()</code> on a different element reinitializes the same instance rather than creating an independent chart.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Gantt" src="https://www.react-gantt.com/assets/images/dhtmlx-gantt-ff658910fe3ae8368cfabb8d895d8c43.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-features">DHTMLX Gantt features<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#dhtmlx-gantt-features" class="hash-link" aria-label="Direct link to DHTMLX Gantt features" title="Direct link to DHTMLX Gantt features" translate="no">​</a></h3>
<p>The Standard tier covers basic Gantt rendering, dependency links, drag-and-drop, and inline editing. Auto-scheduling, critical path visualization, resource management, baselines, and split tasks are all restricted to the Pro upgrade, which starts at the Individual tier ($699). Online export (PDF and PNG) works by sending chart data to a DHTMLX-hosted export service. A local export add-on that avoids the external service costs $350 on top of the Individual license.</p>
<p>DHTMLX also provides an HTTP MCP server that exposes the Gantt documentation for AI-assisted development.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-pricing">DHTMLX Gantt pricing<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#dhtmlx-gantt-pricing" class="hash-link" aria-label="Direct link to DHTMLX Gantt pricing" title="Direct link to DHTMLX Gantt pricing" translate="no">​</a></h3>
<p>Licensing is perpetual across all tiers. GPL Standard is free. Individual costs $699, Commercial $1,399, Enterprise $2,999, and Ultimate $5,999.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-gantt">Pros of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#pros-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Pros of DHTMLX Gantt" title="Direct link to Pros of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard tier is free and includes basic Gantt functionality</li>
<li class="">Published, transparent pricing across all tiers</li>
<li class="">Public npm package with no access restrictions</li>
<li class="">HTTP MCP server available for AI-assisted development</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-gantt">Cons of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#cons-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Cons of DHTMLX Gantt" title="Direct link to Cons of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">Auto-scheduling, critical path, resource management, and baselines all require the Pro upgrade</li>
<li class="">Default PDF/PNG export sends data to an external DHTMLX-hosted service, and local export requires a $350 add-on</li>
<li class="">Global singleton makes running multiple independent chart instances on one page awkward</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt">Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#syncfusion-gantt" class="hash-link" aria-label="Direct link to Syncfusion Gantt" title="Direct link to Syncfusion Gantt" translate="no">​</a></h2>
<p>Syncfusion EJ2 Gantt is part of the Syncfusion Essential JS 2 component suite. It uses a module injection pattern where features are opt-in: only the capabilities you explicitly inject are bundled into your application. The Community License covers all features at no cost for teams that qualify.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-gantt">Getting started with Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#getting-started-with-syncfusion-gantt" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Gantt" title="Direct link to Getting started with Syncfusion Gantt" translate="no">​</a></h3>
<p>Install the package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-gantt@33.2.4</span><br></div></code></pre></div></div>
<p>Syncfusion requires a license key registered at startup, and each feature module must be injected before instantiation:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> registerLicense </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Selection</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Toolbar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> CriticalPath</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Filter</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Sort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> UndoRedo </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-richtexteditor/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-treegrid/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-grids/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-gantt/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key-here'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">Inject</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Edit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Selection</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Toolbar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> CriticalPath</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Filter</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Sort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> UndoRedo</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">subtasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Predecessor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">dataSource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">height</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'100%'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">taskFields</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">id</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskID'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'StartDate'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">duration</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">progress</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Progress'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">dependency</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Predecessor'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">child</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'subtasks'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">columns</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">headerText</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Task'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">headerText</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Progress'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">headerText</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">        </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">enableCriticalPath</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">allowFiltering</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">allowSorting</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">undoRedoActions</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'Add'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Edit'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Delete'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskbarEditing'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Indent'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Outdent'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'ColumnResize'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sorting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Filtering'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendTo</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'#container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The number of CSS imports is significant: 11 files covering base components, peer dependencies, and the Gantt component itself. A bundler like Vite or webpack will tree-shake the JavaScript modules based on what you inject, but all the CSS must be imported explicitly.</p>
<p><img decoding="async" loading="lazy" alt="Syncfusion Gantt" src="https://www.react-gantt.com/assets/images/syncfusion-gantt-77a9b1156ed39130b3014fcc7a7d47a8.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-features">Syncfusion Gantt features<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#syncfusion-gantt-features" class="hash-link" aria-label="Direct link to Syncfusion Gantt features" title="Direct link to Syncfusion Gantt features" translate="no">​</a></h3>
<p>Syncfusion Gantt includes auto-scheduling, critical path visualization (injected via the <code>CriticalPath</code> module), baselines, split tasks, resource management with resource allocation views, undo/redo with a configurable action list, and export to PDF, Excel, and CSV. All of these are available under both the Community License and the commercial license.</p>
<p>Syncfusion provides React, Angular, Vue, Blazor, and other framework wrappers through the broader EJ2 suite.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-pricing">Syncfusion Gantt pricing<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#syncfusion-gantt-pricing" class="hash-link" aria-label="Direct link to Syncfusion Gantt pricing" title="Direct link to Syncfusion Gantt pricing" translate="no">​</a></h3>
<p>The Community License is free and covers all enterprise features. Eligibility requires annual revenue under $1 million, five or fewer developers, and 10 or fewer total employees. Teams that exceed any of those thresholds require a commercial license, for which pricing is quote-based.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-gantt">Pros of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#pros-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Pros of Syncfusion Gantt" title="Direct link to Pros of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Community License provides every enterprise feature at no cost for qualifying teams</li>
<li class="">Client-side export to PDF, Excel, and CSV included</li>
<li class="">Large suite of framework wrappers covering React, Angular, Vue, and Blazor</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-gantt">Cons of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#cons-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Cons of Syncfusion Gantt" title="Direct link to Cons of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class=""><code>Gantt.Inject()</code> must be called for every feature module before instantiation, adding boilerplate</li>
<li class="">11 CSS imports are required, and missing any causes broken styling</li>
<li class="">MCP servers are stdio-only, which is less convenient for remote or containerized development environments</li>
<li class="">Commercial pricing is not published</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt">DayPilot Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#daypilot-gantt" class="hash-link" aria-label="Direct link to DayPilot Gantt" title="Direct link to DayPilot Gantt" translate="no">​</a></h2>
<p>DayPilot Pro is a scheduling component suite primarily oriented toward calendar and scheduling views. Its Gantt component provides dependency links, drag-and-drop task editing, task completion tracking, and a graphical UI Builder for configuration. It does not include an auto-scheduling engine or built-in resource management.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-gantt">Getting started with DayPilot Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#getting-started-with-daypilot-gantt" class="hash-link" aria-label="Direct link to Getting started with DayPilot Gantt" title="Direct link to Getting started with DayPilot Gantt" translate="no">​</a></h3>
<p>DayPilot Pro is not on the public npm registry. After purchasing a license, you download the package from the DayPilot customer portal and reference it locally or from your own package feed. A 60-day trial is available on the DayPilot website.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> DayPilot </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DayPilot</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">days</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">tasks</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">completion</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-20'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">completion</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">links</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">from</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">to</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The API follows a simple imperative initialization pattern. Task positions are date-range driven rather than duration-and-dependency driven, which reflects the absence of a scheduling engine.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-features">DayPilot Gantt features<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#daypilot-gantt-features" class="hash-link" aria-label="Direct link to DayPilot Gantt features" title="Direct link to DayPilot Gantt features" translate="no">​</a></h3>
<p>DayPilot Gantt covers dependency rendering, drag-and-drop task editing, task completion bars, time scale configuration, and a UI Builder tool for generating configuration code visually. React, Angular, and Vue wrappers are available.</p>
<p>Auto-scheduling and resource management are not part of the DayPilot Gantt component. Tasks must be positioned manually by setting explicit start and end dates. Teams that need the scheduler to compute task dates from dependency chains and constraints will need to implement that logic themselves or choose a different component.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-pricing">DayPilot Gantt pricing<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#daypilot-gantt-pricing" class="hash-link" aria-label="Direct link to DayPilot Gantt pricing" title="Direct link to DayPilot Gantt pricing" translate="no">​</a></h3>
<p>Licensing starts at $649 per developer, perpetual, with either six or 12 months of maintenance included depending on the tier. A 60-day trial is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-gantt">Pros of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#pros-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Pros of DayPilot Gantt" title="Direct link to Pros of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">UI Builder accelerates initial configuration</li>
<li class="">React, Angular, and Vue wrappers included</li>
<li class="">60-day trial period</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-gantt">Cons of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#cons-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Cons of DayPilot Gantt" title="Direct link to Cons of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">No auto-scheduling engine, so task dates must be managed manually</li>
<li class="">No built-in resource management in the Gantt component</li>
<li class="">Not on the public npm registry, so download requires the customer portal</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se">Netronic VSW SE<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#netronic-vsw-se" class="hash-link" aria-label="Direct link to Netronic VSW SE" title="Direct link to Netronic VSW SE" translate="no">​</a></h2>
<p>Netronic Visual Scheduling Widget SE (VSW SE) is a canvas-based scheduling component built by Netronic GmbH. Because it renders to a canvas element rather than the DOM, it handles very large activity counts without the layout recalculation overhead that affects DOM-based components. Version 9.0 added ESM and TypeScript support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-netronic-vsw-se">Getting started with Netronic VSW SE<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#getting-started-with-netronic-vsw-se" class="hash-link" aria-label="Direct link to Getting started with Netronic VSW SE" title="Direct link to Getting started with Netronic VSW SE" translate="no">​</a></h3>
<p>VSW SE is not on the public npm registry. Access requires completing a purchase or evaluation request with Netronic GmbH, after which you receive a download from the customer portal. There is no public install command. The library works with any JavaScript framework without a wrapper package because the API is configuration-driven rather than framework-specific.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Illustrative - actual initialization depends on the downloaded package API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> vsw </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">VSW</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">endDate</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-03-31'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">activities</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-20'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">vsw</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">render</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Configuration follows an API-driven pattern with no component-specific JSX or template syntax required, which means it integrates into React, Angular, Vue, or plain JavaScript with the same setup.</p>
<p><img decoding="async" loading="lazy" alt="Netronic VSW SE" src="https://www.react-gantt.com/assets/images/netronic-vsw-se-e8a8b97b25fa141f0e2fd4f40eb16f7f.png" width="1165" height="610" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-features">Netronic VSW SE features<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#netronic-vsw-se-features" class="hash-link" aria-label="Direct link to Netronic VSW SE features" title="Direct link to Netronic VSW SE features" translate="no">​</a></h3>
<p>VSW SE includes resource timelines, resource histograms, work calendars, and client-side PDF export. The canvas rendering approach is its most distinctive technical characteristic: very large datasets that would slow a DOM-based Gantt remain performant because the browser performs a single canvas repaint rather than recalculating layout for thousands of elements.</p>
<p>Auto-scheduling, critical path calculation, and baseline tracking are not included. Teams that require those capabilities will need to implement or integrate a scheduling engine separately.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-pricing">Netronic VSW SE pricing<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#netronic-vsw-se-pricing" class="hash-link" aria-label="Direct link to Netronic VSW SE pricing" title="Direct link to Netronic VSW SE pricing" translate="no">​</a></h3>
<p>Pricing is quote-based with no published rates. Contact Netronic GmbH for commercial terms.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-netronic-vsw-se">Pros of Netronic VSW SE<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#pros-of-netronic-vsw-se" class="hash-link" aria-label="Direct link to Pros of Netronic VSW SE" title="Direct link to Pros of Netronic VSW SE" translate="no">​</a></h3>
<ul>
<li class="">Canvas rendering is well-suited to very large datasets with thousands of activities</li>
<li class="">Framework-agnostic API works in React, Angular, Vue, or vanilla JS without a wrapper package</li>
<li class="">Resource histograms and PDF export included</li>
<li class="">ESM and TypeScript support added in version 9.0</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-netronic-vsw-se">Cons of Netronic VSW SE<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#cons-of-netronic-vsw-se" class="hash-link" aria-label="Direct link to Cons of Netronic VSW SE" title="Direct link to Cons of Netronic VSW SE" translate="no">​</a></h3>
<ul>
<li class="">No auto-scheduling engine or critical path calculation</li>
<li class="">No baselines or variance tracking</li>
<li class="">Not on the public npm registry, so customer portal distribution adds onboarding friction</li>
<li class="">Pricing is not published and requires contacting Netronic GmbH for a quote</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below summarizes how each component covers the enterprise feature set we defined at the start of this article.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Gantt</th><th>DHTMLX Gantt</th><th>Syncfusion Gantt</th><th>DayPilot Gantt</th><th>Netronic VSW SE</th></tr></thead><tbody><tr><td>Auto-scheduling</td><td>Yes</td><td>Pro only</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Critical path</td><td>Yes</td><td>Pro only</td><td>Yes (injected)</td><td>No</td><td>No</td></tr><tr><td>Resource management</td><td>Yes</td><td>Pro only</td><td>Yes (injected)</td><td>No</td><td>Yes</td></tr><tr><td>Baselines</td><td>Yes</td><td>Pro only</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Client-side export</td><td>Yes</td><td>Add-on ($350)</td><td>Yes</td><td>No</td><td>Yes (PDF)</td></tr><tr><td>Public npm</td><td>Yes</td><td>Yes</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Framework support</td><td>React, Angular, Vue, LWC</td><td>Framework-agnostic</td><td>React, Angular, Vue, Blazor</td><td>React, Angular, Vue</td><td>Framework-agnostic</td></tr><tr><td>MCP server</td><td>Yes (HTTP)</td><td>Yes (HTTP)</td><td>Yes (stdio)</td><td>No</td><td>No</td></tr></tbody></table></div>
<p>The table below maps common enterprise scenarios to the component that fits best.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Recommended component</th></tr></thead><tbody><tr><td>Full enterprise PM with scheduling engine, export, and AI tooling</td><td>Bryntum Gantt</td></tr><tr><td>Free Community License covering all enterprise features</td><td>Syncfusion Gantt</td></tr><tr><td>Canvas rendering for very large datasets</td><td>Netronic VSW SE</td></tr><tr><td>Open-source or GPL-licensed projects</td><td>DHTMLX Gantt Standard</td></tr></tbody></table></div>
<p>For teams that need the complete enterprise feature set (auto-scheduling, critical path, resource management, baselines, and client-side export), Bryntum Gantt and Syncfusion Gantt are the two clear options. Bryntum's ChronoGraph engine is more mature and the export format coverage is broader, but the per-developer cost is meaningful on large teams. Syncfusion's Community License removes the cost barrier entirely for qualifying organizations, though teams that grow past the eligibility thresholds will need to budget for a commercial quote.</p>
<p>DHTMLX Gantt is the practical choice when the codebase must remain under a GPL-compatible license, and the Standard tier is sufficient if auto-scheduling and critical path are not required. DayPilot suits project tracking interfaces where task dates are managed by the application rather than a scheduling engine. Netronic VSW SE fills a specific niche: when activity counts reach into the tens of thousands and DOM rendering becomes a bottleneck, the canvas-based approach offers a performance path that the other four components cannot match.</p>]]></content:encoded>
            <category>gantt</category>
        </item>
        <item>
            <title><![CDATA[Best JavaScript resource scheduler components]]></title>
            <link>https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/</link>
            <guid>https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A resource scheduler is a component that places resources along the Y axis and time along the X axis, then renders event bars that span one or more cells.]]></description>
            <content:encoded><![CDATA[<p>A resource scheduler is a component that places resources along the Y-axis and time along the X-axis, then renders event bars that span one or more cells to show when each resource is occupied. The "resources" can be people, machines, rooms, vehicles, or any entity that has limited availability. Unlike a general event calendar, a resource scheduler centers on the resource rather than the event. Five libraries cover this category with vanilla JavaScript APIs: Bryntum Scheduler, DHTMLX Scheduler, Syncfusion Schedule, DayPilot Scheduler, and Mobiscroll Event Calendar.</p>
<p>The comparison uses four resource management capabilities that distinguish these libraries from simpler timeline displays:</p>
<ul>
<li class="">Multi-resource assignment: a single event assigned to more than one resource row simultaneously</li>
<li class="">Hierarchical resource grouping: resources organized in a parent-child tree the user can expand and collapse</li>
<li class="">Resource utilization: a histogram or summary view showing how heavily each resource is loaded over time</li>
<li class="">Work calendars: specific hours or days marked as unavailable per individual resource</li>
</ul>
<p>For a broader comparison that covers non-resource scheduling features, see our article on <a href="https://bryntum.com/blog/best-javascript-scheduler-components" target="_blank" rel="noopener noreferrer" class="">best JavaScript scheduler components</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler">Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#bryntum-scheduler" class="hash-link" aria-label="Direct link to Bryntum Scheduler" title="Direct link to Bryntum Scheduler" translate="no">​</a></h2>
<p>Bryntum Scheduler is a commercial vanilla JavaScript component built for resource scheduling. It is the core product in the Bryntum suite, which also includes Scheduler Pro, Gantt, Calendar, Grid, and TaskBoard. The library publishes trial packages to the public npm registry, which means you can evaluate it without creating a customer account first.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-scheduler">Getting started with Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#getting-started-with-bryntum-scheduler" class="hash-link" aria-label="Direct link to Getting started with Bryntum Scheduler" title="Direct link to Getting started with Bryntum Scheduler" translate="no">​</a></h3>
<p>Install the trial package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler@npm:@bryntum/scheduler-trial@7.3.0</span><br></div></code></pre></div></div>
<p>Add the container element to your HTML:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">    </span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">html</span><span class="token style language-css selector punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css selector" style="color:rgb(215, 186, 125)"> body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">margin</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">0</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">%</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">    </span><span class="token style language-css selector id" style="color:rgb(215, 186, 125)">#container</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">vh</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>CSS imports must arrive in this exact order. The theme file overrides defaults set by the base stylesheet:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/scheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Scheduler </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> scheduler </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">appendTo</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">endDate</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-26'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">viewPreset</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hourAndDay'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">columns</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team member'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">160</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Grouped resources: department &gt; individual</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resources</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Celia'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sales'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Fancy law firm'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'teal'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Small boutique'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Grocery store'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lime'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">events</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Busy'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">              </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'red'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">           </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'clients office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">             </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Suggested meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-11'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grocery store'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Multi-resource assignment is expressed directly in the event's <code>resourceId</code> field as an array. Hierarchical resource grouping uses <code>parentId</code> on resource records. Both capabilities are available without any extra configuration or module injection.</p>
<p>For remote data, replace inline arrays with a CrudManager configuration:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token literal-property property">crudManager</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">loadUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/load'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">syncUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/sync'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoLoad</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoSync</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>The CrudManager loads all stores (resources, events, assignments, dependencies) in a single HTTP request and batches writes back in the same structure, which prevents the data inconsistency problems that arise when stores are managed independently.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Scheduler showing grouped resources and a multi-resource event" src="https://www.react-gantt.com/assets/images/bryntum-scheduler-cdea645a1b76ea741b10ad1742864273.png" width="2558" height="1188" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-resource-management-features">Bryntum Scheduler resource management features<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#bryntum-scheduler-resource-management-features" class="hash-link" aria-label="Direct link to Bryntum Scheduler resource management features" title="Direct link to Bryntum Scheduler resource management features" translate="no">​</a></h3>
<p>Bryntum Scheduler covers all four resource management capabilities described in the introduction.</p>
<p>Multi-resource assignment works by passing an array to <code>resourceId</code>. The scheduler creates an assignment record for each entry and renders the event bar across every assigned resource row. Assignments are stored in a separate <code>AssignmentStore</code>, which means the same event object can have different visual positions without duplicating event data.</p>
<p>Hierarchical resource grouping uses the same tree model as Bryntum Grid. Resources can be nested to any depth using <code>parentId</code> references. Parent rows render a summary of their children and support expand-collapse interaction out of the box.</p>
<p>The <code>ResourceUtilization</code> widget renders a histogram below or alongside the scheduler that shows each resource's load over time. It reads directly from the <code>AssignmentStore</code>, so it updates automatically when assignments change.</p>
<p>Work calendars can be defined per resource using the <code>CalendarManagerStore</code>. Calendars specify working hours, holidays, and exceptions for individual resources. The scheduler shades non-working time and prevents drag-and-drop from placing events in unavailable intervals when <code>skipNonWorkingTime</code> is enabled.</p>
<p>Additional resource-relevant features include resource filtering, resource time ranges (which mark specific intervals on individual resource rows), and virtual scrolling that keeps performance stable when the resource list grows to thousands of rows.</p>
<p>Bryntum also provides an MCP server at <code>mcp.bryntum.com</code> that exposes the full API documentation for AI-assisted development, and a Claude Code skill that catches common setup mistakes such as import order errors and CrudManager configuration issues.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-pricing">Bryntum Scheduler pricing<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#bryntum-scheduler-pricing" class="hash-link" aria-label="Direct link to Bryntum Scheduler pricing" title="Direct link to Bryntum Scheduler pricing" translate="no">​</a></h3>
<p>Bryntum Scheduler costs $680 per developer for the small-team license, with a three-developer minimum and 12 months of updates. A 45-day free trial is available at <a href="https://bryntum.com/download/?product=scheduler" target="_blank" rel="noopener noreferrer" class="">bryntum.com/download</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-scheduler">Pros of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#pros-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Pros of Bryntum Scheduler" title="Direct link to Pros of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment, hierarchical grouping, utilization histogram, and work calendars are all available in the base product with no extra modules required</li>
<li class="">The <code>AssignmentStore</code> model separates event identity from resource assignment, which simplifies data synchronization with REST backends</li>
<li class="">Virtual scrolling keeps the component responsive with thousands of resource rows</li>
<li class="">MCP server and Claude Code skill reduce friction during AI-assisted development</li>
<li class="">Five built-in themes, with a custom theme API for full visual control</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-scheduler">Cons of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#cons-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Cons of Bryntum Scheduler" title="Direct link to Cons of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Commercial license required for production use, with per-developer pricing that becomes significant on large teams</li>
<li class="">The API surface is large, and the learning curve for advanced features like the CrudManager and CalendarManagerStore is noticeable</li>
<li class="">OEM and SaaS distribution pricing requires a separate quote</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p>DHTMLX Scheduler is part of the DHTMLX suite of components for project management and data visualization. The Standard edition is available under the GPL license. The Timeline view that enables resource scheduling is a PRO-only feature.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-scheduler">Getting started with DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#getting-started-with-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Scheduler" title="Direct link to Getting started with DHTMLX Scheduler" translate="no">​</a></h3>
<p>Install from the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>DHTMLX Scheduler exposes a global <code>scheduler</code> singleton. The Timeline view requires the PRO edition and must be activated as a plugin before calling <code>init</code>:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> scheduler </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">xml_date </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d %H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// Create timeline view for resource scheduling (PRO only)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createTimelineView</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_unit</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_date</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_step</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_size</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_start</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_length</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">y_unit</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">y_property</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'section_id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">render</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Group resources by department</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">second_scale</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">x_unit</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'day'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">x_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%D'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">key</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dev-1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">key</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dev-2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">key</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'design-1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 10:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 11:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">section_id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dev-1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 14:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 16:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">section_id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'design-1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Each event maps to one <code>section_id</code> (resource). The <code>second_scale</code> option adds a second header row for grouping labels but does not create a tree structure. Loading data uses the <code>parse</code> method for inline data or the <code>load</code> method for a URL. The DataProcessor API handles write-back:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">load</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'/data'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> dp </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createDataProcessor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">url</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/data'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">mode</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'REST'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">dp</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler timeline view" src="https://www.react-gantt.com/assets/images/dhtmlx-scheduler-8a45f0e64d65f3372e6310101f1f0116.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-resource-management-features">DHTMLX Scheduler resource management features<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#dhtmlx-scheduler-resource-management-features" class="hash-link" aria-label="Direct link to DHTMLX Scheduler resource management features" title="Direct link to DHTMLX Scheduler resource management features" translate="no">​</a></h3>
<p>The resource management capabilities of DHTMLX Scheduler are limited compared to the other libraries in this comparison.</p>
<p>The Timeline view arranges flat resource rows on the Y-axis with one event per row at a time. There is no native multi-resource assignment: each event record has a single <code>section_id</code> property. Duplicating an event record across multiple section IDs is a common workaround, but it creates separate event objects rather than a single assignment.</p>
<p>Resource grouping in the Timeline view uses the <code>second_scale</code> option to add a secondary header that labels groups visually, but it does not create collapsible parent rows. Nesting with expand-collapse behavior requires significant custom development.</p>
<p>A separate <code>ResourceHistogram</code> extension renders a bar chart of resource load. It requires the PRO edition and must be configured separately from the timeline view.</p>
<p>Work calendars are supported via the <code>scheduler_calendar</code> extension, which can mark custom working hours and non-working days. Individual resource calendars are possible but require manual association between calendar rules and resource records.</p>
<p>DHTMLX provides an HTTP MCP server that exposes the Scheduler documentation for AI-assisted development.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing">DHTMLX Scheduler pricing<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#dhtmlx-scheduler-pricing" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing" title="Direct link to DHTMLX Scheduler pricing" translate="no">​</a></h3>
<p>The Standard edition is free under the GPL license. PRO licenses are perpetual and range from $599 for an Individual license to $3,999 for an Enterprise license. The Timeline view and ResourceHistogram extension both require the PRO edition.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-scheduler">Pros of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#pros-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Pros of DHTMLX Scheduler" title="Direct link to Pros of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Standard edition is free and open source under the GPL license</li>
<li class="">Published, transparent pricing across all tiers</li>
<li class="">DataProcessor API simplifies write-back to PHP, Java, and .NET backends</li>
<li class="">HTTP MCP server available for AI-assisted development</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-scheduler">Cons of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#cons-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Cons of DHTMLX Scheduler" title="Direct link to Cons of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">No native multi-resource assignment, so workarounds require duplicating event records</li>
<li class="">Resource grouping does not support collapsible parent rows without custom code</li>
<li class="">Timeline view, ResourceHistogram, and most resource management features require the PRO edition</li>
<li class="">Global singleton architecture complicates running multiple scheduler instances on one page</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule">Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#syncfusion-schedule" class="hash-link" aria-label="Direct link to Syncfusion Schedule" title="Direct link to Syncfusion Schedule" translate="no">​</a></h2>
<p>Syncfusion Schedule is part of the Syncfusion Essential JS 2 component suite. It uses a module injection pattern where views and features are explicitly registered before instantiation. The Community License covers all features at no cost for teams that qualify.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-schedule">Getting started with Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#getting-started-with-syncfusion-schedule" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Schedule" title="Direct link to Getting started with Syncfusion Schedule" translate="no">​</a></h3>
<p>Install from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-schedule</span><br></div></code></pre></div></div>
<p>Syncfusion requires several CSS imports covering peer dependency packages, and a license key must be registered before instantiation:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-schedule/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> registerLicense </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> TimelineViews </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">Inject</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">TimelineViews</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> resourceData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">groupId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">groupId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">groupId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> eventData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">14</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">16</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> schedule </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">height</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'550px'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">selectedDate</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">views</span><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">option</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TimelineWeek'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">group</span><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">resources</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'Resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resources</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">field</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'ResourceId'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">title</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Member'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">dataSource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> resourceData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">textField</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'text'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">idField</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">allowMultiple</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">eventSettings</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">dataSource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> eventData </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendTo</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'#container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Setting <code>allowMultiple: true</code> on the resource definition enables multi-resource assignment. Injecting <code>TimelineViews</code> is required before the component can render timeline views. Missing either step causes silent failures with weak error output.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-resource-management-features">Syncfusion Schedule resource management features<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#syncfusion-schedule-resource-management-features" class="hash-link" aria-label="Direct link to Syncfusion Schedule resource management features" title="Direct link to Syncfusion Schedule resource management features" translate="no">​</a></h3>
<p>Syncfusion Schedule supports multi-resource assignment natively when <code>allowMultiple: true</code> is set on the resource definition. An event with an array in its <code>ResourceId</code> field renders a separate bar on each assigned resource row.</p>
<p>Resource grouping uses the <code>group</code> configuration object, which accepts a list of resource field names that define the grouping hierarchy. Rows are grouped and labeled accordingly in the timeline header, but the grouping does not produce collapsible tree rows in the same way as Bryntum or DayPilot.</p>
<p>There is no built-in resource utilization histogram in Syncfusion Schedule. Utilization views require custom rendering using the component's template system or a separate charting component.</p>
<p>Work calendars are supported via the <code>workHours</code> configuration, which sets global working hours for the scheduler. Per-resource calendars are not directly supported, but custom business hours can be applied to groups using the <code>group.byDate</code> or custom cell templates.</p>
<p>The <code>DataManager</code> class handles remote data loading and write-back, supporting a range of adaptors including REST, OData, and WebAPI. Feature modules such as <code>DragAndDrop</code> and <code>Resize</code> are injected separately from views, which keeps bundle size small but adds boilerplate.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-pricing">Syncfusion Schedule pricing<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#syncfusion-schedule-pricing" class="hash-link" aria-label="Direct link to Syncfusion Schedule pricing" title="Direct link to Syncfusion Schedule pricing" translate="no">​</a></h3>
<p>The Community License is free and covers all features. Eligibility requires annual gross revenue under $1 million, five or fewer developers, and outside capital under $3 million. Commercial licensing for teams that exceed those thresholds is quote-based.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-schedule">Pros of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#pros-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Pros of Syncfusion Schedule" title="Direct link to Pros of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment supported natively via <code>allowMultiple: true</code></li>
<li class="">Community License provides full feature access at no cost for qualifying teams</li>
<li class=""><code>DataManager</code> abstracts REST, OData, and WebAPI backends with minimal configuration</li>
<li class="">13 built-in themes with a GUI Theme Studio for visual customization</li>
<li class="">Framework wrappers for React, Angular, Vue, and Blazor</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-schedule">Cons of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#cons-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Cons of Syncfusion Schedule" title="Direct link to Cons of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">No built-in resource utilization histogram, so building one requires custom templates or a separate chart</li>
<li class="">Resource grouping does not produce collapsible tree rows</li>
<li class="">Eight CSS imports are required and missing any one breaks the layout</li>
<li class=""><code>Schedule.Inject()</code> must be called for every feature module before instantiation</li>
<li class="">Commercial pricing is not published</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler">DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#daypilot-scheduler" class="hash-link" aria-label="Direct link to DayPilot Scheduler" title="Direct link to DayPilot Scheduler" translate="no">​</a></h2>
<p>DayPilot Scheduler is part of the DayPilot Pro commercial suite for scheduling and calendar views. A Lite version is available as open source. The Pro edition adds hierarchical resource grouping, multi-resource assignment, and a graphical UI Builder for configuration.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-scheduler">Getting started with DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#getting-started-with-daypilot-scheduler" class="hash-link" aria-label="Direct link to Getting started with DayPilot Scheduler" title="Direct link to Getting started with DayPilot Scheduler" translate="no">​</a></h3>
<p>Install the Lite version from the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @daypilot/daypilot-lite-javascript</span><br></div></code></pre></div></div>
<p>For full resource scheduling features, use <code>daypilot-pro-javascript</code>, which is available after purchasing a license or starting a trial.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> DayPilot </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@daypilot/daypilot-lite-javascript'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> scheduler </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DayPilot</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token class-name" style="color:rgb(78, 201, 176)">Scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">days</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">scale</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">cellWidth</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">40</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resources</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Development'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grp-dev'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">expanded</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">children</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grp-design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">expanded</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">children</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R3'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">events</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T11:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T16:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R3'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Hierarchical resource groups are defined using the <code>children</code> property on resource objects. The structure is readable and does not require a separate parentId reference. Calling <code>scheduler.init()</code> after construction is required. Skipping it leaves the component unrendered.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-resource-management-features">DayPilot Scheduler resource management features<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#daypilot-scheduler-resource-management-features" class="hash-link" aria-label="Direct link to DayPilot Scheduler resource management features" title="Direct link to DayPilot Scheduler resource management features" translate="no">​</a></h3>
<p>Hierarchical resource grouping with expand-collapse behavior is supported in both the Lite and Pro editions. Resource objects nest children to any depth using the <code>children</code> array, and parent rows expand or collapse on user interaction.</p>
<p>Multi-resource assignment is a Pro-only feature. In the Lite edition, each event maps to a single resource via the <code>resource</code> field. Pro adds support for an array of resource IDs, which renders the event bar across multiple rows.</p>
<p>There is no built-in resource utilization histogram in DayPilot Scheduler. Custom row summaries can be added using the <code>rowHeaderCellHtml</code> callback, but building a full histogram view requires custom rendering logic.</p>
<p>Work hours per resource are not directly configurable as named calendar objects. Non-working time can be marked by rendering custom cell styles using the <code>cellHtml</code> callback, but there is no dedicated calendar or constraint model that prevents events from being placed in those intervals during drag-and-drop.</p>
<p>DayPilot Pro does not include a scheduling engine. Constraint enforcement and conflict detection must be implemented in application code or on the server.</p>
<p>The online <a href="https://builder.daypilot.org/scheduler" target="_blank" rel="noopener noreferrer" class="">UI Builder</a> generates scheduler configuration code from a visual interface, which is useful during initial setup.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pricing">DayPilot Scheduler pricing<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#daypilot-scheduler-pricing" class="hash-link" aria-label="Direct link to DayPilot Scheduler pricing" title="Direct link to DayPilot Scheduler pricing" translate="no">​</a></h3>
<p>DayPilot Pro starts at $899 per developer. The Lite edition is open source under the Apache 2.0 license. A 60-day trial of the Pro edition is available on the DayPilot website.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-scheduler">Pros of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#pros-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Pros of DayPilot Scheduler" title="Direct link to Pros of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Hierarchical resource grouping with expand-collapse is available in both Lite and Pro editions</li>
<li class="">Resource nesting uses an intuitive <code>children</code> array that is easy to read and maintain</li>
<li class="">UI Builder generates starter configuration code from a visual interface</li>
<li class="">Lite edition covers basic resource scheduling under the Apache 2.0 license</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-scheduler">Cons of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#cons-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Cons of DayPilot Scheduler" title="Direct link to Cons of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment requires the Pro edition</li>
<li class="">No built-in resource utilization histogram</li>
<li class="">No named work calendar model, so preventing events from landing in non-working time requires custom logic</li>
<li class="">No scheduling engine, so constraint enforcement must be handled outside the component</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p>Mobiscroll Event Calendar is a commercial, mobile-first scheduling component that is part of the Mobiscroll UI suite. It supports vanilla JavaScript, React, Angular, Vue, and Ionic. The timeline view positions resources on the Y-axis and renders event bars across assigned resource rows, making it a resource scheduler.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-mobiscroll-event-calendar">Getting started with Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#getting-started-with-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Getting started with Mobiscroll Event Calendar" title="Direct link to Getting started with Mobiscroll Event Calendar" translate="no">​</a></h3>
<p>Install from npm after creating a Mobiscroll account to access the trial:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/javascript</span><br></div></code></pre></div></div>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> mobiscroll </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/javascript'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/javascript/dist/css/mobiscroll.min.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">mobiscroll</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">eventcalendar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'#container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">view</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">timeline</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'week'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resources</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">data</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T11:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T16:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Multi-resource assignment is expressed by passing an array to the <code>resource</code> field on an event object. A single CSS import covers the full component stylesheet, and there is no module injection step required.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-resource-management-features">Mobiscroll Event Calendar resource management features<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#mobiscroll-event-calendar-resource-management-features" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar resource management features" title="Direct link to Mobiscroll Event Calendar resource management features" translate="no">​</a></h3>
<p>Multi-resource assignment is supported natively. Setting the <code>resource</code> field to an array assigns the event to multiple resource rows. The event bar renders in each assigned row, and the assignment is stored as part of the event data object rather than in a separate assignment model.</p>
<p>Mobiscroll supports resource grouping through the <code>resources</code> option, which accepts nested objects with a <code>children</code> array. Parent rows collapse and expand, and the behavior is available out of the box without additional configuration.</p>
<p>There is no built-in resource utilization histogram. Mobiscroll does not ship a separate histogram widget, so utilization visualization requires a custom implementation using external charting libraries.</p>
<p>Work hours are configurable globally using the <code>invalid</code> option, which accepts date ranges, recurring time intervals, and specific dates that should be blocked. Per-resource invalid intervals are also supported by adding a <code>resource</code> field to entries in the <code>invalid</code> array, which makes it possible to define different unavailability rules for individual resources.</p>
<p>The Mobiscroll mobile-first design means the timeline view is optimized for touch interaction, with large tap targets and swipe navigation. This makes it a strong choice when a high proportion of users access the scheduler on phones or tablets.</p>
<p>A <a href="https://mobiscroll.com/themebuilder" target="_blank" rel="noopener noreferrer" class="">theme builder</a> lets you customize the three built-in themes visually and download the resulting CSS.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-pricing">Mobiscroll Event Calendar pricing<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#mobiscroll-event-calendar-pricing" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar pricing" title="Direct link to Mobiscroll Event Calendar pricing" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 per internal project as a perpetual license. A 90-day free trial is available on the Mobiscroll website.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-mobiscroll-event-calendar">Pros of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#pros-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Pros of Mobiscroll Event Calendar" title="Direct link to Pros of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment supported natively with a simple array syntax</li>
<li class="">Resource grouping with expand-collapse available out of the box</li>
<li class="">Per-resource work hour restrictions supported via the <code>invalid</code> array</li>
<li class="">Single CSS import with no peer-dependency stylesheets required</li>
<li class="">Mobile-first design with touch-optimized interactions</li>
<li class="">Theme builder for visual customization</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-mobiscroll-event-calendar">Cons of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#cons-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Cons of Mobiscroll Event Calendar" title="Direct link to Cons of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">No built-in resource utilization histogram</li>
<li class="">SaaS and multi-customer product pricing requires a custom quote</li>
<li class="">Event assignments are stored on the event object rather than in a separate assignment model, which complicates scenarios where the same event appears in multiple resource contexts with different metadata</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-javascript-resource-scheduler-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below compares the five libraries against the resource management capabilities described in the introduction, plus a few general-purpose features that affect production deployments:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum</th><th>DHTMLX</th><th>Syncfusion</th><th>DayPilot</th><th>Mobiscroll</th></tr></thead><tbody><tr><td>Multi-resource assignment</td><td>Yes</td><td>No</td><td>Yes</td><td>Pro only</td><td>Yes</td></tr><tr><td>Resource grouping / nesting</td><td>Yes</td><td>Partial</td><td>Partial</td><td>Yes</td><td>Yes</td></tr><tr><td>Resource utilization view</td><td>Yes (histogram widget)</td><td>Yes (PRO)</td><td>No</td><td>No</td><td>No</td></tr><tr><td>Resource filtering</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Work calendars per resource</td><td>Yes</td><td>Yes (PRO)</td><td>Partial</td><td>No</td><td>Yes</td></tr><tr><td>Virtual scrolling</td><td>Yes</td><td>Yes</td><td>Yes</td><td>No</td><td>Yes</td></tr><tr><td>Free tier</td><td>No</td><td>Yes (GPL)</td><td>Yes (Community)</td><td>Yes (Lite)</td><td>No</td></tr></tbody></table></div>
<p>The table below maps specific use cases to the best-fit library:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Best fit</th><th>Reason</th></tr></thead><tbody><tr><td>Enterprise resource management with utilization tracking</td><td>Bryntum Scheduler</td><td>Only library with a built-in histogram widget. AssignmentStore model handles complex assignment data</td></tr><tr><td>Budget-constrained project with basic resource rows</td><td>DHTMLX Standard or DayPilot Lite</td><td>Both are free for open-source projects. DayPilot Lite supports hierarchical grouping out of the box</td></tr><tr><td>Qualifying startup needing full features at no cost</td><td>Syncfusion Schedule</td><td>Community License covers all features including multi-resource assignment</td></tr><tr><td>Mobile-heavy application with multi-resource needs</td><td>Mobiscroll Event Calendar</td><td>Mobile-first design with native multi-resource support and per-resource invalid intervals</td></tr></tbody></table></div>
<p>Bryntum Scheduler has the most complete resource management feature set of the five. The combination of a dedicated <code>AssignmentStore</code>, the <code>ResourceUtilization</code> histogram widget, per-resource work calendars, and virtual scrolling addresses the full range of resource scheduling scenarios without requiring custom development for the core use cases. The MCP server and Claude Code skill also reduce the time spent resolving configuration issues during development.</p>
<p>For teams that qualify for the Syncfusion Community License, Syncfusion Schedule is the strongest free option. Multi-resource assignment works natively, the <code>DataManager</code> handles backend integration, and the full feature set is available without cost. The absence of a built-in utilization histogram is the most significant gap relative to Bryntum.</p>
<p>DHTMLX Standard and DayPilot Lite are the right choices when budget constraints are the primary concern and the application does not require multi-resource assignment or utilization views. DayPilot Lite has cleaner hierarchical grouping syntax. DHTMLX Standard has the more complete general feature set and the DataProcessor API for backend integration. Mobiscroll Event Calendar is the best option when mobile usability is a primary requirement and multi-resource assignment must work out of the box.</p>]]></content:encoded>
            <category>scheduler</category>
        </item>
        <item>
            <title><![CDATA[Best JavaScript timeline scheduler components]]></title>
            <link>https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/</link>
            <guid>https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A timeline scheduler is a UI component that renders events as horizontal bars along a time axis, with optional resource rows displayed on the left.]]></description>
            <content:encoded><![CDATA[<p>A timeline scheduler is a UI component that renders events as horizontal bars along a time axis, with optional resource rows displayed on the left. Unlike a general calendar, a timeline scheduler is designed for dense event data across multiple resources, with a time axis that can zoom from individual hours all the way out to months or years. The result is a visualization that makes it easy to see resource utilization, overlapping events, and scheduling gaps at a glance.</p>
<p>This comparison covers five JavaScript timeline scheduler components: Bryntum Scheduler, DHTMLX Scheduler, Syncfusion Schedule, DayPilot Scheduler, and vis-timeline. vis-timeline is the free, MIT-licensed option in this list. The comparison focuses on timeline-specific capabilities: zoom levels, time axis customization, custom event rendering, and performance with large or dense event datasets. For a broader comparison of JavaScript scheduler components, see our article on <a href="https://bryntum.com/blog/best-javascript-scheduler-components" target="_blank" rel="noopener noreferrer" class="">best JavaScript scheduler components</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler">Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#bryntum-scheduler" class="hash-link" aria-label="Direct link to Bryntum Scheduler" title="Direct link to Bryntum Scheduler" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/scheduler/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler</a> is a commercial, high-performance timeline scheduler built in vanilla JavaScript. It integrates with React, Angular, Vue, and any backend, and can be used as a Web Component. Bryntum also offers a Scheduler Pro that extends the base scheduler with a scheduling engine, travel time between events, and resource calendars.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-scheduler">Getting started with Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#getting-started-with-bryntum-scheduler" class="hash-link" aria-label="Direct link to Getting started with Bryntum Scheduler" title="Direct link to Getting started with Bryntum Scheduler" translate="no">​</a></h3>
<p>Install the trial package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler@npm:@bryntum/scheduler-trial@7.3.0</span><br></div></code></pre></div></div>
<p>Add a container element to your HTML:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">    </span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">html</span><span class="token style language-css selector punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css selector" style="color:rgb(215, 186, 125)"> body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">margin</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">0</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">%</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">    </span><span class="token style language-css selector id" style="color:rgb(215, 186, 125)">#container</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">vh</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Import the CSS and create a scheduler instance in your JavaScript entry point:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/scheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Scheduler </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> scheduler </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">appendTo</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">endDate</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-26'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// 18 built-in view presets; switch with scheduler.viewPreset = 'weekAndMonth'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">viewPreset</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hourAndDay'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">columns</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Resource'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">130</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resources</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Celia'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sales'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Fancy law firm'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'teal'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Small boutique'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Grocery store'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lime'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">events</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Busy'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">              </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">eventColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'red'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">           </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'clients office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">             </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Suggested meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">endDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-11'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grocery store'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// Custom event renderer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">eventRenderer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token parameter"> eventRecord</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> resourceRecord </span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;b&gt;</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">eventRecord</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">name</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;/b&gt; - </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">resourceRecord</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">name</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>viewPreset</code> property accepts one of 18 built-in presets and controls the time axis granularity. You can switch presets at runtime by assigning <code>scheduler.viewPreset = 'weekAndMonth'</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-timeline-features">Bryntum Scheduler timeline features<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#bryntum-scheduler-timeline-features" class="hash-link" aria-label="Direct link to Bryntum Scheduler timeline features" title="Direct link to Bryntum Scheduler timeline features" translate="no">​</a></h3>
<p>Bryntum Scheduler ships with 18 built-in view presets covering granularities from hour-and-day through full-year views. The <code>eventRenderer</code> callback gives you full control over the HTML content of each event bar, receiving the event record, resource record, and rendering context. Events that overlap on the same resource row are automatically detected and stacked without overlap.</p>
<p>The scheduler uses a virtual DOM rendering strategy that reuses DOM elements as the user scrolls, which keeps the DOM footprint small and maintains smooth scrolling performance even with thousands of events. Milestone markers render as diamond-shaped indicators. Drag-and-drop, resize, and snap-to-grid behaviors are available out of the box.</p>
<p>Bryntum has an MCP server for AI-assisted development, and Scheduler Pro adds travel time constraints between events.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-pricing">Bryntum Scheduler pricing<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#bryntum-scheduler-pricing" class="hash-link" aria-label="Direct link to Bryntum Scheduler pricing" title="Direct link to Bryntum Scheduler pricing" translate="no">​</a></h3>
<p>Bryntum Scheduler costs $680 per developer for the small-team license, with a three-developer minimum. The license includes 12 months of updates and access to the support forum. A free 45-day trial is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-scheduler">Pros of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#pros-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Pros of Bryntum Scheduler" title="Direct link to Pros of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">18 built-in view presets covering hours through years, switchable at runtime</li>
<li class="">Virtual DOM rendering keeps scrolling smooth with dense event data</li>
<li class="">The <code>eventRenderer</code> callback gives complete control over event bar markup</li>
<li class="">Automatic event overlap detection and stacking per resource row</li>
<li class="">Milestone marker support built in</li>
<li class="">Comprehensive documentation with live demos and a code editor</li>
<li class="">MCP server for AI-assisted development workflows</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-scheduler">Cons of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#cons-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Cons of Bryntum Scheduler" title="Direct link to Cons of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">No free or open-source tier, and the three-developer minimum may be high for small projects</li>
<li class="">The large feature surface means there is a learning curve before the API becomes intuitive</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Scheduler</a> is a JavaScript scheduling component that supports multiple views, including a timeline view available in the PRO edition. It works with React, Angular, Vue, and Svelte. The Standard edition is free and GPL-licensed, while the PRO edition adds the timeline view and several other advanced features.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-scheduler">Getting started with DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#getting-started-with-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Scheduler" title="Direct link to Getting started with DHTMLX Scheduler" translate="no">​</a></h3>
<p>Install the package via npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>Import the CSS and configure the timeline view:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> scheduler </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">xml_date </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d %H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createTimelineView</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_unit</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_date</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_step</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_size</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">24</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_start</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_length</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">24</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">y_unit</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">y_property</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'section_id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">render</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">event_dy</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'full'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">templates</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function-variable function" style="color:rgb(220, 220, 170)">timeline_item</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">key</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> option</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;b&gt;</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">text</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;/b&gt;</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">key</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">key</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 10:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 12:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">section_id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 17:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">section_id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>createTimelineView</code> method accepts <code>x_unit</code> and <code>x_step</code> to control the time axis resolution. The <code>scheduler.templates.timeline_item</code> template function controls the HTML rendered inside each event bar.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-timeline-features">DHTMLX Scheduler timeline features<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#dhtmlx-scheduler-timeline-features" class="hash-link" aria-label="Direct link to DHTMLX Scheduler timeline features" title="Direct link to DHTMLX Scheduler timeline features" translate="no">​</a></h3>
<p>The timeline view in DHTMLX Scheduler PRO renders events on a horizontal time axis with configurable unit steps. The <code>x_unit</code> property accepts <code>minute</code>, <code>hour</code>, <code>day</code>, <code>week</code>, <code>month</code>, or <code>year</code>, and <code>x_step</code> sets the number of units per cell. This gives fine-grained control over the time axis without needing separate view presets. Resource rows are defined as a server list and mapped to events via the <code>y_property</code> field.</p>
<p>Custom event rendering is done through the <code>scheduler.templates.timeline_item</code> template, which receives the resource key, resource option, and event object. The <code>render</code> property supports <code>bar</code>, <code>tree</code>, and <code>cell</code> modes. The DataProcessor API handles syncing CRUD changes back to a REST endpoint.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing">DHTMLX Scheduler pricing<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#dhtmlx-scheduler-pricing" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing" title="Direct link to DHTMLX Scheduler pricing" translate="no">​</a></h3>
<p>The Standard edition is free for GPL-compatible open-source projects. PRO licenses range from $599 to $3,999 depending on team size and whether the application is a SaaS product. A 30-day PRO trial is available. The timeline view requires the PRO edition.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-scheduler">Pros of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#pros-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Pros of DHTMLX Scheduler" title="Direct link to Pros of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Free Standard edition suitable for open-source projects</li>
<li class="">Fine-grained time axis configuration through <code>x_unit</code> and <code>x_step</code> without needing preset objects</li>
<li class="">Three timeline render modes: bar, tree, and cell</li>
<li class="">DataProcessor API simplifies REST backend integration</li>
<li class="">Connector helpers available for PHP, Java, and .NET backends</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-scheduler">Cons of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#cons-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Cons of DHTMLX Scheduler" title="Direct link to Cons of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">The timeline view requires the PRO edition. The free Standard edition does not include it</li>
<li class="">Default themes have an outdated appearance and require CSS work to modernize</li>
<li class="">The documentation mixes older and newer API pages, which makes navigation harder</li>
<li class="">No built-in overlap stacking comparable to Bryntum's automatic detection</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule">Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#syncfusion-schedule" class="hash-link" aria-label="Direct link to Syncfusion Schedule" title="Direct link to Syncfusion Schedule" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/javascript-ui-controls/js-scheduler" target="_blank" rel="noopener noreferrer" class="">Syncfusion Schedule</a> is part of Syncfusion's Essential JS 2 commercial UI suite. It includes dedicated timeline views (TimelineDay, TimelineWeek, and TimelineMonth) with resource row support. Syncfusion components work with vanilla JavaScript, React, Angular, Vue, and Blazor.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-schedule">Getting started with Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#getting-started-with-syncfusion-schedule" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Schedule" title="Direct link to Getting started with Syncfusion Schedule" translate="no">​</a></h3>
<p>Install the package via npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-schedule</span><br></div></code></pre></div></div>
<p>Syncfusion requires several CSS imports from its peer packages:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-schedule/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Register your license key, inject the timeline view modules, and create a schedule instance:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> registerLicense </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> TimelineViews </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">Inject</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">TimelineViews</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> schedule </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">height</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'550px'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">selectedDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">views</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">option</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TimelineDay'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">option</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TimelineWeek'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">option</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TimelineMonth'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resources</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">field</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'ResourceId'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">title</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Resource'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">dataSource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">textField</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'text'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">idField</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'id'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">eventSettings</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">dataSource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token number" style="color:rgb(181, 206, 168)">9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">17</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendTo</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'#container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>views</code> array controls which timeline views are available. Timeline views require injecting the <code>TimelineViews</code> module. Custom event content is configured via the <code>eventTemplate</code> property, which accepts an HTML string or template function.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-timeline-features">Syncfusion Schedule timeline features<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#syncfusion-schedule-timeline-features" class="hash-link" aria-label="Direct link to Syncfusion Schedule timeline features" title="Direct link to Syncfusion Schedule timeline features" translate="no">​</a></h3>
<p>Syncfusion Schedule provides three timeline views out of the box: TimelineDay, TimelineWeek, and TimelineMonth. Resource rows are defined in a <code>resources</code> configuration array and linked to events via a field mapping. The <code>eventTemplate</code> property accepts a template function or string to customize the HTML content rendered inside each event bar.</p>
<p>The DataManager integrates with remote data sources using adaptors for REST, OData, and GraphQL endpoints. On-demand data loading is supported for handling large datasets. The component includes time zone support and is built with accessibility compliance in mind. The Theme Studio GUI allows visual customization of any Syncfusion component without writing CSS by hand.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-pricing">Syncfusion Schedule pricing<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#syncfusion-schedule-pricing" class="hash-link" aria-label="Direct link to Syncfusion Schedule pricing" title="Direct link to Syncfusion Schedule pricing" translate="no">​</a></h3>
<p>Syncfusion components are sold as bundles. Team licenses start at $395 per month. A free Community License is available for organizations with fewer than six developers, less than $1 million in annual gross revenue, and less than $3 million in outside capital. A 30-day free trial is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-schedule">Pros of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#pros-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Pros of Syncfusion Schedule" title="Direct link to Pros of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">Three dedicated timeline views included (day, week, month)</li>
<li class="">DataManager with multiple adaptor types simplifies remote data binding</li>
<li class="">Theme Studio GUI enables visual theme customization without CSS</li>
<li class="">Free Community License available for qualifying small organizations</li>
<li class="">Comprehensive demos page with StackBlitz integration for live editing</li>
<li class="">Time zone support and accessibility compliance built in</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-schedule">Cons of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#cons-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Cons of Syncfusion Schedule" title="Direct link to Cons of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">The module injection model requires importing and injecting each view and feature separately, which adds setup boilerplate</li>
<li class="">No zoom presets for sub-day or multi-year granularities comparable to Bryntum's 18 presets</li>
<li class="">The docs search returns results across all Syncfusion components, which makes it harder to find Schedule-specific documentation</li>
<li class="">Commercial licensing is expensive if you only need the scheduler and do not qualify for the Community License</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler">DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#daypilot-scheduler" class="hash-link" aria-label="Direct link to DayPilot Scheduler" title="Direct link to DayPilot Scheduler" translate="no">​</a></h2>
<p><a href="https://javascript.daypilot.org/scheduler/" target="_blank" rel="noopener noreferrer" class="">DayPilot Scheduler</a> is a commercial JavaScript scheduling component that renders events on a horizontal timeline with resource rows. It provides an online UI Builder for visual configuration and supports React, Angular, and Vue in addition to vanilla JavaScript. A Lite (open-source) version is available for basic use cases.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-scheduler">Getting started with DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#getting-started-with-daypilot-scheduler" class="hash-link" aria-label="Direct link to Getting started with DayPilot Scheduler" title="Direct link to Getting started with DayPilot Scheduler" translate="no">​</a></h3>
<p>Install the Lite package via npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @daypilot/daypilot-lite-javascript</span><br></div></code></pre></div></div>
<p>Create a scheduler instance and call <code>init</code>:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> DayPilot </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@daypilot/daypilot-lite-javascript'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> scheduler </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DayPilot</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token class-name" style="color:rgb(78, 201, 176)">Scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">days</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">scale</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">cellWidth</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">40</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resources</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">events</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T17:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">resource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">onBeforeEventRender</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token parameter">args</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        args</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">html </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;b&gt;</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">args</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">data</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">text</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;/b&gt;</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>scale</code> property sets the time axis unit, such as <code>Hour</code> or <code>Day</code>. The <code>onBeforeEventRender</code> callback fires before each event bar is rendered and allows you to modify the HTML, style, and tooltip content of the event.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-timeline-features">DayPilot Scheduler timeline features<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#daypilot-scheduler-timeline-features" class="hash-link" aria-label="Direct link to DayPilot Scheduler timeline features" title="Direct link to DayPilot Scheduler timeline features" translate="no">​</a></h3>
<p>DayPilot Scheduler supports day and week scales in the Lite version. The Pro version extends this to month and year scales. The <code>onBeforeEventRender</code> callback provides per-event HTML customization without requiring a global renderer function. The online UI Builder allows you to configure the scheduler visually and export the resulting configuration code.</p>
<p>Drag-and-drop moving and resizing work in the Lite version. The Pro version adds dependency links, advanced filtering, and undo and redo functionality. There is no built-in scheduling engine.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pricing">DayPilot Scheduler pricing<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#daypilot-scheduler-pricing" class="hash-link" aria-label="Direct link to DayPilot Scheduler pricing" title="Direct link to DayPilot Scheduler pricing" translate="no">​</a></h3>
<p>The <code>@daypilot/daypilot-lite-javascript</code> package is open-source under the Apache 2.0 license and covers basic day and week timeline views. DayPilot Pro starts at $899 per developer for a perpetual license. A 60-day free trial of the Pro version is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-scheduler">Pros of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#pros-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Pros of DayPilot Scheduler" title="Direct link to Pros of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">The Lite version is free and open-source under the Apache 2.0 license</li>
<li class="">The online UI Builder generates configuration code from a visual interface</li>
<li class=""><code>onBeforeEventRender</code> provides clean, per-event HTML customization</li>
<li class="">CSS Theme Designer for visual theme editing</li>
<li class="">Good documentation with interactive demos</li>
<li class="">Integrations with ASP.NET and Java backends are well documented</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-scheduler">Cons of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#cons-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Cons of DayPilot Scheduler" title="Direct link to Cons of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Month and year timeline scales require the paid Pro version</li>
<li class="">No built-in scheduling engine for constraint or dependency management</li>
<li class="">The default UI themes look dated compared to Bryntum and Syncfusion</li>
<li class="">Fewer built-in zoom presets than Bryntum Scheduler</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="vis-timeline">vis-timeline<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#vis-timeline" class="hash-link" aria-label="Direct link to vis-timeline" title="Direct link to vis-timeline" translate="no">​</a></h2>
<p><a href="https://visjs.github.io/vis-timeline/docs/timeline/" target="_blank" rel="noopener noreferrer" class="">vis-timeline</a> is a free, MIT-licensed timeline visualization component from the vis.js project. It is designed for data visualization use cases rather than full scheduling workflows. vis-timeline renders items as bars, points, or background ranges on a time axis, with optional group rows. It does not include a scheduling engine, built-in drag-and-drop event creation, or recurring event support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-vis-timeline">Getting started with vis-timeline<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#getting-started-with-vis-timeline" class="hash-link" aria-label="Direct link to Getting started with vis-timeline" title="Direct link to Getting started with vis-timeline" translate="no">​</a></h3>
<p>Install the package and its data companion:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> vis-timeline vis-data</span><br></div></code></pre></div></div>
<p>Create a timeline with groups and items:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Timeline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> DataSet </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'vis-timeline/standalone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'vis-timeline/styles/vis-timeline-graph2d.min.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> container </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> items </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DataSet</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">group</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T17:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">group</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Milestone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-06T00:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'point'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">group</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> groups </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DataSet</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> timeline </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Timeline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">container</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> items</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> groups</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">start</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">end</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">zoomMin</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          </span><span class="token comment" style="color:rgb(106, 153, 85)">// 1 hour minimum zoom</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">zoomMax</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">24</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">// 30 days maximum zoom</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// Zoom to a custom range</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">timeline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">setWindow</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>zoomMin</code> and <code>zoomMax</code> options constrain the scroll wheel zoom range in milliseconds. The <code>setWindow</code> method programmatically sets the visible time range. Items support HTML content in the <code>content</code> field, and item types include <code>range</code>, <code>point</code>, and <code>background</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="vis-timeline-timeline-features">vis-timeline timeline features<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#vis-timeline-timeline-features" class="hash-link" aria-label="Direct link to vis-timeline timeline features" title="Direct link to vis-timeline timeline features" translate="no">​</a></h3>
<p>vis-timeline uses a <code>DataSet</code> class for reactive data binding. Updating an item in the <code>DataSet</code> automatically reflects in the rendered timeline. Item types give flexibility: <code>range</code> renders a horizontal bar, <code>point</code> renders a single-time marker, and <code>background</code> highlights a time span behind the items.</p>
<p>The zoom behavior is driven by mouse scroll and pinch gestures. <code>zoomMin</code> and <code>zoomMax</code> constrain the zoom range, and <code>setWindow</code> adjusts the viewport programmatically. Groups map directly to resource rows. Custom HTML per item is supported via the <code>content</code> field, which can include HTML strings. The free version has no drag-and-drop event creation or recurring event support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="vis-timeline-pricing">vis-timeline pricing<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#vis-timeline-pricing" class="hash-link" aria-label="Direct link to vis-timeline pricing" title="Direct link to vis-timeline pricing" translate="no">​</a></h3>
<p>vis-timeline is free and licensed under the MIT license. There is no commercial support tier from the vis.js team. Community support is available through GitHub issues.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-vis-timeline">Pros of vis-timeline<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#pros-of-vis-timeline" class="hash-link" aria-label="Direct link to Pros of vis-timeline" title="Direct link to Pros of vis-timeline" translate="no">​</a></h3>
<ul>
<li class="">Completely free under the MIT license with no commercial restrictions</li>
<li class="">Reactive <code>DataSet</code> binding updates the timeline automatically when data changes</li>
<li class="">Three item types (range, point, background) cover common visualization patterns</li>
<li class=""><code>zoomMin</code> and <code>zoomMax</code> provide simple, millisecond-precise zoom constraints</li>
<li class="">HTML content per item allows rich, custom rendering without a global renderer</li>
<li class="">Zero licensing overhead for open-source and commercial projects</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-vis-timeline">Cons of vis-timeline<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#cons-of-vis-timeline" class="hash-link" aria-label="Direct link to Cons of vis-timeline" title="Direct link to Cons of vis-timeline" translate="no">​</a></h3>
<ul>
<li class="">No drag-and-drop event creation or resizing in the free version</li>
<li class="">No recurring event support</li>
<li class="">No built-in zoom presets. Zoom granularity is set in raw milliseconds</li>
<li class="">Not designed for enterprise scheduling workflows: no scheduling engine, no dependency links, and no export functionality</li>
<li class="">Community-only support with no official commercial backing</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-javascript-timeline-scheduler-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below compares key timeline-specific features across all five libraries:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th style="text-align:center">Bryntum Scheduler</th><th style="text-align:center">DHTMLX Scheduler</th><th style="text-align:center">Syncfusion Schedule</th><th style="text-align:center">DayPilot Scheduler</th><th style="text-align:center">vis-timeline</th></tr></thead><tbody><tr><td>Custom event rendering</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td></tr><tr><td>Zoom presets</td><td style="text-align:center">✔️ (18 presets)</td><td style="text-align:center">✔️ (configurable)</td><td style="text-align:center">❌</td><td style="text-align:center">✔️ (limited)</td><td style="text-align:center">❌</td></tr><tr><td>Resource rows</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td></tr><tr><td>Drag-and-drop</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">❌</td></tr><tr><td>Recurring events</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️ (Pro)</td><td style="text-align:center">❌</td></tr><tr><td>Virtual scrolling</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️</td><td style="text-align:center">✔️ (Pro)</td><td style="text-align:center">❌</td></tr><tr><td>Free/open-source tier</td><td style="text-align:center">❌</td><td style="text-align:center">✔️ (Standard)</td><td style="text-align:center">✔️ (Community)</td><td style="text-align:center">✔️ (Lite)</td><td style="text-align:center">✔️ (MIT)</td></tr></tbody></table></div>
<p>The table below maps common use cases to the most suitable library:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Requirements</th><th>Best choice</th></tr></thead><tbody><tr><td>Enterprise resource scheduling</td><td>Dense event data, zoom presets, drag-and-drop, virtual scrolling</td><td>Bryntum Scheduler</td></tr><tr><td>Data visualization or read-only timeline</td><td>Free license, reactive data, custom HTML content, no DnD needed</td><td>vis-timeline</td></tr><tr><td>Budget-constrained project with timeline</td><td>Timeline view without per-developer cost, basic scheduling</td><td>DHTMLX Scheduler Standard or DayPilot Lite</td></tr><tr><td>Mixed scheduler and calendar in one suite</td><td>Multiple views, community license, Blazor support</td><td>Syncfusion Schedule</td></tr></tbody></table></div>
<p>For applications that require dense event data, smooth scrolling performance, and fine-grained zoom control, Bryntum Scheduler is the strongest choice. Its 18 built-in view presets, virtual DOM rendering, automatic event stacking, and <code>eventRenderer</code> API cover the full range of timeline visualization requirements without needing additional configuration.</p>
<p>For projects that need a free, zero-cost timeline visualization without complex scheduling workflows, vis-timeline is the clear choice. Its MIT license, reactive <code>DataSet</code> binding, and HTML content per item make it well suited to dashboards, audit logs, project history views, and other read-heavy use cases.</p>
<p>DHTMLX Scheduler and DayPilot Scheduler both offer free Standard or Lite tiers that handle basic timeline rendering. Both require upgrading to a paid tier for advanced zoom levels and performance features. Syncfusion Schedule is worth considering when your project already uses other Syncfusion components or when the Community License applies, since the bundled pricing becomes more attractive at that point.</p>]]></content:encoded>
            <category>scheduler</category>
        </item>
        <item>
            <title><![CDATA[Best React calendar components]]></title>
            <link>https://www.react-gantt.com/content/best-react-calendar-components/</link>
            <guid>https://www.react-gantt.com/content/best-react-calendar-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Building appointment style features in React requires more than a date picker.]]></description>
            <content:encoded><![CDATA[<p>Building appointment-style features in React requires more than a date picker. Day planners, booking tools, and team schedules need event editing, drag-and-drop, recurrence, and sometimes resource calendars. The right choice depends on how much scheduling logic the app needs and whether a wrapper around a DOM library is enough.</p>
<p>This article compares five React calendar components using the criteria below. For plain JavaScript options, our guide to the <a href="https://bryntum.com/blog/best-javascript-calendar-components/" target="_blank" rel="noopener noreferrer" class="">best JavaScript calendar components</a> covers more alternatives.</p>
<ul>
<li class="">React integration model.</li>
<li class="">Calendar views and editing features.</li>
<li class="">Resource scheduling.</li>
<li class="">Pricing and license tiers.</li>
<li class="">When Bryntum Calendar is the better fit for production scheduling.</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar">Bryntum Calendar<a href="https://www.react-gantt.com/content/best-react-calendar-components/#bryntum-calendar" class="hash-link" aria-label="Direct link to Bryntum Calendar" title="Direct link to Bryntum Calendar" translate="no">​</a></h2>
<p>Bryntum Calendar targets performance-intensive scheduling applications and ships as a fully featured commercial calendar component built from the ground up. It includes a dedicated React wrapper and covers the full range of views a professional calendar tool requires. The <a href="https://bryntum.com/products/calendar/docs/guide/Calendar/gettingstarted/api/integration-react" target="_blank" rel="noopener noreferrer" class="">Bryntum Calendar React quick start</a> covers the full setup path.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Calendar showing a monthly view with multiple events" src="https://www.react-gantt.com/assets/images/bryntum-calendar-70dce206121152f0d903196195e93e01.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-setup-with-the-react-wrapper">Bryntum Calendar setup with the React wrapper<a href="https://www.react-gantt.com/content/best-react-calendar-components/#bryntum-calendar-setup-with-the-react-wrapper" class="hash-link" aria-label="Direct link to Bryntum Calendar setup with the React wrapper" title="Direct link to Bryntum Calendar setup with the React wrapper" translate="no">​</a></h3>
<p>Install the trial packages from the npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar@npm:@bryntum/calendar-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar-react@7.3.0</span><br></div></code></pre></div></div>
<p>Import the CSS files in a specific order. Font files must come before component styles so that icons resolve correctly:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/calendar.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Then use the <code>BryntumCalendar</code> component in your app:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumCalendar</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        date      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bryntum team'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hotel Park'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'michael'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Michael Johnson'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'deep-orange'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hackathon 2025'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                       startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-11T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-18T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> allDay </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'green'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Breakfast'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                            startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hotel'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team Scrum'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">                           startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Scheduler Grid introduction + review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-10-12T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bryntum'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">BryntumCalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">config</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-gives-react-apps-resource-scheduling-out-of-the-box">Bryntum Calendar gives React apps resource scheduling out of the box<a href="https://www.react-gantt.com/content/best-react-calendar-components/#bryntum-calendar-gives-react-apps-resource-scheduling-out-of-the-box" class="hash-link" aria-label="Direct link to Bryntum Calendar gives React apps resource scheduling out of the box" title="Direct link to Bryntum Calendar gives React apps resource scheduling out of the box" translate="no">​</a></h3>
<p>Bryntum Calendar covers day, week, month, year, and agenda views out of the box. Recurring events follow RFC 5545 RRULE syntax, which means recurrence rules defined in one system can be read by any other standards-compliant calendar application. The component supports drag-and-drop, all-day events, and a built-in event editor with conflict detection so users cannot accidentally double-book.</p>
<p>The resource calendar view makes it possible to overlay events from multiple people or rooms in a single calendar, which is useful for team availability and room booking scenarios. Bryntum Calendar ships with 10 built-in themes covering both light and dark appearances.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-starts-with-the-small-team-license">Bryntum Calendar starts with the Small Team license<a href="https://www.react-gantt.com/content/best-react-calendar-components/#bryntum-calendar-starts-with-the-small-team-license" class="hash-link" aria-label="Direct link to Bryntum Calendar starts with the Small Team license" title="Direct link to Bryntum Calendar starts with the Small Team license" translate="no">​</a></h3>
<p>A license costs $680 per developer for the <strong>Small Team</strong> license, with a three-developer minimum and 12 months of updates. After the first year, continued updates require renewal. No free tier is available, but a trial version is on the npm registry.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-brings-advanced-scheduling-features-to-react">Bryntum Calendar brings advanced scheduling features to React<a href="https://www.react-gantt.com/content/best-react-calendar-components/#bryntum-calendar-brings-advanced-scheduling-features-to-react" class="hash-link" aria-label="Direct link to Bryntum Calendar brings advanced scheduling features to React" title="Direct link to Bryntum Calendar brings advanced scheduling features to React" translate="no">​</a></h3>
<p>Bryntum Calendar stands out for several reasons.</p>
<ul>
<li class="">First-class React wrapper with full TypeScript support.</li>
<li class="">RFC 5545 RRULE recurring events for standards-compliant interoperability.</li>
<li class="">Resource calendar view included without a premium upsell.</li>
<li class="">Ten built-in themes covering both light and dark appearances.</li>
<li class="">Active commercial support and a long release history.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-adds-commercial-cost-and-css-order-requirements">Bryntum Calendar adds commercial cost and CSS order requirements<a href="https://www.react-gantt.com/content/best-react-calendar-components/#bryntum-calendar-adds-commercial-cost-and-css-order-requirements" class="hash-link" aria-label="Direct link to Bryntum Calendar adds commercial cost and CSS order requirements" title="Direct link to Bryntum Calendar adds commercial cost and CSS order requirements" translate="no">​</a></h3>
<p>Three limitations apply when evaluating Bryntum Calendar.</p>
<ul>
<li class="">Commercial-only, with no free or open source tier for any project type.</li>
<li class="">Per-developer cost is higher than some commercial alternatives.</li>
<li class="">Font CSS imports must come in a specific order, which can catch new users off guard.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar">FullCalendar<a href="https://www.react-gantt.com/content/best-react-calendar-components/#fullcalendar" class="hash-link" aria-label="Direct link to FullCalendar" title="Direct link to FullCalendar" translate="no">​</a></h2>
<p>FullCalendar has the largest community of any open source calendar library in the JavaScript ecosystem. Its core package is MIT-licensed, and it has a large ecosystem of plugins for views, time zones, and recurrence. The React integration is a first-class package, not an afterthought.</p>
<p><img decoding="async" loading="lazy" alt="FullCalendar showing a week view with events" src="https://www.react-gantt.com/assets/images/fullcalendar-f424f641430ab0ee0ea9a350d153db7b.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-setup-with-react-plugins">FullCalendar setup with React plugins<a href="https://www.react-gantt.com/content/best-react-calendar-components/#fullcalendar-setup-with-react-plugins" class="hash-link" aria-label="Direct link to FullCalendar setup with React plugins" title="Direct link to FullCalendar setup with React plugins" translate="no">​</a></h3>
<p>Install the core package and whichever view and plugin packages you need:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @fullcalendar/react @fullcalendar/core @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/list @fullcalendar/interaction @fullcalendar/rrule</span><br></div></code></pre></div></div>
<p>Then compose the calendar with the plugins you installed:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">FullCalendar</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">dayGridPlugin</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/daygrid'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">timeGridPlugin</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/timegrid'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">listPlugin</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/list'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">interactionPlugin</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/interaction'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">rrulePlugin</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@fullcalendar/rrule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">FullCalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">plugins</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">dayGridPlugin</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> timeGridPlugin</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> listPlugin</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> interactionPlugin</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> rrulePlugin</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">initialView</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">dayGridMonth</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">headerToolbar</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> left </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'prev,next today'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> center </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'title'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> right </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'dayGridMonth,timeGridWeek,timeGridDay,listWeek'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">editable</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">selectable</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">events</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">            </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> title </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> rrule </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> freq </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'weekly'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> byweekday </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'mo'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'tu'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'we'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'th'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'fr'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> dtstart </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'2026-01-15T09:00:00'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> duration </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'00:30'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">            </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> title </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> start </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'2026-01-16T14:00:00'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> end </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'2026-01-16T15:00:00'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">        </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-covers-react-calendars-without-resource-views">FullCalendar covers React calendars without resource views<a href="https://www.react-gantt.com/content/best-react-calendar-components/#fullcalendar-covers-react-calendars-without-resource-views" class="hash-link" aria-label="Direct link to FullCalendar covers React calendars without resource views" title="Direct link to FullCalendar covers React calendars without resource views" translate="no">​</a></h3>
<p>FullCalendar supports day, week, month, and list views through its plugin architecture. Drag-and-drop requires the interaction plugin, and RRULE-based recurring events require the rrule plugin, both of which are free and MIT-licensed. Time zone support is also available as a plugin.</p>
<p>Resource views (resource timeline, resource day, and resource week) are available in <strong>FullCalendar Premium</strong>. The core package covers standard appointment-style calendaring well, and because it is MIT-licensed, it fits into any project regardless of commercial restrictions.</p>
<p>FullCalendar is easier to justify for a free React calendar, but Bryntum Calendar is the clearer choice when resource calendars are central to the product.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-keeps-the-core-free-and-charges-for-resource-views">FullCalendar keeps the core free and charges for resource views<a href="https://www.react-gantt.com/content/best-react-calendar-components/#fullcalendar-keeps-the-core-free-and-charges-for-resource-views" class="hash-link" aria-label="Direct link to FullCalendar keeps the core free and charges for resource views" title="Direct link to FullCalendar keeps the core free and charges for resource views" translate="no">​</a></h3>
<p>The core library is MIT-licensed and free for any use. <strong>FullCalendar Premium</strong> starts at $480 per year and adds resource views, which are the main reason teams upgrade.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-gives-react-teams-a-mature-free-core">FullCalendar gives React teams a mature free core<a href="https://www.react-gantt.com/content/best-react-calendar-components/#fullcalendar-gives-react-teams-a-mature-free-core" class="hash-link" aria-label="Direct link to FullCalendar gives React teams a mature free core" title="Direct link to FullCalendar gives React teams a mature free core" translate="no">​</a></h3>
<p>FullCalendar is a strong choice for several reasons.</p>
<ul>
<li class="">MIT-licensed core with a large community and extensive documentation.</li>
<li class="">Plugin architecture keeps bundle size manageable, since the app only includes the plugins it uses.</li>
<li class="">RRULE recurring events are part of the free tier.</li>
<li class="">Strong time zone support.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-needs-plugins-for-richer-react-scheduling">FullCalendar needs plugins for richer React scheduling<a href="https://www.react-gantt.com/content/best-react-calendar-components/#fullcalendar-needs-plugins-for-richer-react-scheduling" class="hash-link" aria-label="Direct link to FullCalendar needs plugins for richer React scheduling" title="Direct link to FullCalendar needs plugins for richer React scheduling" translate="no">​</a></h3>
<p>Three limitations come with FullCalendar.</p>
<ul>
<li class="">Resource calendar views sit behind a <strong>Premium</strong> paywall.</li>
<li class="">A full-featured calendar setup requires installing and wiring several packages.</li>
<li class="">Theming options are more limited compared to commercial alternatives.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x">Schedule-X<a href="https://www.react-gantt.com/content/best-react-calendar-components/#schedule-x" class="hash-link" aria-label="Direct link to Schedule-X" title="Direct link to Schedule-X" translate="no">​</a></h2>
<p>Schedule-X takes a TypeScript-first approach with an MIT license and a clean plugin architecture. It is newer than FullCalendar, but its API design reflects lessons learned from older libraries. Configuration uses composable plugins rather than a single monolithic options object.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-setup-with-its-react-adapter">Schedule-X setup with its React adapter<a href="https://www.react-gantt.com/content/best-react-calendar-components/#schedule-x-setup-with-its-react-adapter" class="hash-link" aria-label="Direct link to Schedule-X setup with its React adapter" title="Direct link to Schedule-X setup with its React adapter" translate="no">​</a></h3>
<p>Install the core packages and the plugins you need:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @schedule-x/react @schedule-x/calendar @schedule-x/theme-default @schedule-x/event-recurrence</span><br></div></code></pre></div></div>
<p>Set up the calendar using the <code>useCalendarApp</code> hook and render it with <code>ScheduleXCalendar</code>:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useCalendarApp</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ScheduleXCalendar</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> createViewWeek</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> createViewMonthGrid</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> createViewDay </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/calendar'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> createEventsServicePlugin </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/events-service'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> createEventRecurrencePlugin </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/event-recurrence'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@schedule-x/theme-default/dist/index.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> eventsService  </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createEventsServicePlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> recurrencePlugin </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createEventRecurrencePlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> calendar </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useCalendarApp</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        views   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token function" style="color:rgb(220, 220, 170)">createViewDay</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createViewWeek</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createViewMonthGrid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15 09:30'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> rrule </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16 14:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16 15:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        plugins </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">eventsService</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> recurrencePlugin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleXCalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">calendarApp</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">calendar</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-gives-react-teams-a-typescript-first-calendar-core">Schedule-X gives React teams a TypeScript-first calendar core<a href="https://www.react-gantt.com/content/best-react-calendar-components/#schedule-x-gives-react-teams-a-typescript-first-calendar-core" class="hash-link" aria-label="Direct link to Schedule-X gives React teams a TypeScript-first calendar core" title="Direct link to Schedule-X gives React teams a TypeScript-first calendar core" translate="no">​</a></h3>
<p>Schedule-X provides day, week, and month views. Recurring events are available through the free event recurrence plugin, while drag-and-drop requires a <strong>Premium</strong> plugin. Dark mode is built in. The library is TypeScript-first, so type safety is consistent throughout the API rather than bolted on through separate declaration files.</p>
<p>Schedule-X has no resource calendar view. Teams that need to display multiple people's events side by side must build that layer themselves or choose a different library.</p>
<p>Schedule-X is lighter than Bryntum Calendar, but Bryntum includes more scheduling behavior before you reach for paid plugins or custom code.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-pricing-separates-free-core-and-premium-plugins">Schedule-X pricing separates free core and Premium plugins<a href="https://www.react-gantt.com/content/best-react-calendar-components/#schedule-x-pricing-separates-free-core-and-premium-plugins" class="hash-link" aria-label="Direct link to Schedule-X pricing separates free core and Premium plugins" title="Direct link to Schedule-X pricing separates free core and Premium plugins" translate="no">​</a></h3>
<p>Schedule-X core is MIT-licensed and free. <strong>Premium</strong> plugins, including resource view, drag-and-drop, drag-to-create, and event forms, require a paid Schedule-X <strong>Premium</strong> license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-keeps-react-calendar-bundles-small">Schedule-X keeps React calendar bundles small<a href="https://www.react-gantt.com/content/best-react-calendar-components/#schedule-x-keeps-react-calendar-bundles-small" class="hash-link" aria-label="Direct link to Schedule-X keeps React calendar bundles small" title="Direct link to Schedule-X keeps React calendar bundles small" translate="no">​</a></h3>
<p>Schedule-X has three notable advantages.</p>
<ul>
<li class="">MIT-licensed core with a typed React API.</li>
<li class="">TypeScript-first with well-typed APIs throughout.</li>
<li class="">Dark mode out of the box.</li>
<li class="">Plugin architecture keeps the core small and the API composable.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-falls-short-when-resource-calendars-are-required">Schedule-X falls short when resource calendars are required<a href="https://www.react-gantt.com/content/best-react-calendar-components/#schedule-x-falls-short-when-resource-calendars-are-required" class="hash-link" aria-label="Direct link to Schedule-X falls short when resource calendars are required" title="Direct link to Schedule-X falls short when resource calendars are required" translate="no">​</a></h3>
<p>Three limitations make Schedule-X unsuitable for some projects.</p>
<ul>
<li class="">No resource calendar view.</li>
<li class="">Newer project with a smaller community than FullCalendar.</li>
<li class="">Fewer themes and customization options compared to commercial products.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-calendar-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p>DHTMLX Scheduler has been in production use for many years and covers the full range of scheduling views, including day, week, month, year, and agenda, with strong recurring event support. DHTMLX now publishes an official React Scheduler wrapper for paid tiers, while <strong>Individual</strong> and GPL users still use the plain JavaScript scheduler in React.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler showing a calendar view" src="https://www.react-gantt.com/assets/images/dhtmlx-calendar-0fd1d8cd7c8d49686435e42b25656815.png" width="2880" height="1564" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-setup-with-react-scheduler">DHTMLX Scheduler setup with React Scheduler<a href="https://www.react-gantt.com/content/best-react-calendar-components/#dhtmlx-scheduler-setup-with-react-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler setup with React Scheduler" title="Direct link to DHTMLX Scheduler setup with React Scheduler" translate="no">​</a></h3>
<p>Install the evaluation React package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @dhtmlx/trial-react-scheduler</span><br></div></code></pre></div></div>
<p>Render the <code>ReactScheduler</code> component with event data and a default view:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ReactScheduler</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@dhtmlx/trial-react-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@dhtmlx/trial-react-scheduler/dist/react-scheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15T09:30:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T15:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">CalendarComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> height </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100vh'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ReactScheduler</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">events</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">events</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">view</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">month</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">date</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript keyword" style="color:rgb(86, 156, 214)">new</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'2026-01-15T00:00:00'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-depends-on-the-right-react-licensing-tier">DHTMLX Scheduler depends on the right React licensing tier<a href="https://www.react-gantt.com/content/best-react-calendar-components/#dhtmlx-scheduler-depends-on-the-right-react-licensing-tier" class="hash-link" aria-label="Direct link to DHTMLX Scheduler depends on the right React licensing tier" title="Direct link to DHTMLX Scheduler depends on the right React licensing tier" translate="no">​</a></h3>
<p>DHTMLX Scheduler covers day, week, month, year, and agenda views with recurring event support and touch device compatibility. The <strong>Standard</strong> edition is free for GPL-compatible open-source projects. The <strong>PRO</strong> edition adds a Mini Calendar widget, a Unit view for displaying events grouped by category, and a Timeline view similar to a resource grid.</p>
<p>DHTMLX React Scheduler supports props for events, view, date, config, and templates. The older DOM ref integration remains relevant for <strong>Individual</strong> and GPL users, which makes the licensing tier part of the technical decision.</p>
<p>DHTMLX Scheduler covers mature calendar views, but Bryntum Calendar gives React teams a more direct component integration path.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing-separates-gpl-and-pro-use">DHTMLX Scheduler pricing separates GPL and PRO use<a href="https://www.react-gantt.com/content/best-react-calendar-components/#dhtmlx-scheduler-pricing-separates-gpl-and-pro-use" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" title="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" translate="no">​</a></h3>
<p>DHTMLX Scheduler <strong>Standard</strong> is free for GPL-compatible open-source projects. Paid <strong>PRO</strong> licenses start with the <strong>Individual</strong> tier at $599, and DHTMLX lists <strong>Commercial</strong>, <strong>Enterprise</strong>, and <strong>Ultimate</strong> tiers for larger teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-brings-mature-calendar-views-to-react">DHTMLX Scheduler brings mature calendar views to React<a href="https://www.react-gantt.com/content/best-react-calendar-components/#dhtmlx-scheduler-brings-mature-calendar-views-to-react" class="hash-link" aria-label="Direct link to DHTMLX Scheduler brings mature calendar views to React" title="Direct link to DHTMLX Scheduler brings mature calendar views to React" translate="no">​</a></h3>
<p>DHTMLX Scheduler offers four notable strengths.</p>
<ul>
<li class="">Free <strong>Standard</strong> edition for GPL-compatible open-source projects.</li>
<li class="">Mature library with extensive documentation and a long support history.</li>
<li class="">Day, week, month, year, and agenda views all included in the <strong>Standard</strong> edition.</li>
<li class="">Touch support built in.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-gates-the-react-wrapper-behind-higher-tiers">DHTMLX Scheduler gates the React wrapper behind higher tiers<a href="https://www.react-gantt.com/content/best-react-calendar-components/#dhtmlx-scheduler-gates-the-react-wrapper-behind-higher-tiers" class="hash-link" aria-label="Direct link to DHTMLX Scheduler gates the React wrapper behind higher tiers" title="Direct link to DHTMLX Scheduler gates the React wrapper behind higher tiers" translate="no">​</a></h3>
<p>Three drawbacks apply when using DHTMLX Scheduler in a React project.</p>
<ul>
<li class="">The official React wrapper is available only with <strong>Commercial</strong>, <strong>Enterprise</strong>, and <strong>Ultimate</strong> licenses.</li>
<li class=""><strong>Individual</strong> and GPL users need the plain JavaScript integration, which sits outside the React rendering model.</li>
<li class=""><strong>PRO</strong> pricing is harder to compare at a glance than the Bryntum per-developer pricing.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-calendar-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p>Mobiscroll Event Calendar emphasizes mobile-first design and works well on both desktop and touch devices. It supports calendar, timeline, and agenda views with a strong emphasis on responsive design and intuitive interaction patterns.</p>
<p><img decoding="async" loading="lazy" alt="Mobiscroll Event Calendar showing an event calendar view" src="https://www.react-gantt.com/assets/images/mobiscroll-calendar-cd4f3cb5356370346e5d25e1de657bbe.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-setup-with-react">Mobiscroll Event Calendar setup with React<a href="https://www.react-gantt.com/content/best-react-calendar-components/#mobiscroll-event-calendar-setup-with-react" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar setup with React" title="Direct link to Mobiscroll Event Calendar setup with React" translate="no">​</a></h3>
<p>Configure the Mobiscroll private npm registry before installing the React package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/react</span><br></div></code></pre></div></div>
<p>Import the CSS and use the <code>Eventcalendar</code> component:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Eventcalendar</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscCalendarEvent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react/dist/css/mobiscroll.min.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscCalendarEvent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team standup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15T09:30:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> recurring </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> repeat </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'weekly'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> weekDays </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'MO,TU,WE,TH,FR'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-16T15:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Eventcalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">view</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> calendar </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> type </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'week'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> popover </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript boolean" style="color:rgb(78, 201, 176)">true</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">data</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">events</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dragToMove</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dragToCreate</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-targets-mobile-first-react-calendars">Mobiscroll Event Calendar targets mobile-first React calendars<a href="https://www.react-gantt.com/content/best-react-calendar-components/#mobiscroll-event-calendar-targets-mobile-first-react-calendars" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar targets mobile-first React calendars" title="Direct link to Mobiscroll Event Calendar targets mobile-first React calendars" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar provides calendar, timeline, and agenda views. Recurring events use an object-based recurrence API rather than raw RRULE strings. Drag-to-move and drag-to-create are available as props, and the mobile-first design means the calendar adapts well to small screens without additional configuration.</p>
<p>The component ships with a dedicated React API and full TypeScript support. Customization is handled through props and CSS variables rather than a plugin system.</p>
<p>Mobiscroll is the stronger mobile-first option, while Bryntum Calendar is stronger for complex resource scheduling in React.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-starts-with-an-internal-project-license">Mobiscroll Event Calendar starts with an internal project license<a href="https://www.react-gantt.com/content/best-react-calendar-components/#mobiscroll-event-calendar-starts-with-an-internal-project-license" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar starts with an internal project license" title="Direct link to Mobiscroll Event Calendar starts with an internal project license" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 for a single internal project as a perpetual license. The <strong>Complete</strong> internal project license starts at $1,955 and adds the full product set, source code, and priority support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-prioritizes-touch-ux">Mobiscroll Event Calendar prioritizes touch UX<a href="https://www.react-gantt.com/content/best-react-calendar-components/#mobiscroll-event-calendar-prioritizes-touch-ux" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar prioritizes touch UX" title="Direct link to Mobiscroll Event Calendar prioritizes touch UX" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar has four strengths worth noting.</p>
<ul>
<li class="">Mobile-first design that works well on touch devices out of the box.</li>
<li class="">Native React component with TypeScript support.</li>
<li class="">Drag-to-create lets users create events directly on the calendar without opening a separate form.</li>
<li class="">Clean, minimal API for recurring events.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-offers-fewer-scheduler-views-than-bryntum">Mobiscroll Event Calendar offers fewer scheduler views than Bryntum<a href="https://www.react-gantt.com/content/best-react-calendar-components/#mobiscroll-event-calendar-offers-fewer-scheduler-views-than-bryntum" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar offers fewer scheduler views than Bryntum" title="Direct link to Mobiscroll Event Calendar offers fewer scheduler views than Bryntum" translate="no">​</a></h3>
<p>Three limitations apply before choosing Mobiscroll.</p>
<ul>
<li class="">Multi-project product teams need a higher tier or a SaaS license.</li>
<li class="">Recurrence uses a custom object format rather than RFC 5545 RRULE strings, which can complicate interoperability with other calendar systems.</li>
<li class="">Fewer view types than Bryntum Calendar or DHTMLX Scheduler.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="which-react-calendar-component-should-you-choose">Which React calendar component should you choose?<a href="https://www.react-gantt.com/content/best-react-calendar-components/#which-react-calendar-component-should-you-choose" class="hash-link" aria-label="Direct link to Which React calendar component should you choose?" title="Direct link to Which React calendar component should you choose?" translate="no">​</a></h2>
<p>The table below summarizes how the five components compare across key features.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Calendar</th><th>FullCalendar</th><th>Schedule-X</th><th>DHTMLX Scheduler</th><th>Mobiscroll</th></tr></thead><tbody><tr><td>Day/week/month views</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Recurring events</td><td>Yes (RFC 5545)</td><td>Yes (RFC 5545)</td><td>Yes (RFC 5545)</td><td>Yes</td><td>Yes (custom format)</td></tr><tr><td>Drag-and-drop</td><td>Yes</td><td>Yes</td><td>Yes (plugin)</td><td>Yes</td><td>Yes</td></tr><tr><td>Resource calendar view</td><td>Yes</td><td><strong>Premium</strong> only</td><td>No</td><td><strong>PRO</strong> only</td><td>No</td></tr><tr><td>Dark mode</td><td>Yes (themes)</td><td>Limited</td><td>Yes</td><td>Limited</td><td>Yes</td></tr><tr><td>React wrapper</td><td>Yes</td><td>Yes</td><td>Yes</td><td>No (DOM ref)</td><td>Yes</td></tr><tr><td>Free / open source tier</td><td>No</td><td>Yes (MIT core)</td><td>Yes (MIT)</td><td>Yes (GPL projects)</td><td>No</td></tr></tbody></table></div>
<p>The table below maps common scenarios to the most appropriate option.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Scenario</th><th>Recommended option</th></tr></thead><tbody><tr><td>Enterprise app needing resource scheduling</td><td>Bryntum Calendar</td></tr><tr><td>Open source project with a tight budget</td><td>FullCalendar (MIT core) or Schedule-X</td></tr><tr><td>Mobile-first consumer application</td><td>Mobiscroll Event Calendar</td></tr><tr><td>GPL-licensed project needing mature tooling</td><td>DHTMLX Scheduler Standard</td></tr></tbody></table></div>
<p>For teams building a general-purpose appointment calendar with no resource scheduling needs, FullCalendar and Schedule-X both cover the core use case for free. FullCalendar has a larger community and more documentation, while Schedule-X offers a more modern TypeScript-first API. For projects that need resource calendars (overlaying multiple people's schedules), Bryntum Calendar is the strongest option in the free-to-commercial comparison, with resource scheduling included in its standard license rather than locked behind an upgrade.</p>
<p>Mobiscroll is worth considering when the primary user base is on mobile devices, since its responsive design handling is noticeably smoother than the other options. DHTMLX Scheduler is a reasonable choice for teams that are already using other DHTMLX products or need a GPL-compatible free license for an open source project.</p>
<p>For teams building internal tools, booking systems, or any application where scheduling is central to the product, we recommend trying Bryntum Calendar. Its combination of RFC 5545 RRULE support, resource calendaring, and a genuine React wrapper makes it the most complete option for complex scheduling requirements.</p>]]></content:encoded>
            <category>calendar</category>
        </item>
        <item>
            <title><![CDATA[Best React Gantt chart libraries]]></title>
            <link>https://www.react-gantt.com/content/best-react-gantt-chart-libraries/</link>
            <guid>https://www.react-gantt.com/content/best-react-gantt-chart-libraries/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Choosing the right Gantt chart library for a React application depends on the scheduling features the product needs, how the library integrates with.]]></description>
            <content:encoded><![CDATA[<p>Choosing the right Gantt chart library for a React application depends on the scheduling features the product needs, how the library integrates with React's component model, and what the license costs at team scale. This comparison covers five libraries: <a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a>, <a href="https://dhtmlx.com/docs/products/dhtmlxGantt/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Gantt</a>, <a href="https://www.syncfusion.com/react-ui-components/react-gantt-chart" target="_blank" rel="noopener noreferrer" class="">Syncfusion Gantt</a>, <a href="https://doc.daypilot.org/gantt/" target="_blank" rel="noopener noreferrer" class="">DayPilot Gantt</a>, and <a href="https://github.com/MaTeMaTuK/gantt-task-react" target="_blank" rel="noopener noreferrer" class="">gantt-task-react</a>.</p>
<p>The libraries range from a free MIT-licensed component suited to simple project timelines to full-featured enterprise schedulers with auto-scheduling engines, resource management, and client-side export. Four of the five provide a React-specific wrapper package. DHTMLX Gantt is a vanilla JavaScript library that must be initialized manually inside a React component using a container ref. For a broader comparison that also covers non-React contexts, see our guide to the <a href="https://bryntum.com/blog/best-javascript-gantt-chart-libraries/" target="_blank" rel="noopener noreferrer" class="">best JavaScript Gantt chart libraries</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt">Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#bryntum-gantt" class="hash-link" aria-label="Direct link to Bryntum Gantt" title="Direct link to Bryntum Gantt" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a> is a commercial Gantt chart built on vanilla JavaScript with a React wrapper available as a separate package. It is backed by the ChronoGraph reactive scheduling engine, which recalculates dependent task dates automatically. You can explore the full range of capabilities in the <a href="https://bryntum.com/products/gantt/examples/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt demos</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-gantt">Getting started with Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#getting-started-with-bryntum-gantt" class="hash-link" aria-label="Direct link to Getting started with Bryntum Gantt" title="Direct link to Getting started with Bryntum Gantt" translate="no">​</a></h3>
<p>Install the trial package from the public npm registry along with the React wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt@npm:@bryntum/gantt-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt-react@7.3.0</span><br></div></code></pre></div></div>
<p>CSS imports must appear in this specific order. The FontAwesome stylesheets must come first because the Gantt's toolbar icons depend on them. The core <code>gantt.css</code> file follows, and the theme file comes last so its variables override the defaults correctly:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/gantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>BryntumGantt</code> component accepts a <code>ref</code> for accessing the underlying Gantt instance and spreads a config object as props. Pass all data through the <code>project</code> prop. Never mix the <code>project</code> prop with inline data props (<code>tasks</code>, <code>dependencies</code>, <code>resources</code>) directly on <code>BryntumGantt</code>, as using both simultaneously throws a runtime error:</p>
<div class="language-jsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-jsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumGantt</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useRef</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> ganttRef </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">ganttConfig</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">columns</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">        </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'percentdone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">project</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token literal-property property">tasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Launch SaaS Product'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">expanded</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">35.7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token literal-property property">children</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Install Apache'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Configure firewall'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Run tests'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-21'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token literal-property property">dependencies</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">lag</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">BryntumGantt</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">ganttRef</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">ganttConfig</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>For server-backed data, configure a CrudManager in the <code>project</code> prop. The CrudManager handles loading and syncing through a JSON protocol, so you do not need to write manual fetch logic:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token literal-property property">project</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">loadUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/load'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">syncUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/sync'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoLoad</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoSync</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Bryntum ships 10 themes across five light/dark pairs: svalbard-light, svalbard-dark, stockholm-light, stockholm-dark, visby-light, visby-dark, material3-light, material3-dark, fluent2-light, and fluent2-dark. To switch themes, replace the theme CSS import.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-627cdc5a5d97c6a596d5b811f1dc7b71.png" width="2880" height="1562" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-features">Bryntum Gantt features<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#bryntum-gantt-features" class="hash-link" aria-label="Direct link to Bryntum Gantt features" title="Direct link to Bryntum Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Auto-scheduling with the ChronoGraph reactive engine: task dates recalculate when predecessors or constraints change</li>
<li class="">Critical path visualization</li>
<li class="">Resource management and baselines</li>
<li class="">Split tasks and undo/redo</li>
<li class="">Client-side export to PDF, PNG, Excel, ICS, and MS Project XML with no server required</li>
<li class="">MS Project and Primavera P6 import via MPXJ</li>
<li class="">10 themes across five light/dark pairs</li>
<li class="">45 built-in locales</li>
<li class="">React, Angular, Vue, and plain JavaScript wrappers</li>
<li class="">HTTP MCP server at <a href="https://mcp.bryntum.com/" target="_blank" rel="noopener noreferrer" class="">mcp.bryntum.com</a> for AI-assisted development</li>
<li class="">Claude Code skill for common setup mistakes</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-pricing">Bryntum Gantt pricing<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#bryntum-gantt-pricing" class="hash-link" aria-label="Direct link to Bryntum Gantt pricing" title="Direct link to Bryntum Gantt pricing" translate="no">​</a></h3>
<p>Bryntum Gantt is sold on a per-developer basis, starting at $940 per developer. The license is perpetual and includes 12 months of updates. OEM and SaaS usage requires a separate quote. A free 45-day trial is available at <a href="https://bryntum.com/download/?product=gantt" target="_blank" rel="noopener noreferrer" class="">bryntum.com/download/?product=gantt</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-gantt">Pros of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#pros-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Pros of Bryntum Gantt" title="Direct link to Pros of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">Comprehensive scheduling engine (ChronoGraph) with automatic dependency propagation</li>
<li class="">Client-side export to PDF, Excel, and MS Project XML without a server-side component</li>
<li class="">All features included in the base license, with no feature-gated tiers</li>
<li class="">10 themes covering both light and dark variants</li>
<li class="">HTTP MCP server and Claude Code skill for AI-assisted development</li>
<li class="">Extensive documentation, demos, and forum support</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-gantt">Cons of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#cons-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Cons of Bryntum Gantt" title="Direct link to Cons of Bryntum Gantt" translate="no">​</a></h3>
<p>There is no free tier beyond the 45-day trial. The per-developer entry cost is higher than some alternatives, which may be a consideration for small teams or individual developers evaluating options.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt">DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#dhtmlx-gantt" class="hash-link" aria-label="Direct link to DHTMLX Gantt" title="Direct link to DHTMLX Gantt" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxGantt/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Gantt</a> is a JavaScript Gantt library with no official React wrapper. In a React project, you initialize it imperatively inside a <code>useEffect</code> hook using a container ref.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-gantt">Getting started with DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#getting-started-with-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Gantt" title="Direct link to Getting started with DHTMLX Gantt" translate="no">​</a></h3>
<p>Install the package from the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-gantt@9.1.4</span><br></div></code></pre></div></div>
<p>Because DHTMLX Gantt uses a global singleton, initialization requires a specific sequence: <code>gantt.init()</code> must be called before <code>gantt.parse()</code>. Reversing this order leaves the chart without a DOM target and produces a silent failure. The <code>clearAll()</code> call in the cleanup function prevents data from persisting across React strict-mode remounts:</p>
<div class="language-jsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-jsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useEffect</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> useRef </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> gantt </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt/codebase/dhtmlxgantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(220, 220, 170)">DHtmlxGanttChart</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token parameter"> tasks</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> links </span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> containerRef </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword null nil" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">useEffect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">date_format</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">containerRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">current</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">data</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> links </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">clearAll</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">containerRef</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript literal-property property" style="color:rgb(78, 201, 176)">width</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100%'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript literal-property property" style="color:rgb(78, 201, 176)">height</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'500px'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The global singleton pattern also means that rendering multiple DHTMLX Gantt instances on the same page requires the Commercial license or higher.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Gantt" src="https://www.react-gantt.com/assets/images/dhtmlx-gantt-ff658910fe3ae8368cfabb8d895d8c43.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-features">DHTMLX Gantt features<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#dhtmlx-gantt-features" class="hash-link" aria-label="Direct link to DHTMLX Gantt features" title="Direct link to DHTMLX Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Drag-and-drop task editing</li>
<li class="">Dependency links</li>
<li class="">Zoom levels</li>
<li class="">Task trees and subtasks</li>
<li class="">Auto-scheduling, critical path, resource management, baselines, and split tasks (Pro license required)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-pricing">DHTMLX Gantt pricing<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#dhtmlx-gantt-pricing" class="hash-link" aria-label="Direct link to DHTMLX Gantt pricing" title="Direct link to DHTMLX Gantt pricing" translate="no">​</a></h3>
<p>DHTMLX Gantt Standard is available under the GPL license at no cost for open-source projects. Commercial licenses are perpetual: Individual at $699, Commercial at $1,399, Enterprise at $2,999, and Ultimate at $5,999.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-gantt">Pros of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#pros-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Pros of DHTMLX Gantt" title="Direct link to Pros of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard edition is free for open-source projects</li>
<li class="">Published, tiered pricing</li>
<li class="">Available on the public npm registry</li>
<li class="">HTTP MCP server available for AI-assisted development</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-gantt">Cons of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#cons-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Cons of DHTMLX Gantt" title="Direct link to Cons of DHTMLX Gantt" translate="no">​</a></h3>
<p>There is no official React wrapper, so you must manage the global singleton lifecycle manually inside <code>useEffect</code>, including cleanup to avoid issues with React strict mode. Auto-scheduling, critical path visualization, resource management, baselines, and split tasks are locked behind the Pro upgrade and are not available in the Standard edition.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt">Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#syncfusion-gantt" class="hash-link" aria-label="Direct link to Syncfusion Gantt" title="Direct link to Syncfusion Gantt" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/react-ui-components/react-gantt-chart" target="_blank" rel="noopener noreferrer" class="">Syncfusion Gantt</a> is a full-featured Gantt component with a native React package, <code>@syncfusion/ej2-react-gantt</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-gantt">Getting started with Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#getting-started-with-syncfusion-gantt" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Gantt" title="Direct link to Getting started with Syncfusion Gantt" translate="no">​</a></h3>
<p>Install the React package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-react-gantt@33.2.4</span><br></div></code></pre></div></div>
<p>The Syncfusion component system is modular, so the Gantt's CSS depends on several sibling packages. All of the following imports are required. Omitting any one of them results in missing styles for buttons, dropdowns, popups, or the grid panel:</p>
<div class="language-jsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-jsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> registerLicense </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">GanttComponent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Inject</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Edit</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Selection</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Toolbar</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-richtexteditor/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-treegrid/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-grids/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-gantt/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p><code>registerLicense()</code> must be called before any Syncfusion component mounts. Placing it at the top of your entry file is the safest approach. The <code>taskFields</code> mapping connects your data model to the Gantt's internal field names:</p>
<div class="language-jsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-jsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key-here'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> taskFields </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskID'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'StartDate'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">duration</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">progress</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Progress'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">dependency</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Predecessor'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">child</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'subtasks'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">subtasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Predecessor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">GanttComponent</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dataSource</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">data</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">taskFields</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">taskFields</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">100%</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Inject</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">services</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Edit</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Selection</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Toolbar</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">GanttComponent</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Syncfusion Gantt" src="https://www.react-gantt.com/assets/images/syncfusion-gantt-77a9b1156ed39130b3014fcc7a7d47a8.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-features">Syncfusion Gantt features<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#syncfusion-gantt-features" class="hash-link" aria-label="Direct link to Syncfusion Gantt features" title="Direct link to Syncfusion Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Auto-scheduling</li>
<li class="">Critical path visualization</li>
<li class="">Baselines and split tasks</li>
<li class="">Resource management</li>
<li class="">Undo/redo</li>
<li class="">Client-side export to PDF, Excel, and CSV</li>
<li class="">React, Angular, Vue, and Blazor wrappers</li>
<li class="">TypeScript support</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-pricing">Syncfusion Gantt pricing<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#syncfusion-gantt-pricing" class="hash-link" aria-label="Direct link to Syncfusion Gantt pricing" title="Direct link to Syncfusion Gantt pricing" translate="no">​</a></h3>
<p>Syncfusion offers a Community License at no cost for teams with under $1M in annual revenue, five or fewer developers, and ten or fewer employees. Commercial pricing is not published and requires a quote from Syncfusion sales.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-gantt">Pros of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#pros-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Pros of Syncfusion Gantt" title="Direct link to Pros of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Community License covers all features at no cost for qualifying teams</li>
<li class="">Native React component via <code>@syncfusion/ej2-react-gantt</code></li>
<li class="">Comprehensive feature set including auto-scheduling, critical path, and export</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-gantt">Cons of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#cons-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Cons of Syncfusion Gantt" title="Direct link to Cons of Syncfusion Gantt" translate="no">​</a></h3>
<p>CSS setup requires importing stylesheets for all dependency packages, which adds boilerplate compared to single-file approaches. The available MCP servers are stdio-based only and require API key configuration. Commercial pricing is not published, so teams that exceed the Community License thresholds cannot evaluate cost without contacting sales.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt">DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#daypilot-gantt" class="hash-link" aria-label="Direct link to DayPilot Gantt" title="Direct link to DayPilot Gantt" translate="no">​</a></h2>
<p><a href="https://doc.daypilot.org/gantt/" target="_blank" rel="noopener noreferrer" class="">DayPilot Pro for JavaScript</a> includes a Gantt chart component with a React package. The library is aimed at calendar and scheduling use cases, and the Gantt is one component within a broader scheduling suite.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-gantt">Getting started with DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#getting-started-with-daypilot-gantt" class="hash-link" aria-label="Direct link to Getting started with DayPilot Gantt" title="Direct link to Getting started with DayPilot Gantt" translate="no">​</a></h3>
<p>The <code>daypilot-pro-react</code> package requires a DayPilot Pro license and access to their npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-react</span><br></div></code></pre></div></div>
<p>Configuration is passed as props, and task and link data are provided inline in the config object. Event listeners such as <code>onTaskMove</code> and <code>onTaskResize</code> allow you to respond to user interactions and persist changes to your backend:</p>
<div class="language-jsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-jsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilotGantt</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">days</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">tasks</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">completion</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">start</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">end</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-20'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token literal-property property">completion</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">links</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">to</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">DayPilotGantt</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">config</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-features">DayPilot Gantt features<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#daypilot-gantt-features" class="hash-link" aria-label="Direct link to DayPilot Gantt features" title="Direct link to DayPilot Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Dependency links</li>
<li class="">Drag-and-drop task editing</li>
<li class="">Task resizing</li>
<li class="">Task completion bars</li>
<li class="">Row creation</li>
<li class="">Event listeners for move and resize (<code>onTaskMove</code>, <code>onTaskResize</code>)</li>
<li class="">UI Builder configurator for visual configuration</li>
<li class="">60-day free trial</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-pricing">DayPilot Gantt pricing<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#daypilot-gantt-pricing" class="hash-link" aria-label="Direct link to DayPilot Gantt pricing" title="Direct link to DayPilot Gantt pricing" translate="no">​</a></h3>
<p>DayPilot Pro starts at $649 per developer for a perpetual license. Maintenance periods of six or 12 months are available. Internal and SaaS applications are priced separately.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-gantt">Pros of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#pros-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Pros of DayPilot Gantt" title="Direct link to Pros of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">UI Builder configurator lets you visually configure the component and copy the generated code</li>
<li class="">Native React component</li>
<li class="">60-day free trial</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-gantt">Cons of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#cons-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Cons of DayPilot Gantt" title="Direct link to Cons of DayPilot Gantt" translate="no">​</a></h3>
<p>DayPilot Gantt is less feature-rich than Bryntum or Syncfusion, with no auto-scheduling engine and no resource management panel in the Gantt component. The community and ecosystem around the library are smaller than those of the other options in this list.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="gantt-task-react">gantt-task-react<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#gantt-task-react" class="hash-link" aria-label="Direct link to gantt-task-react" title="Direct link to gantt-task-react" translate="no">​</a></h2>
<p><code>gantt-task-react</code> is a free, MIT-licensed React Gantt library for rendering project timelines. It covers common visualization needs without requiring a license or any authentication.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-gantt-task-react">Getting started with gantt-task-react<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#getting-started-with-gantt-task-react" class="hash-link" aria-label="Direct link to Getting started with gantt-task-react" title="Direct link to Getting started with gantt-task-react" translate="no">​</a></h3>
<p>Install from the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> gantt-task-react</span><br></div></code></pre></div></div>
<p>Data is passed as a typed <code>Task</code> array, and the <code>viewMode</code> prop controls the time scale. The <code>onDateChange</code> and <code>onProgressChange</code> callbacks give you hooks to persist user edits:</p>
<div class="language-jsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-jsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Gantt</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Task</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewMode</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'gantt-task-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'gantt-task-react/dist/index.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token literal-property property">tasks</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">start</span><span class="token plain">        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">end</span><span class="token plain">          </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">name</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">id</span><span class="token plain">           </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">type</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'project'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">progress</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">45</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">isDisabled</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">hideChildren</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">start</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">end</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">name</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">id</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">type</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">project</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-1'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">tasks</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">tasks</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">viewMode</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">ViewMode</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token tag script language-javascript property-access maybe-class-name" style="color:rgb(78, 201, 176)">Week</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">onDateChange</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript parameter" style="color:rgb(78, 201, 176)">task</span><span class="token tag script language-javascript parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript parameter" style="color:rgb(78, 201, 176)"> children</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript console class-name" style="color:rgb(78, 201, 176)">console</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token tag script language-javascript method function property-access" style="color:rgb(220, 220, 170)">log</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">task</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> children</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">onProgressChange</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript parameter" style="color:rgb(78, 201, 176)">task</span><span class="token tag script language-javascript parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript parameter" style="color:rgb(78, 201, 176)"> progress</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript console class-name" style="color:rgb(78, 201, 176)">console</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token tag script language-javascript method function property-access" style="color:rgb(220, 220, 170)">log</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">task</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> progress</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="gantt-task-react-features">gantt-task-react features<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#gantt-task-react-features" class="hash-link" aria-label="Direct link to gantt-task-react features" title="Direct link to gantt-task-react features" translate="no">​</a></h3>
<ul>
<li class="">Task grouping and progress bars</li>
<li class="">Drag to resize and drag to move</li>
<li class="">Dependency arrows</li>
<li class="">Multiple view modes: hour, quarter day, half day, day, week, and month</li>
<li class="">TypeScript types included</li>
<li class="">MIT license</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="gantt-task-react-pricing">gantt-task-react pricing<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#gantt-task-react-pricing" class="hash-link" aria-label="Direct link to gantt-task-react pricing" title="Direct link to gantt-task-react pricing" translate="no">​</a></h3>
<p>Free under the MIT license. No trial period or registration required.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-gantt-task-react">Pros of gantt-task-react<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#pros-of-gantt-task-react" class="hash-link" aria-label="Direct link to Pros of gantt-task-react" title="Direct link to Pros of gantt-task-react" translate="no">​</a></h3>
<ul>
<li class="">Free and open source with no license required</li>
<li class="">Zero setup friction: install and render</li>
<li class="">TypeScript types bundled in the package</li>
<li class="">Good fit for simple project timelines and read-mostly dashboards</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-gantt-task-react">Cons of gantt-task-react<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#cons-of-gantt-task-react" class="hash-link" aria-label="Direct link to Cons of gantt-task-react" title="Direct link to Cons of gantt-task-react" translate="no">​</a></h3>
<p>There is no scheduling engine, no critical path analysis, no resource management, and no export functionality. Theming options are limited. This library is not suitable for enterprise project management tools that require scheduling logic or multi-resource coordination.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="feature-comparison">Feature comparison<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#feature-comparison" class="hash-link" aria-label="Direct link to Feature comparison" title="Direct link to Feature comparison" translate="no">​</a></h2>
<p>The table below summarizes the main differences between the React Gantt libraries.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:center">Bryntum Gantt</th><th style="text-align:center">DHTMLX Gantt</th><th style="text-align:center">Syncfusion Gantt</th><th style="text-align:center">DayPilot Gantt</th><th style="text-align:center">gantt-task-react</th></tr></thead><tbody><tr><td style="text-align:left">Auto-scheduling</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Critical path</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Resource management</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Baselines</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Split tasks</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Export (client-side)</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">React wrapper</td><td style="text-align:center">Yes</td><td style="text-align:center">No (manual)</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes (native)</td></tr><tr><td style="text-align:left">TypeScript</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td></tr><tr><td style="text-align:left">Open-source / free tier</td><td style="text-align:center">No</td><td style="text-align:center">GPL Standard</td><td style="text-align:center">Community License</td><td style="text-align:center">No</td><td style="text-align:center">MIT</td></tr><tr><td style="text-align:left">MCP server</td><td style="text-align:center">Yes (HTTP)</td><td style="text-align:center">Yes (HTTP)</td><td style="text-align:center">Stdio only</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr></tbody></table></div>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="use-case-recommendations">Use-case recommendations<a href="https://www.react-gantt.com/content/best-react-gantt-chart-libraries/#use-case-recommendations" class="hash-link" aria-label="Direct link to Use-case recommendations" title="Direct link to Use-case recommendations" translate="no">​</a></h2>
<p>The table below maps common React Gantt requirements to the best-fit library.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Use case</th><th style="text-align:left">Best choice</th></tr></thead><tbody><tr><td style="text-align:left">Enterprise project management with a scheduling engine</td><td style="text-align:left">Bryntum Gantt</td></tr><tr><td style="text-align:left">Full-featured Gantt with a free Community License</td><td style="text-align:left">Syncfusion Gantt</td></tr><tr><td style="text-align:left">Open-source or GPL project</td><td style="text-align:left">DHTMLX Gantt Standard</td></tr><tr><td style="text-align:left">Simple project timeline at zero cost</td><td style="text-align:left">gantt-task-react</td></tr></tbody></table></div>
<p>For teams building enterprise project management applications, Bryntum Gantt is the best fit in this list. The ChronoGraph scheduling engine, client-side export, comprehensive React wrapper, and HTTP MCP server for AI-assisted development combine into a single base license with no feature gating. The per-developer cost is higher than some alternatives, but the breadth of what ships in the standard package supports the premium for production applications.</p>
<p>Teams that qualify for Syncfusion's Community License (under $1M revenue, five or fewer developers, ten or fewer employees) get access to the full Syncfusion feature set at no cost. This makes Syncfusion a compelling choice for small teams with comprehensive feature requirements who fall within the eligibility criteria.</p>
<p>DHTMLX Gantt Standard is the natural choice for open-source projects, since the GPL license costs nothing and the published pricing tiers make commercial upgrade paths predictable. For the simplest case, a read-mostly project timeline in a React app that does not require scheduling logic or resource management, <code>gantt-task-react</code> removes all licensing friction and gets a chart on screen with minimal configuration.</p>]]></content:encoded>
            <category>gantt</category>
        </item>
        <item>
            <title><![CDATA[Best React Gantt chart components for project management]]></title>
            <link>https://www.react-gantt.com/content/best-react-project-management-gantt-components/</link>
            <guid>https://www.react-gantt.com/content/best-react-project-management-gantt-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Building a project management UI requires more than rendering a timeline.]]></description>
            <content:encoded><![CDATA[<p>Building a project management UI requires more than rendering a timeline. Teams need work breakdown structure (WBS), baselines, critical path analysis, resource management, and dependency types beyond simple finish-to-start links. This comparison covers five React Gantt options against those criteria: <a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a>, <a href="https://dhtmlx.com/docs/products/dhtmlxGantt/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Gantt</a>, <a href="https://www.syncfusion.com/react-ui-components/react-gantt-chart" target="_blank" rel="noopener noreferrer" class="">Syncfusion Gantt</a>, <a href="https://doc.daypilot.org/gantt/" target="_blank" rel="noopener noreferrer" class="">DayPilot Gantt</a>, and <a href="https://github.com/MaTeMaTuK/gantt-task-react" target="_blank" rel="noopener noreferrer" class="">gantt-task-react</a>.</p>
<p>The project management scope in this article means an auto-scheduling engine, all four dependency types, milestones, baselines, critical path highlighting, and resource management. Some libraries ship the full scheduling engine in the base product, others gate advanced features behind a higher license tier, and one is MIT-licensed but covers only basic visualization. For a wider comparison that covers libraries without those constraints, see our guide to the <a href="https://bryntum.com/blog/best-react-gantt-chart-libraries/" target="_blank" rel="noopener noreferrer" class="">best React Gantt chart libraries</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt">Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#bryntum-gantt" class="hash-link" aria-label="Direct link to Bryntum Gantt" title="Direct link to Bryntum Gantt" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a> is a commercial Gantt chart built on vanilla JavaScript with a dedicated React wrapper package. It is backed by the ChronoGraph reactive scheduling engine, which propagates date changes through dependency chains automatically. You can explore the full range of capabilities in the <a href="https://bryntum.com/products/gantt/examples/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt demos</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-gantt">Getting started with Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#getting-started-with-bryntum-gantt" class="hash-link" aria-label="Direct link to Getting started with Bryntum Gantt" title="Direct link to Getting started with Bryntum Gantt" translate="no">​</a></h3>
<p>Install the trial package from the public npm registry along with the React wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt@npm:@bryntum/gantt-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt-react@7.3.0</span><br></div></code></pre></div></div>
<p>CSS imports must appear in this specific order. The FontAwesome stylesheets must come first because the Gantt's toolbar icons depend on them. The core <code>gantt.css</code> file follows, and the theme file comes last so its variables override the defaults correctly:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/gantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>BryntumGantt</code> component spreads a config object as props. Pass all data through the <code>project</code> prop. Never mix the <code>project</code> prop with inline data props (<code>tasks</code>, <code>dependencies</code>, <code>resources</code>) directly on <code>BryntumGantt</code>, as using both simultaneously throws a runtime error:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumGantt</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// IMPORTANT: never mix project prop with inline data props (tasks, dependencies, resources). It throws at runtime.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">ganttConfig</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        columns </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'percentdone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        project </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          tasks </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Launch SaaS Product'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> expanded </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">35.7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  children </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Install Apache'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Configure firewall'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Run tests'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-21'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> percentDone </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          dependencies </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> fromTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> toTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> lag </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> fromTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> toTask </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">BryntumGantt</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">ganttConfig</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Bryntum ships 10 themes across five light/dark pairs: svalbard-light, svalbard-dark, stockholm-light, stockholm-dark, visby-light, visby-dark, material3-light, material3-dark, fluent2-light, and fluent2-dark. To switch themes, replace the theme CSS import.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-627cdc5a5d97c6a596d5b811f1dc7b71.png" width="2880" height="1562" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-features">Bryntum Gantt features<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#bryntum-gantt-features" class="hash-link" aria-label="Direct link to Bryntum Gantt features" title="Direct link to Bryntum Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Auto-scheduling with the ChronoGraph reactive engine: task dates recalculate when predecessors or constraints change</li>
<li class="">Critical path method (CPM) visualization</li>
<li class="">Baselines for comparing planned versus actual progress</li>
<li class="">All four dependency types: finish-to-start, start-to-start, finish-to-finish, and start-to-finish</li>
<li class="">Milestones with configurable rendering</li>
<li class="">Resource management and resource leveling</li>
<li class="">WBS with indent/outdent support</li>
<li class="">Client-side export to PDF, PNG, Excel, ICS, and MS Project XML with no server required</li>
<li class="">MS Project and Primavera P6 import via MPXJ</li>
<li class="">10 themes across five light/dark pairs</li>
<li class="">45 built-in locales</li>
<li class="">React, Angular, Vue, and plain JavaScript wrappers</li>
<li class="">HTTP MCP server at <a href="https://mcp.bryntum.com/" target="_blank" rel="noopener noreferrer" class="">mcp.bryntum.com</a> for AI-assisted development</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-pricing">Bryntum Gantt pricing<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#bryntum-gantt-pricing" class="hash-link" aria-label="Direct link to Bryntum Gantt pricing" title="Direct link to Bryntum Gantt pricing" translate="no">​</a></h3>
<p>Bryntum Gantt is sold on a per-developer basis, starting at $940 per developer. The license is perpetual and includes 12 months of updates. OEM and SaaS usage requires a separate quote. A free 45-day trial is available at <a href="https://bryntum.com/download/?product=gantt" target="_blank" rel="noopener noreferrer" class="">bryntum.com/download/?product=gantt</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-gantt">Pros of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#pros-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Pros of Bryntum Gantt" title="Direct link to Pros of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">Comprehensive scheduling engine (ChronoGraph) with automatic dependency propagation</li>
<li class="">All four dependency types and resource leveling included in the base license</li>
<li class="">Client-side export to PDF, Excel, and MS Project XML without a server-side component</li>
<li class="">All features included in the base license with no feature-gated tiers</li>
<li class="">10 themes covering both light and dark variants</li>
<li class="">HTTP MCP server for AI-assisted development</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-gantt">Cons of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#cons-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Cons of Bryntum Gantt" title="Direct link to Cons of Bryntum Gantt" translate="no">​</a></h3>
<p>There is no free tier beyond the 45-day trial. The per-developer entry cost is higher than some alternatives, which may be a consideration for small teams or individual developers evaluating options.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt">DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#dhtmlx-gantt" class="hash-link" aria-label="Direct link to DHTMLX Gantt" title="Direct link to DHTMLX Gantt" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxGantt/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Gantt</a> is a JavaScript Gantt library with no official React wrapper. In a React project, you initialize it imperatively inside a <code>useEffect</code> hook using a container ref. Advanced project management features, including critical path, baselines, and resource management, require the Pro license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-gantt">Getting started with DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#getting-started-with-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Gantt" title="Direct link to Getting started with DHTMLX Gantt" translate="no">​</a></h3>
<p>Install the package from the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-gantt</span><br></div></code></pre></div></div>
<p>DHTMLX Gantt is a global singleton. Initialization requires a specific sequence: <code>gantt.init()</code> must be called before <code>gantt.parse()</code>. Reversing this order leaves the chart without a DOM target and produces a silent failure. The <code>clearAll()</code> call in the cleanup function prevents data from persisting across React strict-mode remounts:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useEffect</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> useRef </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt/codebase/dhtmlxgantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">gantt</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">DHtmlxGanttComponent</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> containerRef </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:rgb(220, 220, 170)">useRef</span><span class="token generic-function generic class-name operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token generic-function generic class-name" style="color:rgb(78, 201, 176)">HTMLDivElement</span><span class="token generic-function generic class-name operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">useEffect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">date_format</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">work_time</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">containerRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">current</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            data  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> open </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> parent </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> duration </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> parent </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            links </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> source </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> target </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> type </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'0'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">clearAll</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">containerRef</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> width </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100%'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> height </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100vh'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The global singleton pattern also means that rendering multiple DHTMLX Gantt instances on the same page requires the Commercial license or higher.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Gantt" src="https://www.react-gantt.com/assets/images/dhtmlx-gantt-ff658910fe3ae8368cfabb8d895d8c43.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-features">DHTMLX Gantt features<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#dhtmlx-gantt-features" class="hash-link" aria-label="Direct link to DHTMLX Gantt features" title="Direct link to DHTMLX Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Drag-and-drop task editing</li>
<li class="">Dependency links</li>
<li class="">Zoom levels</li>
<li class="">Task trees and subtasks</li>
<li class="">Auto-scheduling, critical path, baselines, resource management, and all four dependency types (Pro license required)</li>
<li class="">Client-side export available as a separate add-on ($350)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-pricing">DHTMLX Gantt pricing<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#dhtmlx-gantt-pricing" class="hash-link" aria-label="Direct link to DHTMLX Gantt pricing" title="Direct link to DHTMLX Gantt pricing" translate="no">​</a></h3>
<p>DHTMLX Gantt Standard is available under the GPL license at no cost for open-source projects. Commercial licenses are perpetual: Individual at $699, Commercial at $1,399, Enterprise at $2,999, and Ultimate at $5,999.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-gantt">Pros of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#pros-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Pros of DHTMLX Gantt" title="Direct link to Pros of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard edition is free for open-source projects</li>
<li class="">Published, tiered pricing makes upgrade costs predictable</li>
<li class="">Available on the public npm registry</li>
<li class="">HTTP MCP server available for AI-assisted development</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-gantt">Cons of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#cons-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Cons of DHTMLX Gantt" title="Direct link to Cons of DHTMLX Gantt" translate="no">​</a></h3>
<p>There is no official React wrapper, so you must manage the global singleton lifecycle manually inside <code>useEffect</code>, including cleanup to avoid issues with React strict mode. Critical path, baselines, resource management, and all four dependency types are locked behind the Pro upgrade and are not available in the Standard edition. Client-side export requires purchasing a separate add-on.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt">Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#syncfusion-gantt" class="hash-link" aria-label="Direct link to Syncfusion Gantt" title="Direct link to Syncfusion Gantt" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/react-ui-components/react-gantt-chart" target="_blank" rel="noopener noreferrer" class="">Syncfusion Gantt</a> is a full-featured Gantt component with a native React package, <code>@syncfusion/ej2-react-gantt</code>. It includes critical path, baselines, resource management, and all four dependency types in a single package.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-gantt">Getting started with Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#getting-started-with-syncfusion-gantt" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Gantt" title="Direct link to Getting started with Syncfusion Gantt" translate="no">​</a></h3>
<p>Install the React package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-react-gantt</span><br></div></code></pre></div></div>
<p>The Syncfusion component system is modular, so the Gantt's CSS depends on several sibling packages. All nine of the following imports are required. Omitting any one of them results in missing styles for buttons, dropdowns, popups, or the grid panel:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-grids/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-layouts/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-gantt/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p><code>registerLicense()</code> must be called before any Syncfusion component mounts. Placing it at the top of your entry file is the safest approach. The <code>taskFields</code> mapping connects your data model to the Gantt's internal field names:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> registerLicense </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">GanttComponent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Inject</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Edit</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Toolbar</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">CriticalPath</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">UndoRedo</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ExcelExport</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">PdfExport</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> tasks </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token maybe-class-name">TaskID</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token maybe-class-name">TaskName</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token maybe-class-name">StartDate</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token maybe-class-name">Duration</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        subtasks     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">GanttComponent</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dataSource</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">tasks</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">taskFields</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> id </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'TaskID'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> name </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> startDate </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'StartDate'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> duration </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> progress </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'Progress'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> child </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'subtasks'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">enableCriticalPath</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Inject</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">services</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Edit</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">Toolbar</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">CriticalPath</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">UndoRedo</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">ExcelExport</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">PdfExport</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">GanttComponent</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Syncfusion Gantt" src="https://www.react-gantt.com/assets/images/syncfusion-gantt-77a9b1156ed39130b3014fcc7a7d47a8.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-features">Syncfusion Gantt features<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#syncfusion-gantt-features" class="hash-link" aria-label="Direct link to Syncfusion Gantt features" title="Direct link to Syncfusion Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Auto-scheduling engine</li>
<li class="">Critical path visualization</li>
<li class="">Baselines for planned versus actual comparison</li>
<li class="">All four dependency types: finish-to-start, start-to-start, finish-to-finish, and start-to-finish</li>
<li class="">Resource management</li>
<li class="">Virtual rendering for large datasets</li>
<li class="">Client-side export to PDF and Excel</li>
<li class="">Undo/redo</li>
<li class="">React, Angular, Vue, and Blazor wrappers</li>
<li class="">TypeScript support</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-pricing">Syncfusion Gantt pricing<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#syncfusion-gantt-pricing" class="hash-link" aria-label="Direct link to Syncfusion Gantt pricing" title="Direct link to Syncfusion Gantt pricing" translate="no">​</a></h3>
<p>Syncfusion offers a Community License at no cost for teams with under $1M in annual revenue and five or fewer developers. Commercial pricing is not published and requires a quote from Syncfusion sales.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-gantt">Pros of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#pros-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Pros of Syncfusion Gantt" title="Direct link to Pros of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Community License covers all features at no cost for qualifying teams</li>
<li class="">Native React component via <code>@syncfusion/ej2-react-gantt</code></li>
<li class="">Comprehensive project management feature set including auto-scheduling, critical path, baselines, and all four dependency types</li>
<li class="">Virtual rendering supports large datasets without a performance penalty</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-gantt">Cons of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#cons-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Cons of Syncfusion Gantt" title="Direct link to Cons of Syncfusion Gantt" translate="no">​</a></h3>
<p>CSS setup requires importing stylesheets for all dependency packages, which adds boilerplate compared to single-file approaches. Commercial pricing is not published, so teams that exceed the Community License thresholds cannot evaluate cost without contacting sales.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt">DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#daypilot-gantt" class="hash-link" aria-label="Direct link to DayPilot Gantt" title="Direct link to DayPilot Gantt" translate="no">​</a></h2>
<p><a href="https://doc.daypilot.org/gantt/" target="_blank" rel="noopener noreferrer" class="">DayPilot Pro for JavaScript</a> includes a Gantt chart component with a React package. The library is primarily aimed at calendar and scheduling use cases, and the Gantt is one component within a broader scheduling suite.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-gantt">Getting started with DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#getting-started-with-daypilot-gantt" class="hash-link" aria-label="Direct link to Getting started with DayPilot Gantt" title="Direct link to Getting started with DayPilot Gantt" translate="no">​</a></h3>
<p>The <code>daypilot-pro-react</code> package requires a DayPilot Pro license. Use <code>@daypilot/daypilot-lite-react</code> for evaluation:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-react</span><br></div></code></pre></div></div>
<p>Configuration is passed as props, and task data is provided inline in the config object:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilotGantt</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        days       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        tasks      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                id        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                text      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                start     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                end       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-06'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                completed </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                id        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                text      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                start     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                end       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-15'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                completed </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">DayPilotGantt</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">config</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-features">DayPilot Gantt features<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#daypilot-gantt-features" class="hash-link" aria-label="Direct link to DayPilot Gantt features" title="Direct link to DayPilot Gantt features" translate="no">​</a></h3>
<ul>
<li class="">Task editing and drag-and-drop</li>
<li class="">Milestone markers</li>
<li class="">Basic dependency links</li>
<li class="">Task completion bars</li>
<li class="">UI Builder configurator for visual configuration</li>
<li class="">60-day free trial</li>
</ul>
<p>DayPilot Gantt does not include a built-in scheduling engine, so task dates are not computed automatically based on dependencies or constraints.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-pricing">DayPilot Gantt pricing<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#daypilot-gantt-pricing" class="hash-link" aria-label="Direct link to DayPilot Gantt pricing" title="Direct link to DayPilot Gantt pricing" translate="no">​</a></h3>
<p>DayPilot Pro starts at $899 per developer for a perpetual license. A free tier (DayPilot Lite) is available with limited features.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-gantt">Pros of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#pros-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Pros of DayPilot Gantt" title="Direct link to Pros of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">UI Builder configurator lets you visually configure the component and copy the generated code</li>
<li class="">Native React component</li>
<li class="">Free tier and 60-day trial available</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-gantt">Cons of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#cons-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Cons of DayPilot Gantt" title="Direct link to Cons of DayPilot Gantt" translate="no">​</a></h3>
<p>DayPilot Gantt lacks a scheduling engine, critical path analysis, baselines, and resource management. It supports only basic finish-to-start dependencies and does not compute task dates automatically. Teams building a full project management tool will find its feature set insufficient for scheduling-heavy workloads.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="gantt-task-react">gantt-task-react<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#gantt-task-react" class="hash-link" aria-label="Direct link to gantt-task-react" title="Direct link to gantt-task-react" translate="no">​</a></h2>
<p><code>gantt-task-react</code> is a free, MIT-licensed React Gantt library for rendering project timelines. It covers common visualization needs without requiring a license or any authentication.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-gantt-task-react">Getting started with gantt-task-react<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#getting-started-with-gantt-task-react" class="hash-link" aria-label="Direct link to Getting started with gantt-task-react" title="Direct link to Getting started with gantt-task-react" translate="no">​</a></h3>
<p>Install from the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> gantt-task-react</span><br></div></code></pre></div></div>
<p>Data is passed as a typed <code>Task</code> array, and the <code>viewMode</code> prop controls the time scale:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Gantt</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Task</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewMode</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'gantt-task-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'gantt-task-react/dist/index.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> tasks</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        start        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        end          </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">6</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        name         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        id           </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        type         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        progress     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        isDisabled   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        styles       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> progressColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'#ffbb54'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        start      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        end        </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        name       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        id         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task-2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        type       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'task'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        progress   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        dependencies </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'task-1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">tasks</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">tasks</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">viewMode</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">ViewMode</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token tag script language-javascript property-access maybe-class-name" style="color:rgb(78, 201, 176)">Week</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="gantt-task-react-features">gantt-task-react features<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#gantt-task-react-features" class="hash-link" aria-label="Direct link to gantt-task-react features" title="Direct link to gantt-task-react features" translate="no">​</a></h3>
<ul>
<li class="">Task grouping and progress bars</li>
<li class="">Drag to resize and drag to move</li>
<li class="">Finish-to-start dependency arrows</li>
<li class="">Multiple view modes: hour, quarter day, half day, day, week, and month</li>
<li class="">Click and double-click callbacks</li>
<li class="">TypeScript types included</li>
<li class="">MIT license</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="gantt-task-react-pricing">gantt-task-react pricing<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#gantt-task-react-pricing" class="hash-link" aria-label="Direct link to gantt-task-react pricing" title="Direct link to gantt-task-react pricing" translate="no">​</a></h3>
<p>Free under the MIT license. No trial period or registration required.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-gantt-task-react">Pros of gantt-task-react<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#pros-of-gantt-task-react" class="hash-link" aria-label="Direct link to Pros of gantt-task-react" title="Direct link to Pros of gantt-task-react" translate="no">​</a></h3>
<ul>
<li class="">Free and open source with no license required</li>
<li class="">Zero setup friction: install and render</li>
<li class="">TypeScript types bundled in the package</li>
<li class="">Good fit for lightweight task visualization and read-mostly dashboards</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-gantt-task-react">Cons of gantt-task-react<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#cons-of-gantt-task-react" class="hash-link" aria-label="Direct link to Cons of gantt-task-react" title="Direct link to Cons of gantt-task-react" translate="no">​</a></h3>
<p>There is no scheduling engine, no critical path analysis, no baselines, no resource management, and no client-side export. Only finish-to-start dependencies are supported. This library is not suitable for project management tools that require scheduling logic, multi-resource coordination, or WBS editing.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="feature-comparison">Feature comparison<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#feature-comparison" class="hash-link" aria-label="Direct link to Feature comparison" title="Direct link to Feature comparison" translate="no">​</a></h2>
<p>The table below summarizes the project management features in each React Gantt component.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:center">Bryntum Gantt</th><th style="text-align:center">DHTMLX Gantt</th><th style="text-align:center">Syncfusion Gantt</th><th style="text-align:center">DayPilot Gantt</th><th style="text-align:center">gantt-task-react</th></tr></thead><tbody><tr><td style="text-align:left">Auto-scheduling engine</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Critical path</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Baselines</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">4 dependency types (FS/SS/FF/SF)</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No (FS only)</td></tr><tr><td style="text-align:left">Milestones</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td></tr><tr><td style="text-align:left">Resource management</td><td style="text-align:center">Yes</td><td style="text-align:center">Pro only</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">WBS / indent-outdent</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Client-side export</td><td style="text-align:center">Yes</td><td style="text-align:center">Add-on ($350)</td><td style="text-align:center">Yes</td><td style="text-align:center">No</td><td style="text-align:center">No</td></tr><tr><td style="text-align:left">Free tier</td><td style="text-align:center">No</td><td style="text-align:center">GPL Standard</td><td style="text-align:center">Community License</td><td style="text-align:center">Lite (limited)</td><td style="text-align:center">MIT</td></tr><tr><td style="text-align:left">React wrapper</td><td style="text-align:center">Yes</td><td style="text-align:center">No (manual)</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes</td><td style="text-align:center">Yes (native)</td></tr></tbody></table></div>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="use-case-recommendations">Use-case recommendations<a href="https://www.react-gantt.com/content/best-react-project-management-gantt-components/#use-case-recommendations" class="hash-link" aria-label="Direct link to Use-case recommendations" title="Direct link to Use-case recommendations" translate="no">​</a></h2>
<p>The table below maps common project management requirements to the best-fit React Gantt component.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Requirement</th><th style="text-align:left">Best choice</th></tr></thead><tbody><tr><td style="text-align:left">Full project management with scheduling engine and all PM features</td><td style="text-align:left">Bryntum Gantt</td></tr><tr><td style="text-align:left">Full PM features with a free tier for qualifying small teams</td><td style="text-align:left">Syncfusion Gantt</td></tr><tr><td style="text-align:left">Open-source project needing a Gantt chart</td><td style="text-align:left">DHTMLX Gantt Standard</td></tr><tr><td style="text-align:left">Lightweight task visualization with no license overhead</td><td style="text-align:left">gantt-task-react</td></tr></tbody></table></div>
<p>For teams building enterprise project management applications, Bryntum Gantt is the best fit in this list. The ChronoGraph scheduling engine, all four dependency types, resource leveling, baselines, critical path, client-side export, and the HTTP MCP server for AI-assisted development are all included in a single base license with no feature gating. The per-developer cost is higher than some alternatives, but the breadth of what ships in the standard package supports the premium for production applications.</p>
<p>Teams that qualify for Syncfusion's Community License (under $1M revenue, five or fewer developers) get access to the full Syncfusion feature set at no cost. This makes Syncfusion a compelling option for small teams with comprehensive project management requirements who fall within the eligibility criteria.</p>
<p>For the simplest case, a read-only project timeline in a React app that does not require a scheduling engine or resource management, <code>gantt-task-react</code> removes all licensing friction and gets a chart on screen with minimal configuration. Neither DayPilot Gantt nor <code>gantt-task-react</code> is suitable for project management tools that require auto-scheduling, and DHTMLX Gantt restricts all scheduling features to its paid Pro tier.</p>]]></content:encoded>
            <category>gantt</category>
        </item>
        <item>
            <title><![CDATA[Best React resource scheduler components]]></title>
            <link>https://www.react-gantt.com/content/best-react-resource-scheduler-components/</link>
            <guid>https://www.react-gantt.com/content/best-react-resource-scheduler-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When a scheduling problem involves multiple people, machines, or rooms across a shared timeline, a resource scheduler gives users a resource first view of.]]></description>
            <content:encoded><![CDATA[<p>When a scheduling problem involves multiple people, machines, or rooms across a shared timeline, a resource scheduler gives users a resource-first view of availability and capacity. Resource schedulers differ from general calendar or Gantt components in one key way: the Y-axis is a list of resources, and the time axis runs horizontally.</p>
<p>This comparison focuses on the resource management capabilities of five React libraries: <a href="https://bryntum.com/products/scheduler/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler</a>, <a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Scheduler</a>, <a href="https://www.syncfusion.com/react-ui-components/react-scheduler" target="_blank" rel="noopener noreferrer" class="">Syncfusion Schedule</a>, <a href="https://javascript.daypilot.org/scheduler/" target="_blank" rel="noopener noreferrer" class="">DayPilot Scheduler</a>, and <a href="https://mobiscroll.com/event-calendar-scheduler" target="_blank" rel="noopener noreferrer" class="">Mobiscroll Event Calendar</a>. The criteria are multi-resource assignment, hierarchical resource groups, resource utilization views, resource-specific APIs, installation, pricing, and React integration.</p>
<p>Vendor naming is inconsistent. Syncfusion calls its timeline component Scheduler or Schedule, and Mobiscroll markets its equivalent as Event Calendar with a timeline view. For a broader comparison that covers all view types and general scheduling features, see our guide to the <a href="https://bryntum.com/blog/best-react-scheduler-components" target="_blank" rel="noopener noreferrer" class="">best React scheduler components</a> and our roundup of the <a href="https://bryntum.com/blog/best-javascript-resource-scheduler-components" target="_blank" rel="noopener noreferrer" class="">best JavaScript resource scheduler components</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler">Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#bryntum-scheduler" class="hash-link" aria-label="Direct link to Bryntum Scheduler" title="Direct link to Bryntum Scheduler" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/scheduler/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler</a> is a commercial resource scheduler built on vanilla JavaScript with a dedicated React wrapper package. It is part of the broader <a href="https://bryntum.com/" target="_blank" rel="noopener noreferrer" class="">Bryntum</a> suite of scheduling and project management components. Resource management is a first-class concern in the API: multi-resource assignment, hierarchical resource groups, and a dedicated <code>ResourceUtilization</code> histogram widget are all built into the core product. You can explore the full range of resource management capabilities in the <a href="https://bryntum.com/products/scheduler/examples/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler demos</a>.</p>
<p>Bryntum also offers <a href="https://bryntum.com/products/schedulerpro/" target="_blank" rel="noopener noreferrer" class="">Scheduler Pro</a>, which extends the base scheduler with a reactive scheduling engine, travel time, and task constraints.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-scheduler">Getting started with Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#getting-started-with-bryntum-scheduler" class="hash-link" aria-label="Direct link to Getting started with Bryntum Scheduler" title="Direct link to Getting started with Bryntum Scheduler" translate="no">​</a></h3>
<p>Install the trial package from the public npm registry along with the React wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler@npm:@bryntum/scheduler-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler-react@7.3.0</span><br></div></code></pre></div></div>
<p>CSS imports must appear in this specific order. The FontAwesome stylesheets must come first because the toolbar icons depend on them. The core <code>scheduler.css</code> file follows, and the theme file comes last so its variables override the defaults correctly:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/scheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The example below demonstrates two resource management features simultaneously: hierarchical resource groups and multi-resource assignment. Resources with a <code>parentId</code> are nested under their parent row. Setting <code>resourceId</code> to an array on an event causes that event bar to appear on every assigned resource's row:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumScheduler</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        endDate    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-26'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        viewPreset </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hourAndDay'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        columns    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Team member'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> field </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">160</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Celia'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sales'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Fancy law firm'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'teal'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Small boutique'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Grocery store'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lime'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Busy'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">              startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'red'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">           startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'clients office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">             startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Suggested meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-11'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grocery store'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">BryntumScheduler</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">config</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Parent rows collapse and expand with the <code>expanded</code> property. A user clicking the expand/collapse toggle on a group row hides or reveals all child resource rows without losing any event data. For server-backed data, configure a <code>CrudManager</code> in the config object to handle loading and syncing through a JSON protocol without manual fetch logic.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Scheduler" src="https://www.react-gantt.com/assets/images/bryntum-scheduler-cdea645a1b76ea741b10ad1742864273.png" width="2558" height="1188" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-resource-management-features">Bryntum Scheduler resource management features<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#bryntum-scheduler-resource-management-features" class="hash-link" aria-label="Direct link to Bryntum Scheduler resource management features" title="Direct link to Bryntum Scheduler resource management features" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment: set <code>resourceId</code> to an array and the event bar is rendered on each assigned resource row</li>
<li class="">Hierarchical resource groups with <code>parentId</code> nesting, expand/collapse support, and group-level event rendering</li>
<li class=""><code>ResourceUtilization</code> histogram widget that shows per-resource utilization as a bar chart overlay alongside the schedule</li>
<li class="">Resource filtering via the built-in filter feature or a custom <code>resourceStore</code> filter</li>
<li class="">Per-resource work calendars that define availability windows and non-working time, used for conflict detection and utilization calculation</li>
<li class="">18 built-in view presets for fine-grained time-axis control</li>
<li class="">MCP server for AI coding tools to access Bryntum documentation and API directly</li>
<li class="">Bryntum Scheduler Pro adds a reactive scheduling engine with resource leveling</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-pricing">Bryntum Scheduler pricing<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#bryntum-scheduler-pricing" class="hash-link" aria-label="Direct link to Bryntum Scheduler pricing" title="Direct link to Bryntum Scheduler pricing" translate="no">​</a></h3>
<p>Bryntum Scheduler is priced from $680 per developer for the small-team license, with a three-developer minimum and 12 months of updates. Scheduler Pro is priced separately. Check <a href="https://bryntum.com/store/scheduler/" target="_blank" rel="noopener noreferrer" class="">bryntum.com/store/scheduler</a> for current pricing. A trial version is available through npm as shown in the installation instructions above.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-scheduler">Pros of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#pros-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Pros of Bryntum Scheduler" title="Direct link to Pros of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment is natively supported in the data model: pass an array to <code>resourceId</code> and the library handles rendering, editing, and syncing without additional configuration.</li>
<li class="">The <code>ResourceUtilization</code> histogram widget provides a ready-made utilization view that works alongside the scheduler with no extra coding.</li>
<li class="">Per-resource work calendars enable accurate capacity calculations and conflict detection at the resource level.</li>
<li class="">The React wrapper is a first-class package maintained in lockstep with the core library, not a community adapter.</li>
<li class="">Virtual scrolling and a minimal DOM footprint make it suitable for large resource and event datasets.</li>
<li class="">The MCP server integration allows AI coding tools to query Bryntum's documentation and API directly during development.</li>
<li class="">Bryntum Scheduler Pro is a drop-in upgrade path when you need a scheduling engine or travel time features.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-scheduler">Cons of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#cons-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Cons of Bryntum Scheduler" title="Direct link to Cons of Bryntum Scheduler" translate="no">​</a></h3>
<p>Bryntum Scheduler has no free or open-source tier. The three-developer minimum can be difficult to justify for small teams building simple resource views. The configuration API is extensive, and the learning curve is steeper than lighter-weight alternatives. The ResourceUtilization widget is a separate component that must be laid out alongside the scheduler rather than toggled on as a view mode within it.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Scheduler</a> is a calendar and scheduling component that supports multiple views. The Timeline view places resources on the Y-axis and a time axis on the X-axis, which is the relevant view for resource scheduling. The Timeline view, along with most advanced views, requires the PRO edition.</p>
<p>DHTMLX Scheduler is a global singleton rather than a React component, so it must be initialized manually inside a React component using a container ref and a <code>useEffect</code> hook.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-scheduler">Getting started with DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#getting-started-with-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Scheduler" title="Direct link to Getting started with DHTMLX Scheduler" translate="no">​</a></h3>
<p>Install the package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>Because DHTMLX Scheduler is a global singleton, you call <code>scheduler.init()</code> to attach it to a DOM node and <code>scheduler.parse()</code> to load data. Both calls go inside a <code>useEffect</code> so they run after the component mounts. Clean up by calling <code>scheduler.destructor()</code> in the effect's return function.</p>
<p>Resources are registered as a named server list. Each event maps to exactly one resource through the <code>section_id</code> field. DHTMLX Scheduler does not support multi-resource assignment natively: an event belongs to a single section, so showing the same event on multiple resource rows requires duplicating event records:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useEffect</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> useRef </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">scheduler</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">DHtmlxScheduler</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> containerRef </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:rgb(220, 220, 170)">useRef</span><span class="token generic-function generic class-name operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token generic-function generic class-name" style="color:rgb(78, 201, 176)">HTMLDivElement</span><span class="token generic-function generic class-name operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">useEffect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">xml_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d %H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">createTimelineView</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            name       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_unit     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_date     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_step     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_size     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_start    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_length   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            y_unit     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            y_property </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'section_id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            render     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bar'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">containerRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">current</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'resources'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> key </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> key </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> key </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'3'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 10:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 11:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> section_id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   start_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 14:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 16:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> section_id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'3'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">destructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">containerRef</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> width </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100%'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> height </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100vh'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The Timeline view is configured by calling <code>scheduler.createTimelineView()</code> before <code>scheduler.init()</code>. Resources are registered with <code>scheduler.serverList()</code>, and events reference the resource key through the property named in <code>y_property</code>.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler" src="https://www.react-gantt.com/assets/images/dhtmlx-scheduler-8a45f0e64d65f3372e6310101f1f0116.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-resource-management-features">DHTMLX Scheduler resource management features<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#dhtmlx-scheduler-resource-management-features" class="hash-link" aria-label="Direct link to DHTMLX Scheduler resource management features" title="Direct link to DHTMLX Scheduler resource management features" translate="no">​</a></h3>
<ul>
<li class="">Timeline view places resources on the Y-axis (PRO edition)</li>
<li class="">Resource rows configurable as a named server list</li>
<li class="">Section-based resource assignment: one event per section</li>
<li class="">No native multi-resource assignment</li>
<li class="">No built-in resource utilization view</li>
<li class="">No hierarchical resource groups with expand/collapse</li>
<li class="">Server-side DataProcessor API for syncing changes to a backend</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing">DHTMLX Scheduler pricing<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#dhtmlx-scheduler-pricing" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing" title="Direct link to DHTMLX Scheduler pricing" translate="no">​</a></h3>
<p>The Standard edition is free for GPL-compatible open-source projects. The PRO edition, which includes the Timeline view, is priced at $599 to $3,999 perpetual depending on team size. A 30-day free trial of the PRO edition is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-scheduler">Pros of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#pros-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Pros of DHTMLX Scheduler" title="Direct link to Pros of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">A free Standard edition exists for open-source projects, making it accessible at zero cost for qualifying use cases.</li>
<li class="">The DataProcessor connectors reduce boilerplate required to sync scheduler changes to PHP, Java, and .NET backends.</li>
<li class="">The wide range of calendar views means the same library covers personal calendar and resource scheduling requirements from a single package.</li>
<li class="">Comprehensive <a href="https://docs.dhtmlx.com/scheduler/samples/" target="_blank" rel="noopener noreferrer" class="">samples</a> and <a href="https://dhtmlx.com/docs/products/demoApps/" target="_blank" rel="noopener noreferrer" class="">demos</a> include source code.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-scheduler">Cons of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#cons-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Cons of DHTMLX Scheduler" title="Direct link to Cons of DHTMLX Scheduler" translate="no">​</a></h3>
<p>DHTMLX Scheduler is not a React component. Integrating it requires a container ref and a <code>useEffect</code> setup, which works against React's declarative model and can cause issues in strict mode due to double-invocation of effects. Multi-resource assignment is not supported: the data model maps each event to exactly one <code>section_id</code>. There is no resource utilization view and no hierarchical resource grouping with expand/collapse. The Timeline view is locked behind the PRO edition. Documentation mixes old and new API references, and search does not reliably surface relevant results.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule">Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#syncfusion-schedule" class="hash-link" aria-label="Direct link to Syncfusion Schedule" title="Direct link to Syncfusion Schedule" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/" target="_blank" rel="noopener noreferrer" class="">Syncfusion</a> provides a suite of UI components for React, Angular, Vue, and Blazor. Their resource timeline component is called "Scheduler" or "Schedule" and is accessed through <code>ScheduleComponent</code> with <code>TimelineViews</code>. Multi-resource assignment is enabled with a single <code>allowMultiple</code> prop on the <code>ResourceDirective</code>, making it one of the more straightforward implementations of this feature across the libraries in this list.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-schedule">Getting started with Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#getting-started-with-syncfusion-schedule" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Schedule" title="Direct link to Getting started with Syncfusion Schedule" translate="no">​</a></h3>
<p>Install the React schedule package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-react-schedule</span><br></div></code></pre></div></div>
<p>Syncfusion uses a module injection pattern. You must import and inject every view or feature module you want to use. Several peer packages also require CSS imports. Import them in this order before any component CSS:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-schedule/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The example below demonstrates multi-resource assignment using <code>allowMultiple={true}</code>. Setting this prop on <code>ResourceDirective</code> allows the <code>ResourceId</code> field on an event to accept an array of resource IDs. Events with an array value are rendered once per assigned resource in the timeline:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> registerLicense </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">    </span><span class="token imports maybe-class-name">ScheduleComponent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">TimelineViews</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Inject</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">    </span><span class="token imports maybe-class-name">ResourcesDirective</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ResourceDirective</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewsDirective</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewDirective</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports"></span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> resourceData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> eventData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   </span><span class="token maybe-class-name">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">14</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">16</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleComponent</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">550px</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">selectedDate</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript keyword" style="color:rgb(86, 156, 214)">new</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">2026</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">0</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">2</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">eventSettings</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> dataSource </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> eventData </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">group</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> resources </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'Members'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ResourcesDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ResourceDirective</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">field</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">ResourceId</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">title</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">Member</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">Members</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dataSource</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">resourceData</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">textField</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">text</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">idField</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">id</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">allowMultiple</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript boolean" style="color:rgb(78, 201, 176)">true</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ResourcesDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ViewsDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ViewDirective</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">option</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">TimelineWeek</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ViewsDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Inject</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">services</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">TimelineViews</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleComponent</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Call <code>registerLicense()</code> before any Syncfusion component mounts. The <code>group</code> prop on <code>ScheduleComponent</code> specifies which resource groups are active, and the <code>name</code> on <code>ResourceDirective</code> must match the string used in <code>group.resources</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-resource-management-features">Syncfusion Schedule resource management features<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#syncfusion-schedule-resource-management-features" class="hash-link" aria-label="Direct link to Syncfusion Schedule resource management features" title="Direct link to Syncfusion Schedule resource management features" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment via <code>allowMultiple={true}</code> on <code>ResourceDirective</code></li>
<li class="">Multi-level resource grouping using nested <code>ResourceDirective</code> declarations</li>
<li class="">Timeline day, week, and month views for resource scheduling</li>
<li class="">Resource grouping with configurable orientation (horizontal or vertical)</li>
<li class="">Virtual scrolling for large resource lists</li>
<li class="">Export to PDF and Excel</li>
<li class="">13 themes with a visual Theme Studio editor</li>
<li class="">Community License available for qualifying organizations</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-pricing">Syncfusion Schedule pricing<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#syncfusion-schedule-pricing" class="hash-link" aria-label="Direct link to Syncfusion Schedule pricing" title="Direct link to Syncfusion Schedule pricing" translate="no">​</a></h3>
<p>A Community License is available free of charge for organizations with annual gross revenue under $1 million and fewer than five developers. Commercial licensing is quote-based. Contact Syncfusion for pricing. A 30-day free trial is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-schedule">Pros of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#pros-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Pros of Syncfusion Schedule" title="Direct link to Pros of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment is a first-class declarative feature: add <code>allowMultiple={true}</code> to the resource directive and the component handles the rest.</li>
<li class="">Multi-level resource grouping via nested <code>ResourceDirective</code> declarations is straightforward to configure.</li>
<li class="">The Community License provides the full commercial feature set at no cost for small teams and startups that meet the revenue and team size thresholds.</li>
<li class="">Virtual scrolling supports large resource lists without performance degradation.</li>
<li class="">Export to PDF and Excel is available without additional packages.</li>
<li class="">The <a href="https://ej2.syncfusion.com/react/demos/#/material3/schedule/timeline-resources" target="_blank" rel="noopener noreferrer" class="">demos page</a> includes live code and StackBlitz links.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-schedule">Cons of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#cons-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Cons of Syncfusion Schedule" title="Direct link to Cons of Syncfusion Schedule" translate="no">​</a></h3>
<p>The module injection pattern adds boilerplate: every view or feature module must be individually imported and injected, and a missing import silently disables the feature. Commercial pricing is not publicly listed, which makes budget planning difficult before contacting sales. There is no built-in resource utilization histogram or work calendar concept. The docs search frequently returns results for other Syncfusion components rather than the Schedule component itself.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler">DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#daypilot-scheduler" class="hash-link" aria-label="Direct link to DayPilot Scheduler" title="Direct link to DayPilot Scheduler" translate="no">​</a></h2>
<p><a href="https://javascript.daypilot.org/" target="_blank" rel="noopener noreferrer" class="">DayPilot</a> offers a dedicated resource scheduler component with a React wrapper. It is part of the DayPilot Pro commercial suite. Hierarchical resource groups are supported natively through a <code>children</code> property on resource objects, but multi-resource assignment and resource utilization views are not available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-scheduler">Getting started with DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#getting-started-with-daypilot-scheduler" class="hash-link" aria-label="Direct link to Getting started with DayPilot Scheduler" title="Direct link to Getting started with DayPilot Scheduler" translate="no">​</a></h3>
<p>Install the Pro package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-react</span><br></div></code></pre></div></div>
<p>The <code>DayPilotScheduler</code> component accepts a config object spread as props. The example below shows hierarchical resource groups defined with nested <code>children</code> arrays. Group rows with <code>expanded: true</code> are open on initial render. Each event maps to a single resource through the <code>resource</code> property, which accepts a resource <code>id</code> string:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilotScheduler</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        days       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scale      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        cellWidth  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">40</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Development'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grp-dev'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> expanded </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> children </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grp-design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> expanded </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> children </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R3'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T11:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T16:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R3'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">DayPilotScheduler</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">config</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>DayPilot provides a <a href="https://builder.daypilot.org/scheduler" target="_blank" rel="noopener noreferrer" class="">UI Builder</a> that generates configuration code from a visual editor, and a <a href="https://themes.daypilot.org/scheduler/create" target="_blank" rel="noopener noreferrer" class="">Theme Designer</a> that produces CSS theme files.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-resource-management-features">DayPilot Scheduler resource management features<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#daypilot-scheduler-resource-management-features" class="hash-link" aria-label="Direct link to DayPilot Scheduler resource management features" title="Direct link to DayPilot Scheduler resource management features" translate="no">​</a></h3>
<ul>
<li class="">Hierarchical resource groups via <code>children</code> nesting on resource objects</li>
<li class="">Expand/collapse support on group rows</li>
<li class="">Single-resource event assignment (one event per resource row)</li>
<li class="">No multi-resource assignment</li>
<li class="">No resource utilization view</li>
<li class="">No per-resource work calendars</li>
<li class="">Drag-and-drop event scheduling and resizing</li>
<li class="">UI Builder for visual configuration and code generation</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pricing">DayPilot Scheduler pricing<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#daypilot-scheduler-pricing" class="hash-link" aria-label="Direct link to DayPilot Scheduler pricing" title="Direct link to DayPilot Scheduler pricing" translate="no">​</a></h3>
<p>DayPilot Pro starts at $899 per developer. The Lite version is free with limited features. A 60-day free trial of the Pro version is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-scheduler">Pros of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#pros-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Pros of DayPilot Scheduler" title="Direct link to Pros of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Hierarchical resource groups are defined directly in the resource data via <code>children</code>, which is a clean and readable pattern.</li>
<li class="">The UI Builder generates working configuration code, which speeds up initial setup.</li>
<li class="">The Theme Designer lowers the effort required to match a custom brand's visual style.</li>
<li class="">Documentation includes integration examples for ASP.NET and Java backends in addition to JavaScript frameworks.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-scheduler">Cons of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#cons-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Cons of DayPilot Scheduler" title="Direct link to Cons of DayPilot Scheduler" translate="no">​</a></h3>
<p>Multi-resource assignment is not supported. An event maps to exactly one resource, so scheduling a shared meeting across multiple people requires duplicating event records. There is no resource utilization view and no work calendar concept. At $899 per developer, it is priced above Bryntum Scheduler's small-team per-developer price while offering a smaller resource management feature set. The default themes look dated compared to other schedulers in this list, and producing a modern appearance requires CSS work.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p><a href="https://mobiscroll.com/" target="_blank" rel="noopener noreferrer" class="">Mobiscroll</a> is a mobile-first UI component library. Their resource scheduling component is called "Event Calendar" and uses a <code>timeline</code> view type inside the <code>Eventcalendar</code> component. Multi-resource assignment is supported by passing an array to the <code>resource</code> field on an event, which is the same pattern Bryntum uses and makes it straightforward to implement shared events across multiple resource rows.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-mobiscroll-event-calendar">Getting started with Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#getting-started-with-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Getting started with Mobiscroll Event Calendar" title="Direct link to Getting started with Mobiscroll Event Calendar" translate="no">​</a></h3>
<p>Install the React package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/react</span><br></div></code></pre></div></div>
<p>Mobiscroll requires a license. A free trial is available at <a href="https://mobiscroll.com/" target="_blank" rel="noopener noreferrer" class="">mobiscroll.com</a>. The <code>Eventcalendar</code> component takes a <code>view</code> prop that controls which view type is active. Setting <code>timeline.type</code> to <code>'week'</code> enables the resource timeline view. Resources are typed as <code>MbscResource[]</code> and events as <code>MbscCalendarEvent[]</code>.</p>
<p>The example below assigns the "Sprint planning" event to both Alice and Bob by passing an array to the <code>resource</code> field. Mobiscroll renders the event bar once per resource in the array:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Eventcalendar</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscCalendarEvent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscResource</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react/dist/css/mobiscroll.min.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> myResources</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscResource</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Charlie'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// Multi-resource: pass array to resource field</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> myEvents</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscCalendarEvent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sprint planning'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T11:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design review'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T14:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T16:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Eventcalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">view</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> timeline </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> type </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'week'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">data</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">myEvents</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">resources</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">myResources</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Mobiscroll provides three built-in themes (iOS, Material, and Windows), each with light and dark variants. A <a href="https://mobiscroll.com/themebuilder" target="_blank" rel="noopener noreferrer" class="">theme builder</a> allows custom color palettes to be previewed and downloaded.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-resource-management-features">Mobiscroll Event Calendar resource management features<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#mobiscroll-event-calendar-resource-management-features" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar resource management features" title="Direct link to Mobiscroll Event Calendar resource management features" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment by passing an array to the <code>resource</code> field on an event</li>
<li class="">Resource list on the Y-axis of the timeline view</li>
<li class="">Mobile-first design with touch-optimized gestures and responsive layouts</li>
<li class="">No hierarchical resource groups with expand/collapse</li>
<li class="">No resource utilization view</li>
<li class="">No per-resource work calendars</li>
<li class="">Customizable event rendering using render props</li>
<li class="">TypeScript types (<code>MbscResource</code>, <code>MbscCalendarEvent</code>) included in the package</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-pricing">Mobiscroll Event Calendar pricing<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#mobiscroll-event-calendar-pricing" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar pricing" title="Direct link to Mobiscroll Event Calendar pricing" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 per internal project as a perpetual license. A free trial is available at <a href="https://mobiscroll.com/" target="_blank" rel="noopener noreferrer" class="">mobiscroll.com</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-mobiscroll-event-calendar">Pros of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#pros-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Pros of Mobiscroll Event Calendar" title="Direct link to Pros of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignment uses the same array pattern as Bryntum and is easy to implement: pass an array to <code>resource</code> and the component handles rendering.</li>
<li class="">Mobile-first design with large tap targets and adaptive layouts makes it the strongest choice for applications with a high proportion of mobile users.</li>
<li class="">The single <code>Eventcalendar</code> component covers calendar, agenda, and timeline views, reducing the number of dependencies for projects that need multiple scheduling views.</li>
<li class="">TypeScript types are included in the package without a separate <code>@types</code> install.</li>
<li class="">Touch gesture support is more polished than desktop-first alternatives.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-mobiscroll-event-calendar">Cons of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#cons-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Cons of Mobiscroll Event Calendar" title="Direct link to Cons of Mobiscroll Event Calendar" translate="no">​</a></h3>
<p>Mobiscroll SaaS and multi-customer product pricing requires a custom quote. Hierarchical resource groups with expand/collapse are not supported out of the box. There is no built-in resource utilization view and no per-resource work calendar concept. The feature set for resource management is narrower than Bryntum or Syncfusion for teams that need grouping, utilization tracking, or capacity planning.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-react-resource-scheduler-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below summarizes the resource management capabilities of each library:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Scheduler</th><th>DHTMLX Scheduler</th><th>Syncfusion Schedule</th><th>DayPilot Scheduler</th><th>Mobiscroll Event Calendar</th></tr></thead><tbody><tr><td>Multi-resource assignment</td><td>Yes</td><td>No</td><td>Yes (<code>allowMultiple</code>)</td><td>No</td><td>Yes (array in <code>resource</code>)</td></tr><tr><td>Resource grouping</td><td>Yes</td><td>No</td><td>Yes</td><td>Yes</td><td>No</td></tr><tr><td>Resource utilization view</td><td>Yes (<code>ResourceUtilization</code>)</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>Resource filtering</td><td>Yes</td><td>No</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Work calendars</td><td>Yes</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>React wrapper</td><td>Yes</td><td>No (imperative)</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Free tier</td><td>No</td><td>Yes (Standard, GPL only)</td><td>Yes (Community License)</td><td>Yes (Lite, limited)</td><td>No</td></tr></tbody></table></div>
<p>The table below matches common resource management scenarios to the most suitable library:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Best choice</th></tr></thead><tbody><tr><td>Enterprise resource management with utilization tracking and work calendars</td><td>Bryntum Scheduler</td></tr><tr><td>Multi-resource assignment on a budget or for a qualifying small team</td><td>Syncfusion Schedule (Community License)</td></tr><tr><td>Mobile-first scheduling with multi-resource support</td><td>Mobiscroll Event Calendar</td></tr><tr><td>Hierarchical resource groups without multi-resource requirements</td><td>DayPilot Scheduler</td></tr></tbody></table></div>
<p>Bryntum Scheduler is the most complete library for resource management. It is the only option in this comparison that provides native multi-resource assignment, hierarchical resource groups, a dedicated utilization view, and per-resource work calendars all in the same product. Teams that need auto-scheduling or resource leveling can upgrade to Scheduler Pro without changing their existing codebase.</p>
<p>Syncfusion Schedule is the strongest alternative for teams that need multi-resource assignment and cannot afford Bryntum's price point. The <code>allowMultiple</code> API is clean, multi-level grouping is declarative, and the Community License makes the full feature set free for qualifying organizations. The absence of a utilization view is the main limitation for teams that need capacity monitoring.</p>
<p>Mobiscroll Event Calendar is the right choice when the primary audience uses mobile devices and multi-resource assignment is required. Its touch interaction quality is unmatched in this comparison. DayPilot is a reasonable starting point when hierarchical grouping is the only resource management requirement and multi-resource assignment is not needed. DHTMLX Scheduler is a practical choice for open-source projects that qualify for the Standard free tier, though its resource management capabilities are the most limited of the five libraries reviewed here.</p>]]></content:encoded>
            <category>scheduler</category>
        </item>
        <item>
            <title><![CDATA[Best React scheduler components]]></title>
            <link>https://www.react-gantt.com/content/best-react-scheduler-components/</link>
            <guid>https://www.react-gantt.com/content/best-react-scheduler-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A React scheduler component displays resources alongside a time axis, with events placed on a timeline for each resource.]]></description>
            <content:encoded><![CDATA[<p>A React scheduler component displays resources alongside a time axis, with events placed on a timeline for each resource. It is different from a Gantt chart, which focuses on task bars with dependencies and a work breakdown structure, and from a calendar, which shows personal appointments in day, week, or month views. Common scheduler use cases include equipment scheduling, staff rostering, room booking, and dispatch management.</p>
<p>This comparison covers five React resource scheduler libraries: <a href="https://bryntum.com/products/scheduler/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler</a>, <a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Scheduler</a>, <a href="https://www.syncfusion.com/react-ui-components/react-scheduler" target="_blank" rel="noopener noreferrer" class="">Syncfusion Schedule</a>, <a href="https://javascript.daypilot.org/scheduler/" target="_blank" rel="noopener noreferrer" class="">DayPilot Scheduler</a>, and <a href="https://mobiscroll.com/event-calendar-scheduler" target="_blank" rel="noopener noreferrer" class="">Mobiscroll Event Calendar</a>. The criteria are installation, React integration, timeline features, resource scheduling features, pricing, and trade-offs.</p>
<p>Vendor naming is inconsistent. Syncfusion calls its resource timeline component Scheduler or Schedule, and Mobiscroll calls its equivalent Event Calendar with a timeline view. For a broader comparison that also covers non-React contexts, see our guide to the <a href="https://bryntum.com/blog/best-javascript-scheduler-components" target="_blank" rel="noopener noreferrer" class="">best JavaScript scheduler components</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler">Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#bryntum-scheduler" class="hash-link" aria-label="Direct link to Bryntum Scheduler" title="Direct link to Bryntum Scheduler" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/scheduler/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler</a> is a commercial resource scheduler built on vanilla JavaScript with a dedicated React wrapper package. It is part of the broader <a href="https://bryntum.com/" target="_blank" rel="noopener noreferrer" class="">Bryntum</a> suite of scheduling and project management components. You can explore the full range of capabilities in the <a href="https://bryntum.com/products/scheduler/examples/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler demos</a>.</p>
<p>Bryntum also has a <a href="https://bryntum.com/products/schedulerpro/" target="_blank" rel="noopener noreferrer" class="">Scheduler Pro</a> that extends the base scheduler with a reactive scheduling engine, travel time, and task constraints.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-scheduler">Getting started with Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#getting-started-with-bryntum-scheduler" class="hash-link" aria-label="Direct link to Getting started with Bryntum Scheduler" title="Direct link to Getting started with Bryntum Scheduler" translate="no">​</a></h3>
<p>Install the trial package from the public npm registry along with the React wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler@npm:@bryntum/scheduler-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler-react@7.3.0</span><br></div></code></pre></div></div>
<p>CSS imports must appear in this specific order. The FontAwesome stylesheets must come first because the toolbar icons depend on them. The core <code>scheduler.css</code> file follows, and the theme file comes last so its variables override the defaults correctly:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/scheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>BryntumScheduler</code> component accepts a config object spread as props. The <code>resources</code> array defines the rows on the Y-axis, the <code>events</code> array places event bars on the timeline, and <code>columns</code> defines the resource grid on the left:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BryntumScheduler</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        endDate    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-26'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        viewPreset </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hourAndDay'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        columns    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> field </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">130</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Celia'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Sales'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Fancy law firm'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'teal'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Small boutique'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'blue'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Grocery store'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'lime'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Busy'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">              startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> eventColor </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'red'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">           startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'clients office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">             startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-07'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'office'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resourceId </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">13</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Suggested meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-09'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDate </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-05-11'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(156, 220, 254)">location</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'grocery store'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">BryntumScheduler</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">config</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>For server-backed data, configure a CrudManager directly in the config. The CrudManager handles loading and syncing through a JSON protocol so you do not need to write manual fetch logic:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token literal-property property">crudManager</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">loadUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/load'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">syncUrl</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'/api/sync'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoLoad</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoSync</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>Bryntum ships 10 themes across five light/dark pairs. To switch themes, replace the theme CSS import.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Scheduler" src="https://www.react-gantt.com/assets/images/bryntum-scheduler-cdea645a1b76ea741b10ad1742864273.png" width="2558" height="1188" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-features">Bryntum Scheduler features<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#bryntum-scheduler-features" class="hash-link" aria-label="Direct link to Bryntum Scheduler features" title="Direct link to Bryntum Scheduler features" translate="no">​</a></h3>
<ul>
<li class="">Multi-resource assignments: a single event can be assigned to more than one resource</li>
<li class="">Event overlap detection and configurable stacking behavior</li>
<li class="">Drag-and-drop scheduling, event resizing, and a built-in event editor dialog</li>
<li class="">Recurring events</li>
<li class="">Vertical and horizontal resource grouping</li>
<li class="">18 built-in view presets (hourAndDay, weekAndDay, monthAndYear, and more)</li>
<li class="">Virtual scrolling for large datasets with minimal DOM footprint</li>
<li class="">MCP server for AI-assisted development tooling</li>
<li class="">10 themes (five light/dark pairs)</li>
<li class="">Bryntum Scheduler Pro adds travel time, scheduling constraints, and the ChronoGraph reactive scheduling engine</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-pricing">Bryntum Scheduler pricing<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#bryntum-scheduler-pricing" class="hash-link" aria-label="Direct link to Bryntum Scheduler pricing" title="Direct link to Bryntum Scheduler pricing" translate="no">​</a></h3>
<p>Bryntum Scheduler is priced from $680 per developer for the small-team license, with a three-developer minimum and 12 months of updates. Scheduler Pro is priced separately. Check <a href="https://bryntum.com/store/scheduler/" target="_blank" rel="noopener noreferrer" class="">bryntum.com</a> for current pricing. A trial version is available through npm as shown in the installation instructions above.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-scheduler">Pros of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#pros-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Pros of Bryntum Scheduler" title="Direct link to Pros of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">The React wrapper is a first-class package maintained in lockstep with the core library, not a community adapter.</li>
<li class="">18 built-in view presets cover nearly every resource scheduling layout without configuration.</li>
<li class="">Virtual scrolling and a minimal DOM footprint make it suitable for large resource and event datasets.</li>
<li class="">The MCP server integration allows AI coding tools to access Bryntum's documentation and API directly.</li>
<li class="">Comprehensive <a href="https://bryntum.com/products/scheduler/docs/" target="_blank" rel="noopener noreferrer" class="">documentation</a> includes live demos with editable code, integration guides, and migration guides from competing libraries.</li>
<li class="">Bryntum Scheduler Pro is a drop-in upgrade path when you need a scheduling engine or travel time features.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-scheduler">Cons of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#cons-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Cons of Bryntum Scheduler" title="Direct link to Cons of Bryntum Scheduler" translate="no">​</a></h3>
<p>Bryntum Scheduler has no free or open-source tier. The three-developer minimum can be difficult to justify for small teams building simple resource views. The learning curve for the configuration API is steeper than lighter-weight alternatives.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Scheduler</a> is a calendar and scheduling component that offers multiple views. For resource scheduling, the Timeline view places resources on the Y-axis and a time axis on the X-axis. The Timeline view and advanced views require the PRO edition.</p>
<p>DHTMLX Scheduler is a global singleton rather than a React component, so it must be initialized manually inside a React component using a container ref and a <code>useEffect</code> hook.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-scheduler">Getting started with DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#getting-started-with-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Scheduler" title="Direct link to Getting started with DHTMLX Scheduler" translate="no">​</a></h3>
<p>Install the package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>Because DHTMLX Scheduler is a global singleton, you call <code>scheduler.init()</code> to attach it to a DOM node and <code>scheduler.parse()</code> to load data. Both calls go inside a <code>useEffect</code> so they run after the component mounts. Clean up by calling <code>scheduler.destructor()</code> in the effect's return function:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useEffect</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> useRef </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports">scheduler</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">DHtmlxScheduler</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> containerRef </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:rgb(220, 220, 170)">useRef</span><span class="token generic-function generic class-name operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token generic-function generic class-name" style="color:rgb(78, 201, 176)">HTMLDivElement</span><span class="token generic-function generic class-name operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword" style="color:rgb(86, 156, 214)">null</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">useEffect</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">xml_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d %H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)">// Configure Timeline view for resource scheduling</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">createTimelineView</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            name      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_unit    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_date    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_step    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_size    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_start   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            x_length  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            y_unit    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'people'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            y_property</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'section_id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            render    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bar'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">containerRef</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">current</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">serverList</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'people'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> key </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> key </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 10:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02 12:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> section_id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start_date</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 09:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end_date</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04 17:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> section_id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">destructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">containerRef</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> width </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100%'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> height </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'100vh'</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The Timeline view is configured by calling <code>scheduler.createTimelineView()</code> before <code>scheduler.init()</code>. Resources are registered as a named server list using <code>scheduler.serverList()</code>, and events reference the resource key through the property set in <code>y_property</code>.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler" src="https://www.react-gantt.com/assets/images/dhtmlx-scheduler-8a45f0e64d65f3372e6310101f1f0116.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-features">DHTMLX Scheduler features<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#dhtmlx-scheduler-features" class="hash-link" aria-label="Direct link to DHTMLX Scheduler features" title="Direct link to DHTMLX Scheduler features" translate="no">​</a></h3>
<ul>
<li class="">Multiple calendar views: day, week, month, year, and agenda</li>
<li class="">Timeline view for resource scheduling (PRO edition)</li>
<li class="">Recurring events</li>
<li class="">Touch support for mobile browsers</li>
<li class="">Server-side data loading helpers via the DataProcessor API</li>
<li class="">Connectors for PHP, Java, and .NET backends</li>
<li class="">No built-in scheduling engine</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing">DHTMLX Scheduler pricing<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#dhtmlx-scheduler-pricing" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing" title="Direct link to DHTMLX Scheduler pricing" translate="no">​</a></h3>
<p>The Standard edition is free for GPL-compatible open-source projects. The PRO edition, which includes the Timeline view, is priced at $599 to $3,999 perpetual depending on team size. A 30-day free trial of the PRO edition is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-scheduler">Pros of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#pros-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Pros of DHTMLX Scheduler" title="Direct link to Pros of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">A free Standard edition exists for open-source projects, making it accessible at zero cost for qualifying use cases.</li>
<li class="">Server-side DataProcessor connectors reduce the boilerplate required to sync scheduler changes to PHP, Java, and .NET backends.</li>
<li class="">The wide range of calendar views means the same library covers both personal calendar and resource scheduling requirements.</li>
<li class="">Comprehensive <a href="https://docs.dhtmlx.com/scheduler/samples/" target="_blank" rel="noopener noreferrer" class="">samples</a> and <a href="https://dhtmlx.com/docs/products/demoApps/" target="_blank" rel="noopener noreferrer" class="">demos</a> include source code.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-scheduler">Cons of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#cons-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Cons of DHTMLX Scheduler" title="Direct link to Cons of DHTMLX Scheduler" translate="no">​</a></h3>
<p>DHTMLX Scheduler is not a React component. Integrating it into a React application requires a container ref and a <code>useEffect</code> setup, which works against React's declarative model and can cause issues in strict mode with double-invocation of effects. The Timeline view (required for resource scheduling) is locked behind the PRO edition. The default skins look dated compared to more modern alternatives. The documentation mixes old and new API references, and the search functionality does not reliably surface relevant results.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule">Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#syncfusion-schedule" class="hash-link" aria-label="Direct link to Syncfusion Schedule" title="Direct link to Syncfusion Schedule" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/" target="_blank" rel="noopener noreferrer" class="">Syncfusion</a> provides a suite of UI components for React, Angular, Vue, and Blazor. Their resource timeline component is called "Scheduler" or "Schedule" and is accessed through <code>ScheduleComponent</code> with <code>TimelineViews</code>. We use this component with the <code>TimelineDay</code> and <code>TimelineWeek</code> views to get resource scheduling behavior.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-schedule">Getting started with Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#getting-started-with-syncfusion-schedule" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Schedule" title="Direct link to Getting started with Syncfusion Schedule" translate="no">​</a></h3>
<p>Install the React schedule package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-react-schedule</span><br></div></code></pre></div></div>
<p>Syncfusion uses a module injection pattern. You must import and inject the view modules you want to use. Several peer packages must also be imported for their CSS. Import them in this order before any component CSS:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-schedule/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Call <code>registerLicense()</code> before any Syncfusion component mounts. Then declare resources and events as plain objects and pass them to <code>ScheduleComponent</code> through declarative directive children:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> registerLicense </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">    </span><span class="token imports maybe-class-name">ScheduleComponent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">TimelineViews</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">TimelineMonth</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Inject</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">    </span><span class="token imports maybe-class-name">ResourcesDirective</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ResourceDirective</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewsDirective</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ViewDirective</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports"></span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-react-schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> resourceData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> eventData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token maybe-class-name">Id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Subject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">StartTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">EndTime</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">17</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ResourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleComponent</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">height</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">550px</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">selectedDate</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript keyword" style="color:rgb(86, 156, 214)">new</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">2026</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">0</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript number" style="color:rgb(181, 206, 168)">2</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">eventSettings</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> dataSource </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> eventData </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ResourcesDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ResourceDirective</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">field</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">ResourceId</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">title</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">Resource</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">Resources</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">                </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">dataSource</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">resourceData</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">textField</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">text</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">idField</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">id</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ResourcesDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ViewsDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ViewDirective</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">option</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">TimelineDay</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ViewDirective</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">option</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">TimelineWeek</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ViewsDirective</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Inject</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">services</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">TimelineViews</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript maybe-class-name" style="color:rgb(78, 201, 176)">TimelineMonth</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">ScheduleComponent</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Syncfusion provides 13 themes and a <a href="https://ej2.syncfusion.com/themestudio/" target="_blank" rel="noopener noreferrer" class="">Theme Studio GUI</a> that lets you customize colors visually and download the resulting CSS.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-features">Syncfusion Schedule features<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#syncfusion-schedule-features" class="hash-link" aria-label="Direct link to Syncfusion Schedule features" title="Direct link to Syncfusion Schedule features" translate="no">​</a></h3>
<ul>
<li class="">Timeline day, week, and month views for resource scheduling</li>
<li class="">Drag-and-drop event scheduling and resizing</li>
<li class="">Inline event editing</li>
<li class="">Recurring events</li>
<li class="">Resource grouping with multi-level hierarchy</li>
<li class="">Virtual scrolling for large datasets</li>
<li class="">Export to PDF and Excel</li>
<li class="">13 themes with a visual Theme Studio editor</li>
<li class="">Community License available for qualifying organizations</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-pricing">Syncfusion Schedule pricing<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#syncfusion-schedule-pricing" class="hash-link" aria-label="Direct link to Syncfusion Schedule pricing" title="Direct link to Syncfusion Schedule pricing" translate="no">​</a></h3>
<p>A Community License is available free of charge for organizations with annual gross revenue under $1 million and fewer than five developers. Commercial licensing is quote-based. Contact Syncfusion for pricing. A 30-day free trial is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-schedule">Pros of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#pros-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Pros of Syncfusion Schedule" title="Direct link to Pros of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">The Community License makes the full feature set free for small teams and startups that meet the revenue and team size thresholds.</li>
<li class="">The Theme Studio GUI allows non-developers to customize the component's appearance without writing CSS.</li>
<li class="">The declarative <code>ResourcesDirective</code> and <code>ViewsDirective</code> API fits naturally into JSX.</li>
<li class="">Export to PDF and Excel is available out of the box.</li>
<li class="">The <a href="https://ej2.syncfusion.com/react/demos/#/material3/schedule/timeline-resources" target="_blank" rel="noopener noreferrer" class="">demos page</a> includes live code and StackBlitz links.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-schedule">Cons of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#cons-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Cons of Syncfusion Schedule" title="Direct link to Cons of Syncfusion Schedule" translate="no">​</a></h3>
<p>The module injection pattern adds boilerplate: you must import and inject every view or feature you use, and forgetting a single import silently disables the feature. Commercial pricing is not publicly listed, which makes budget planning difficult. The docs search frequently returns results for other Syncfusion components rather than the Schedule. The component lacks undo/redo functionality out of the box.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler">DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#daypilot-scheduler" class="hash-link" aria-label="Direct link to DayPilot Scheduler" title="Direct link to DayPilot Scheduler" translate="no">​</a></h2>
<p><a href="https://javascript.daypilot.org/" target="_blank" rel="noopener noreferrer" class="">DayPilot</a> offers a dedicated resource scheduler component with a React wrapper. It is part of the DayPilot Pro commercial suite. A free Lite version is available for evaluation and basic use, but it has limited functionality compared to the Pro version.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-scheduler">Getting started with DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#getting-started-with-daypilot-scheduler" class="hash-link" aria-label="Direct link to Getting started with DayPilot Scheduler" title="Direct link to Getting started with DayPilot Scheduler" translate="no">​</a></h3>
<p>Install the Pro package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-react</span><br></div></code></pre></div></div>
<p>For evaluation, use the public Lite package instead:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @daypilot/daypilot-lite-react</span><br></div></code></pre></div></div>
<p>The <code>DayPilotScheduler</code> component accepts a config object spread as props. Resources map to rows, and events reference a resource by its <code>id</code> field through the <code>resource</code> property:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DayPilotScheduler</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'daypilot-pro-react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">useState</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        startDate  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        days       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        scale      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Hour'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        cellWidth  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">40</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        resources  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">   id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        events     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T12:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R1'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> text </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T17:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'R2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">DayPilotScheduler</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag spread operator" style="color:rgb(212, 212, 212)">...</span><span class="token tag spread" style="color:rgb(78, 201, 176)">config</span><span class="token tag spread punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>DayPilot provides a <a href="https://builder.daypilot.org/scheduler" target="_blank" rel="noopener noreferrer" class="">UI Builder</a> that generates configuration code from a visual editor, and a <a href="https://themes.daypilot.org/scheduler/create" target="_blank" rel="noopener noreferrer" class="">Theme Designer</a> that produces CSS theme files.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-features">DayPilot Scheduler features<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#daypilot-scheduler-features" class="hash-link" aria-label="Direct link to DayPilot Scheduler features" title="Direct link to DayPilot Scheduler features" translate="no">​</a></h3>
<ul>
<li class="">Drag-and-drop event scheduling, resizing, and moving</li>
<li class="">Event editing dialog</li>
<li class="">Row headers with multi-level hierarchy support</li>
<li class="">Multi-day events</li>
<li class="">Keyboard navigation</li>
<li class="">UI Builder for visual configuration</li>
<li class="">Theme Designer for CSS theme customization</li>
<li class="">No built-in scheduling engine</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pricing">DayPilot Scheduler pricing<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#daypilot-scheduler-pricing" class="hash-link" aria-label="Direct link to DayPilot Scheduler pricing" title="Direct link to DayPilot Scheduler pricing" translate="no">​</a></h3>
<p>DayPilot Pro starts at $899 per developer. The Lite version is free with limited features. A 60-day free trial of the Pro version is available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-scheduler">Pros of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#pros-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Pros of DayPilot Scheduler" title="Direct link to Pros of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">The UI Builder generates working configuration code, which speeds up initial setup.</li>
<li class="">The Theme Designer lowers the effort required to match a custom brand's visual style.</li>
<li class="">The Lite version provides a no-cost starting point for prototyping and simple projects.</li>
<li class="">Documentation includes integration examples for ASP.NET and Java backends in addition to JavaScript frameworks.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-scheduler">Cons of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#cons-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Cons of DayPilot Scheduler" title="Direct link to Cons of DayPilot Scheduler" translate="no">​</a></h3>
<p>The default UI and the available themes look less polished than those of other schedulers in this list. Producing a modern appearance requires significant CSS work. DayPilot Scheduler does not include advanced features such as filtering, undo/redo, or virtual scrolling for large datasets. At $899 per developer, it is the most expensive option in this comparison while offering a smaller feature set than Bryntum.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p><a href="https://mobiscroll.com/" target="_blank" rel="noopener noreferrer" class="">Mobiscroll</a> is a mobile-first UI component library. Their resource scheduling component is called "Event Calendar" and uses a <code>timeline</code> view type inside the <code>Eventcalendar</code> component. Mobiscroll does not call this a scheduler. The timeline view is one of several view types available on the same component.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-mobiscroll-event-calendar">Getting started with Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#getting-started-with-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Getting started with Mobiscroll Event Calendar" title="Direct link to Getting started with Mobiscroll Event Calendar" translate="no">​</a></h3>
<p>Install the React package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/react</span><br></div></code></pre></div></div>
<p>Mobiscroll requires a license. A free trial is available at <a href="https://mobiscroll.com/" target="_blank" rel="noopener noreferrer" class="">mobiscroll.com</a>. The <code>Eventcalendar</code> component takes a <code>view</code> prop that controls which view type is active. Setting <code>timeline.type</code> to <code>'week'</code> enables the resource timeline view. Resources are typed as <code>MbscResource[]</code> and events as <code>MbscCalendarEvent[]</code>:</p>
<div class="language-tsx codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-tsx codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Eventcalendar</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscCalendarEvent</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">MbscResource</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@mobiscroll/react/dist/css/mobiscroll.min.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> myResources</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscResource</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Alice'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Bob'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> myEvents</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">MbscCalendarEvent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Meeting'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T10:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-02T12:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> id </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resource </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> title </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Workshop'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T09:00:00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-04T17:00:00'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">App</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag class-name" style="color:rgb(78, 201, 176)">Eventcalendar</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">view</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> timeline </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> type </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript string" style="color:rgb(206, 145, 120)">'week'</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> eventList </span><span class="token tag script language-javascript operator" style="color:rgb(212, 212, 212)">:</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript boolean" style="color:rgb(78, 201, 176)">false</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">data</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">myEvents</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">        </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">resources</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(212, 212, 212)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token tag script language-javascript" style="color:rgb(78, 201, 176)">myResources</span><span class="token tag script language-javascript punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Mobiscroll provides three built-in themes (iOS, Material, and Windows), each with light and dark variants. A <a href="https://mobiscroll.com/themebuilder" target="_blank" rel="noopener noreferrer" class="">theme builder</a> allows custom color palettes to be previewed and downloaded.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-features">Mobiscroll Event Calendar features<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#mobiscroll-event-calendar-features" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar features" title="Direct link to Mobiscroll Event Calendar features" translate="no">​</a></h3>
<ul>
<li class="">Timeline view with resources on the Y-axis</li>
<li class="">Drag-and-drop scheduling and resizing</li>
<li class="">Recurring events</li>
<li class="">Mobile-first design with touch-optimized gestures and responsive layouts</li>
<li class="">Customizable event rendering using render props</li>
<li class="">Three built-in themes with light and dark variants plus a theme builder</li>
<li class="">Multiple view types on the same component: calendar, scheduler, timeline, and agenda</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-pricing">Mobiscroll Event Calendar pricing<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#mobiscroll-event-calendar-pricing" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar pricing" title="Direct link to Mobiscroll Event Calendar pricing" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 per internal project as a perpetual license. A free trial is available at <a href="https://mobiscroll.com/" target="_blank" rel="noopener noreferrer" class="">mobiscroll.com</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-mobiscroll-event-calendar">Pros of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#pros-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Pros of Mobiscroll Event Calendar" title="Direct link to Pros of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">Mobile-first design with large tap targets and adaptive layouts makes it the strongest choice for applications with a high proportion of mobile users.</li>
<li class="">The single <code>Eventcalendar</code> component covers calendar, agenda, and timeline views, reducing the number of dependencies needed in a project that requires multiple scheduling views.</li>
<li class="">Three built-in themes with a visual theme builder make styling fast.</li>
<li class="">TypeScript types (<code>MbscResource</code>, <code>MbscCalendarEvent</code>) are included in the package.</li>
<li class="">Touch gesture support is more polished than in desktop-first alternatives.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-mobiscroll-event-calendar">Cons of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#cons-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Cons of Mobiscroll Event Calendar" title="Direct link to Cons of Mobiscroll Event Calendar" translate="no">​</a></h3>
<p>Mobiscroll SaaS and multi-customer product pricing requires a custom quote. The feature set for pure resource scheduling is narrower than Bryntum or Syncfusion: there is no built-in scheduling engine, no undo/redo, and fewer view presets.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-react-scheduler-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below compares key features across the five libraries:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Scheduler</th><th>DHTMLX Scheduler</th><th>Syncfusion Schedule</th><th>DayPilot Scheduler</th><th>Mobiscroll Event Calendar</th></tr></thead><tbody><tr><td>Resource grouping</td><td>Yes</td><td>Yes (PRO)</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Multi-level resources</td><td>Yes</td><td>Yes (PRO)</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Event overlap/stacking</td><td>Yes</td><td>Yes (PRO)</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Drag-and-drop</td><td>Yes</td><td>Yes (PRO)</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Recurring events</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Virtual scrolling for large datasets</td><td>Yes</td><td>No</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>React native wrapper</td><td>Yes</td><td>No</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Free tier</td><td>No</td><td>Yes (Standard, GPL only)</td><td>Yes (Community License)</td><td>Yes (Lite, limited)</td><td>No</td></tr></tbody></table></div>
<p>The table below matches common use cases to the most suitable library:</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Best choice</th></tr></thead><tbody><tr><td>Enterprise resource scheduling with large datasets</td><td>Bryntum Scheduler</td></tr><tr><td>Small team or startup that qualifies for a free tier</td><td>Syncfusion Schedule (Community License) or DHTMLX Standard</td></tr><tr><td>Mobile-first or tablet-heavy application</td><td>Mobiscroll Event Calendar</td></tr><tr><td>Simple resource view with a low upfront cost</td><td>DayPilot Lite or DHTMLX Standard</td></tr></tbody></table></div>
<p>Bryntum Scheduler has the most complete feature set of the five libraries. Virtual scrolling, 18 view presets, multi-resource assignments, and the MCP server integration set it apart at the enterprise level. Teams that need auto-scheduling or travel time can upgrade to Scheduler Pro without changing their codebase.</p>
<p>Syncfusion Schedule is the most accessible option for small teams. The Community License provides the full commercial feature set at no cost for organizations that qualify. The declarative JSX API and built-in export to PDF and Excel make it a practical choice for internal tooling.</p>
<p>Mobiscroll Event Calendar is the right choice when the primary audience uses mobile devices. No other library in this comparison matches its touch interaction quality and responsive layout behavior. DayPilot and DHTMLX Standard are suitable starting points when budget is the primary constraint, though both require an upgrade to unlock the full resource scheduling feature set.</p>
<p>If you are considering moving from one of these libraries to Bryntum, we provide step-by-step migration guides:</p>
<ul>
<li class=""><a href="https://bryntum.com/products/scheduler/docs/guide/Scheduler/migration/migrate-from-dhtmlx-to-bryntum" target="_blank" rel="noopener noreferrer" class="">Migrate from DHTMLX Scheduler to Bryntum</a></li>
<li class=""><a href="https://bryntum.com/products/scheduler/docs/guide/Scheduler/migration/migrate-from-syncfusion-to-bryntum" target="_blank" rel="noopener noreferrer" class="">Migrate from Syncfusion to Bryntum</a></li>
<li class=""><a href="https://bryntum.com/products/scheduler/docs/guide/Scheduler/migration/migrate-from-mobiscroll-to-bryntum" target="_blank" rel="noopener noreferrer" class="">Migrate from Mobiscroll to Bryntum</a></li>
</ul>]]></content:encoded>
            <category>scheduler</category>
        </item>
        <item>
            <title><![CDATA[Best JavaScript scheduler components for large datasets]]></title>
            <link>https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/</link>
            <guid>https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When choosing a scheduler for large datasets, the hard problem is not displaying one event.]]></description>
            <content:encoded><![CDATA[<p>When choosing a scheduler for large datasets, the hard problem is not displaying one event. The hard problem is keeping scrolling usable when the schedule has hundreds of resources and thousands of visible events. DOM-based schedulers rely on virtual scrolling, while canvas-based schedulers avoid DOM nodes for events entirely.</p>
<p>This article compares five JavaScript scheduler components for large datasets using the criteria below. For a broader comparison without the large-dataset focus, see our <a href="https://bryntum.com/blog/best-javascript-scheduler-components/" target="_blank" rel="noopener noreferrer" class="">best JavaScript scheduler components</a> article.</p>
<ul>
<li class="">Rendering model.</li>
<li class="">Virtual scrolling or canvas rendering.</li>
<li class="">Multi-resource scheduling.</li>
<li class="">Package access and framework support.</li>
<li class="">When Bryntum Scheduler is the strongest DOM-based option.</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler">Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#bryntum-scheduler" class="hash-link" aria-label="Direct link to Bryntum Scheduler" title="Direct link to Bryntum Scheduler" translate="no">​</a></h2>
<p>Bryntum Scheduler is a high-performance DOM-based scheduler with virtual scrolling on both the horizontal and vertical axes. It is built with TypeScript and ships framework wrappers for React, Angular, and Vue, as well as a plain JavaScript API. The <a href="https://www.bryntum.com/products/scheduler/docs/guide/Scheduler/npm/repository/installation" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler quick start</a> covers package installation and framework quick starts.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Scheduler showing resource rows and events across a timeline" src="https://www.react-gantt.com/assets/images/bryntum-scheduler-6060e33f29e2d7124036df801eade3a1.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-setup-for-large-datasets">Bryntum Scheduler setup for large datasets<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#bryntum-scheduler-setup-for-large-datasets" class="hash-link" aria-label="Direct link to Bryntum Scheduler setup for large datasets" title="Direct link to Bryntum Scheduler setup for large datasets" translate="no">​</a></h3>
<p>Bryntum Scheduler is available on npm as a trial package. Install it with:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler@npm:@bryntum/scheduler-trial@7.3.0</span><br></div></code></pre></div></div>
<p>Add the container element to the HTML file:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">html</span><span class="token style language-css selector punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css selector" style="color:rgb(215, 186, 125)"> body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">margin</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">0</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">%</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector id" style="color:rgb(215, 186, 125)">#container</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">vh</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Import the CSS files before the component module. The order matters: Font Awesome base styles must come before the icon subset, and the theme file must come after the core scheduler stylesheet so that theme variables override the defaults correctly.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/scheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Scheduler </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// 100 resources, 5 000 events</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> resources </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> Array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">Resource </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> Array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5000</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resourceId</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(212, 212, 212)">%</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">Event </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Math</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">floor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">%</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">28</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">endDate</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Math</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">floor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">%</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">28</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> scheduler </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">appendTo</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">endDate</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">viewPreset</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'weekAndDay'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">columns</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">130</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    resources</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-handles-large-dom-schedules-with-virtual-scrolling">Bryntum Scheduler handles large DOM schedules with virtual scrolling<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#bryntum-scheduler-handles-large-dom-schedules-with-virtual-scrolling" class="hash-link" aria-label="Direct link to Bryntum Scheduler handles large DOM schedules with virtual scrolling" title="Direct link to Bryntum Scheduler handles large DOM schedules with virtual scrolling" translate="no">​</a></h3>
<p>Bryntum Scheduler applies virtual scrolling on both axes, meaning only the rows and columns currently in the viewport are present in the DOM. As the user scrolls, rows outside the viewport are removed and new ones are added, keeping the total DOM node count stable regardless of total dataset size.</p>
<p>Event batching groups multiple data mutations into a single render pass, which prevents intermediate repaints during programmatic updates. For large remote datasets, the CrudManager handles server communication and supports lazy loading, so only the data needed for the current view range is fetched at a time. Row height and event overlap layout are both configurable, allowing the DOM density per row to be tuned for the specific dataset shape.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-starts-with-the-small-team-license">Bryntum Scheduler starts with the Small Team license<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#bryntum-scheduler-starts-with-the-small-team-license" class="hash-link" aria-label="Direct link to Bryntum Scheduler starts with the Small Team license" title="Direct link to Bryntum Scheduler starts with the Small Team license" translate="no">​</a></h3>
<p>Bryntum Scheduler costs $680 per developer for the <strong>Small Team</strong> license, with a three-developer minimum and 12 months of updates. A free trial is available through the npm trial package shown above.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-keeps-large-schedules-in-the-dom">Bryntum Scheduler keeps large schedules in the DOM<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#bryntum-scheduler-keeps-large-schedules-in-the-dom" class="hash-link" aria-label="Direct link to Bryntum Scheduler keeps large schedules in the DOM" title="Direct link to Bryntum Scheduler keeps large schedules in the DOM" translate="no">​</a></h3>
<p>Bryntum Scheduler stands out for the following reasons.</p>
<ul>
<li class="">Virtual scrolling on both the vertical and horizontal axes keeps DOM node count bounded regardless of total event volume.</li>
<li class="">Framework wrappers for React, Angular, and Vue are included in the same package.</li>
<li class="">CrudManager handles lazy loading from REST or custom backends.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-still-hits-limits-at-extreme-event-density">Bryntum Scheduler still hits limits at extreme event density<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#bryntum-scheduler-still-hits-limits-at-extreme-event-density" class="hash-link" aria-label="Direct link to Bryntum Scheduler still hits limits at extreme event density" title="Direct link to Bryntum Scheduler still hits limits at extreme event density" translate="no">​</a></h3>
<p>Two limitations matter during evaluation.</p>
<ul>
<li class="">The per-developer license cost is higher than several alternatives.</li>
<li class="">Very large simultaneous event counts (tens of thousands visible at once) still reach DOM performance limits that only a canvas-based renderer can avoid.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p>DHTMLX Scheduler has a long history in enterprise web applications. It provides several built-in views including day, week, month, and timeline. Multi-resource scheduling in a timeline layout requires the <strong>PRO</strong> edition.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler timeline view with resource rows" src="https://www.react-gantt.com/assets/images/dhtmlx-scheduler-94bbb1531d04e3e7c872f6795bb6ac66.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-setup-for-timeline-rendering">DHTMLX Scheduler setup for timeline rendering<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#dhtmlx-scheduler-setup-for-timeline-rendering" class="hash-link" aria-label="Direct link to DHTMLX Scheduler setup for timeline rendering" title="Direct link to DHTMLX Scheduler setup for timeline rendering" translate="no">​</a></h3>
<p>Install DHTMLX Scheduler from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>The example below uses the timeline view, which is available in the <strong>PRO</strong> edition. It sets up 30 resources and 900 events distributed across 28 days:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> scheduler </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'dhtmlx-scheduler'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> resources </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> Array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">key</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">String</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">label</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">Resource </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> Array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">900</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">text</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">Event </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">start_date</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">2026-01-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">String</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">Math</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">floor</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">/</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">30</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">%</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">28</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">padStart</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">2</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation string" style="color:rgb(206, 145, 120)">'0'</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)"> 09:00</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">end_date</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">2026-01-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">String</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">Math</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">floor</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">/</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">30</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">%</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">28</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">padStart</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">2</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation string" style="color:rgb(206, 145, 120)">'0'</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)"> 10:00</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">section_id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">String</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(212, 212, 212)">%</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">30</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">xml_date </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%Y-%m-%d %H:%i'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createTimelineView</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_unit</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'day'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_date</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%j'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_step</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">x_size</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">28</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">y_unit</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> resources</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">y_property</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'section_id'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">render</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'bar'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2026</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'timeline'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">parse</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">events</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-relies-on-row-virtualization">DHTMLX Scheduler relies on row virtualization<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#dhtmlx-scheduler-relies-on-row-virtualization" class="hash-link" aria-label="Direct link to DHTMLX Scheduler relies on row virtualization" title="Direct link to DHTMLX Scheduler relies on row virtualization" translate="no">​</a></h3>
<p>The <strong>PRO</strong> edition includes smart rendering, which limits the DOM to only the rows currently visible in the viewport. The <strong>Standard</strong> edition does not include virtual scrolling, so it shows performance degradation at lower event and resource counts.</p>
<p>For moderate dataset sizes, meaning a few hundred events across a few dozen resources, the <strong>Standard</strong> edition is adequate. For larger datasets, smart rendering in the <strong>PRO</strong> edition is the primary mechanism for keeping the DOM manageable.</p>
<p>DHTMLX Scheduler uses row virtualization for large timelines, while Bryntum Scheduler virtualizes both rows and columns to keep larger DOM schedules responsive.</p>
<p>DHTMLX Scheduler does not provide a built-in lazy loading data manager comparable to the Bryntum CrudManager. Remote data loading requires custom implementation.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing-separates-gpl-and-pro-use">DHTMLX Scheduler pricing separates GPL and PRO use<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#dhtmlx-scheduler-pricing-separates-gpl-and-pro-use" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" title="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" translate="no">​</a></h3>
<p>DHTMLX Scheduler <strong>Standard</strong> is free for GPL-compatible open-source projects. Paid <strong>PRO</strong> licenses start with the <strong>Individual</strong> tier at $599, and DHTMLX lists <strong>Commercial</strong>, <strong>Enterprise</strong>, and <strong>Ultimate</strong> tiers for larger teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-prioritizes-timeline-features-over-lazy-loading">DHTMLX Scheduler prioritizes timeline features over lazy loading<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#dhtmlx-scheduler-prioritizes-timeline-features-over-lazy-loading" class="hash-link" aria-label="Direct link to DHTMLX Scheduler prioritizes timeline features over lazy loading" title="Direct link to DHTMLX Scheduler prioritizes timeline features over lazy loading" translate="no">​</a></h3>
<p>DHTMLX Scheduler has a few notable strengths.</p>
<ul>
<li class=""><strong>Standard</strong> edition is available at no cost for open-source use.</li>
<li class="">The timeline view in <strong>PRO</strong> covers most multi-resource scheduling requirements.</li>
<li class="">Smart rendering in <strong>PRO</strong> keeps visible rows bounded in the DOM.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-lacks-bryntum-style-lazy-loading-tools">DHTMLX Scheduler lacks Bryntum-style lazy loading tools<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#dhtmlx-scheduler-lacks-bryntum-style-lazy-loading-tools" class="hash-link" aria-label="Direct link to DHTMLX Scheduler lacks Bryntum-style lazy loading tools" title="Direct link to DHTMLX Scheduler lacks Bryntum-style lazy loading tools" translate="no">​</a></h3>
<p>Three limitations matter before committing to DHTMLX Scheduler.</p>
<ul>
<li class="">The timeline view, which is the most relevant view for resource scheduling, requires the <strong>PRO</strong> edition.</li>
<li class="">The <strong>Standard</strong> edition has no virtual scrolling and degrades at larger dataset sizes.</li>
<li class="">No built-in lazy loading manager for remote data.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler">DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#daypilot-scheduler" class="hash-link" aria-label="Direct link to DayPilot Scheduler" title="Direct link to DayPilot Scheduler" translate="no">​</a></h2>
<p>DayPilot Scheduler comes in a free <strong>Lite</strong> edition and a commercial <strong>Pro</strong> edition. The <strong>Lite</strong> edition handles modest event volumes well. For large resource lists and event counts, the <strong>Pro</strong> edition introduces virtual scrolling and on-demand row loading.</p>
<p><img decoding="async" loading="lazy" alt="DayPilot Scheduler with resource rows and event bars" src="https://www.react-gantt.com/assets/images/daypilot-scheduler-8f4d2eeaac9d614ff41ca4e03152ecbb.png" width="2880" height="1360" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-lite-setup-for-scheduler-prototyping">DayPilot Lite setup for scheduler prototyping<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#daypilot-lite-setup-for-scheduler-prototyping" class="hash-link" aria-label="Direct link to DayPilot Lite setup for scheduler prototyping" title="Direct link to DayPilot Lite setup for scheduler prototyping" translate="no">​</a></h3>
<p>Install the <strong>Lite</strong> edition from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @daypilot/daypilot-lite-javascript</span><br></div></code></pre></div></div>
<p>The example below creates a scheduler with 50 resources and 500 events. The <strong>Lite</strong> edition has a ceiling of a few hundred events before paint lag becomes noticeable during scrolling.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> DayPilot </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@daypilot/daypilot-lite-javascript'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> resources </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> Array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">Resource </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">R</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> events    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> Array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">length</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">500</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">text</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">Event </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">start</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">2026-01-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">String</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">Math</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">floor</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">/</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">50</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">%</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">28</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">padStart</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">2</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation string" style="color:rgb(206, 145, 120)">'0'</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">T09:00:00</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">end</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">2026-01-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">String</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">Math</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">floor</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">/</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">50</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">%</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">28</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">padStart</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">2</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation string" style="color:rgb(206, 145, 120)">'0'</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">T10:00:00</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">resource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">R</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">i </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">%</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">50</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation operator" style="color:rgb(212, 212, 212)">+</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> scheduler </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DayPilot</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token class-name" style="color:rgb(78, 201, 176)">Scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2026-01-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">days</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">28</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">scale</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Day'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> resources</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> events </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">scheduler</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-lite-covers-smaller-workflows">DayPilot Scheduler Lite covers smaller workflows<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#daypilot-scheduler-lite-covers-smaller-workflows" class="hash-link" aria-label="Direct link to DayPilot Scheduler Lite covers smaller workflows" title="Direct link to DayPilot Scheduler Lite covers smaller workflows" translate="no">​</a></h3>
<p>The <strong>Lite</strong> edition renders all events in the DOM without virtual scrolling. This works acceptably for small datasets but creates paint and layout overhead as event counts grow.</p>
<p>The <strong>Pro</strong> edition adds <code>virtualScrolling: true</code>, which removes rows outside the viewport from the DOM in the same pattern used by Bryntum and DHTMLX <strong>PRO</strong>. It also supports on-demand row loading, meaning resources and their events can be fetched from the server as the user scrolls rather than all at once on initial load. For large remote datasets where row count is high, this combination significantly reduces both initial load time and ongoing DOM overhead.</p>
<p>DayPilot <strong>Pro</strong> helps with row loading, but Bryntum Scheduler combines virtual scrolling with a richer scheduling data layer through CrudManager.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-moves-virtual-scrolling-into-paid-pro-tiers">DayPilot Scheduler moves virtual scrolling into paid Pro tiers<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#daypilot-scheduler-moves-virtual-scrolling-into-paid-pro-tiers" class="hash-link" aria-label="Direct link to DayPilot Scheduler moves virtual scrolling into paid Pro tiers" title="Direct link to DayPilot Scheduler moves virtual scrolling into paid Pro tiers" translate="no">​</a></h3>
<p>DayPilot <strong>Lite</strong> is free under the Apache License 2.0. DayPilot <strong>Pro</strong> for JavaScript starts at $649 for the <strong>Web Mini</strong> license, with larger <strong>Web Team</strong>, <strong>Web Office</strong>, <strong>SaaS</strong>, and <strong>OEM</strong> tiers available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pro-focuses-on-row-loading">DayPilot Scheduler Pro focuses on row loading<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#daypilot-scheduler-pro-focuses-on-row-loading" class="hash-link" aria-label="Direct link to DayPilot Scheduler Pro focuses on row loading" title="Direct link to DayPilot Scheduler Pro focuses on row loading" translate="no">​</a></h3>
<p>DayPilot Scheduler has three notable strengths.</p>
<ul>
<li class="">Free <strong>Lite</strong> edition is functional for smaller datasets and prototyping.</li>
<li class=""><strong>Pro</strong> adds virtual scrolling and on-demand row loading, addressing the main DOM bottlenecks for large resource lists.</li>
<li class="">Angular, React, and Vue integrations are available.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-lite-slows-down-beyond-smaller-datasets">DayPilot Scheduler Lite slows down beyond smaller datasets<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#daypilot-scheduler-lite-slows-down-beyond-smaller-datasets" class="hash-link" aria-label="Direct link to DayPilot Scheduler Lite slows down beyond smaller datasets" title="Direct link to DayPilot Scheduler Lite slows down beyond smaller datasets" translate="no">​</a></h3>
<p>Three limitations apply when evaluating DayPilot Scheduler for large datasets.</p>
<ul>
<li class="">Virtual scrolling requires the paid <strong>Pro</strong> edition.</li>
<li class="">The <strong>Lite</strong> edition degrades noticeably beyond a few hundred events.</li>
<li class="">Higher DayPilot tiers add cost for teams that need source code, more developers, or SaaS distribution.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se">Netronic VSW SE<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#netronic-vsw-se" class="hash-link" aria-label="Direct link to Netronic VSW SE" title="Direct link to Netronic VSW SE" translate="no">​</a></h2>
<p>Netronic VSW SE targets enterprise datasets using canvas-based rendering. Rather than creating DOM elements for each event, it writes directly to a <code>&lt;canvas&gt;</code> element, which removes DOM overhead entirely. This makes it practical for schedules with tens of thousands of simultaneously visible events, such as manufacturing plans or large logistics networks.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-setup-through-customer-portal-access">Netronic VSW SE setup through customer portal access<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#netronic-vsw-se-setup-through-customer-portal-access" class="hash-link" aria-label="Direct link to Netronic VSW SE setup through customer portal access" title="Direct link to Netronic VSW SE setup through customer portal access" translate="no">​</a></h3>
<p>VSW SE is not available on npm. Customers receive the library after purchase through the Netronic customer portal. Pricing is quote-based: contact Netronic directly for license terms.</p>
<p>Because no public package is available, there is no runnable code example here. The Netronic website provides integration documentation after purchase.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-uses-canvas-for-extreme-event-density">Netronic VSW SE uses canvas for extreme event density<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#netronic-vsw-se-uses-canvas-for-extreme-event-density" class="hash-link" aria-label="Direct link to Netronic VSW SE uses canvas for extreme event density" title="Direct link to Netronic VSW SE uses canvas for extreme event density" translate="no">​</a></h3>
<p>The canvas rendering model is the defining performance characteristic. Since events are pixels on a canvas rather than DOM nodes, the browser does not need to recalculate layout or dispatch events through a DOM tree for each event. The practical consequence is that VSW SE can render and animate tens of thousands of events at stable frame rates that DOM-based schedulers cannot match at the same scale.</p>
<p>Because it renders to canvas, VSW SE is framework-agnostic: it embeds wherever a <code>&lt;canvas&gt;</code> element can be placed, including React, Angular, Vue, and plain JavaScript projects. The tradeoff is accessibility. Screen readers cannot access canvas content without additional custom implementation, which adds work for teams with accessibility requirements.</p>
<p>Netronic VSW SE can push beyond DOM limits with canvas rendering, while Bryntum Scheduler keeps the schedule in the DOM for teams that still need framework flexibility and accessibility work.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-pricing-requires-a-sales-quote">Netronic VSW SE pricing requires a sales quote<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#netronic-vsw-se-pricing-requires-a-sales-quote" class="hash-link" aria-label="Direct link to Netronic VSW SE pricing requires a sales quote" title="Direct link to Netronic VSW SE pricing requires a sales quote" translate="no">​</a></h3>
<p>Pricing is quote-based. Contact Netronic directly for a license quote.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-avoids-dom-rendering-overhead">Netronic VSW SE avoids DOM rendering overhead<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#netronic-vsw-se-avoids-dom-rendering-overhead" class="hash-link" aria-label="Direct link to Netronic VSW SE avoids DOM rendering overhead" title="Direct link to Netronic VSW SE avoids DOM rendering overhead" translate="no">​</a></h3>
<p>Netronic VSW SE suits specific high-density use cases.</p>
<ul>
<li class="">Canvas rendering handles tens of thousands of simultaneously visible events without DOM overhead.</li>
<li class="">Framework-agnostic due to the canvas embedding model.</li>
<li class="">Suitable for manufacturing, logistics, and other domains with extremely dense schedules.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-trades-accessibility-and-npm-access-for-scale">Netronic VSW SE trades accessibility and npm access for scale<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#netronic-vsw-se-trades-accessibility-and-npm-access-for-scale" class="hash-link" aria-label="Direct link to Netronic VSW SE trades accessibility and npm access for scale" title="Direct link to Netronic VSW SE trades accessibility and npm access for scale" translate="no">​</a></h3>
<p>Three factors create friction in the evaluation and integration process.</p>
<ul>
<li class="">Not available on public npm. Requires purchase and customer portal access before integration.</li>
<li class="">Canvas content requires additional work to meet accessibility requirements.</li>
<li class="">No public pricing. Quote-based model adds friction to the evaluation process.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs">ScheduleJS<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#schedulejs" class="hash-link" aria-label="Direct link to ScheduleJS" title="Direct link to ScheduleJS" translate="no">​</a></h2>
<p>ScheduleJS takes an Angular-native, canvas-based approach to scheduling. Like Netronic VSW SE, it bypasses DOM rendering and paints events directly to a canvas, handling very large activity counts without frame rate degradation.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-setup-for-angular-only-canvas-scheduling">ScheduleJS setup for Angular-only canvas scheduling<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#schedulejs-setup-for-angular-only-canvas-scheduling" class="hash-link" aria-label="Direct link to ScheduleJS setup for Angular-only canvas scheduling" title="Direct link to ScheduleJS setup for Angular-only canvas scheduling" translate="no">​</a></h3>
<p>ScheduleJS is not available on public npm. It is distributed through a customer portal after licensing. Because it is Angular-specific, it is not usable in React, Vue, or plain JavaScript projects.</p>
<p>A license key is required before mounting the component:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">LicenseManager</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">setLicenseFromKey</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-key'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>For an example of the ScheduleJS component pattern in an Angular context, see the <a href="https://bryntum.com/blog/angular-gantt/" target="_blank" rel="noopener noreferrer" class="">Angular Gantt article</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-brings-canvas-scheduling-to-angular-applications">ScheduleJS brings canvas scheduling to Angular applications<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#schedulejs-brings-canvas-scheduling-to-angular-applications" class="hash-link" aria-label="Direct link to ScheduleJS brings canvas scheduling to Angular applications" title="Direct link to ScheduleJS brings canvas scheduling to Angular applications" translate="no">​</a></h3>
<p>ScheduleJS applies the same canvas rendering approach as VSW SE. Events are drawn as pixels rather than DOM nodes, so the browser layout engine is not involved in rendering the schedule. This allows ScheduleJS to display very large activity counts in Angular applications without the scroll lag that DOM-based renderers encounter at scale.</p>
<p>Because it is Angular-native, ScheduleJS integrates with Angular change detection and dependency injection, making data binding align with standard Angular patterns. However, this tight coupling means it cannot be used outside Angular.</p>
<p>ScheduleJS shares the canvas advantage for extreme density, but Bryntum Scheduler is the broader fit when the team needs React, Vue, Angular, and plain JavaScript support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-pricing-requires-a-licensed-download">ScheduleJS pricing requires a licensed download<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#schedulejs-pricing-requires-a-licensed-download" class="hash-link" aria-label="Direct link to ScheduleJS pricing requires a licensed download" title="Direct link to ScheduleJS pricing requires a licensed download" translate="no">​</a></h3>
<p>Pricing is quote-based. Contact the ScheduleJS team through their website for license terms.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-is-built-for-angular-only-scheduler-projects">ScheduleJS is built for Angular-only scheduler projects<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#schedulejs-is-built-for-angular-only-scheduler-projects" class="hash-link" aria-label="Direct link to ScheduleJS is built for Angular-only scheduler projects" title="Direct link to ScheduleJS is built for Angular-only scheduler projects" translate="no">​</a></h3>
<p>ScheduleJS offers two key advantages for Angular teams.</p>
<ul>
<li class="">Canvas rendering supports very large activity counts without DOM performance limits.</li>
<li class="">Angular-native integration aligns with Angular architecture and tooling.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-locks-large-dataset-scheduling-to-angular">ScheduleJS locks large-dataset scheduling to Angular<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#schedulejs-locks-large-dataset-scheduling-to-angular" class="hash-link" aria-label="Direct link to ScheduleJS locks large-dataset scheduling to Angular" title="Direct link to ScheduleJS locks large-dataset scheduling to Angular" translate="no">​</a></h3>
<p>Three limitations restrict when ScheduleJS is a practical choice.</p>
<ul>
<li class="">Angular-only: not available for React, Vue, or plain JavaScript.</li>
<li class="">Not available on public npm. Requires a licensed download.</li>
<li class="">No public pricing. Quote-based model requires direct vendor contact.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="which-javascript-scheduler-should-you-choose-for-large-datasets">Which JavaScript scheduler should you choose for large datasets?<a href="https://www.react-gantt.com/content/best-scheduler-components-for-large-datasets/#which-javascript-scheduler-should-you-choose-for-large-datasets" class="hash-link" aria-label="Direct link to Which JavaScript scheduler should you choose for large datasets?" title="Direct link to Which JavaScript scheduler should you choose for large datasets?" translate="no">​</a></h2>
<p>The table below summarizes the key characteristics of each scheduler.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Scheduler</th><th>DHTMLX Scheduler</th><th>DayPilot Scheduler</th><th>Netronic VSW SE</th><th>ScheduleJS</th></tr></thead><tbody><tr><td>Rendering approach</td><td>DOM</td><td>DOM</td><td>DOM</td><td>Canvas</td><td>Canvas</td></tr><tr><td>Virtual scrolling</td><td>Both axes</td><td>Rows only (<strong>PRO</strong>)</td><td>Rows (<strong>Pro</strong>)</td><td>Not applicable</td><td>Not applicable</td></tr><tr><td>Multi-resource assignment</td><td>Yes</td><td>Yes (<strong>PRO</strong>)</td><td>Yes (<strong>Pro</strong>)</td><td>Yes</td><td>Yes</td></tr><tr><td>Framework support</td><td>React, Angular, Vue, plain JavaScript</td><td>Framework-agnostic</td><td>React, Angular, Vue, plain JavaScript</td><td>Framework-agnostic</td><td>Angular only</td></tr><tr><td>Free tier</td><td>Trial package</td><td>GPL open source</td><td>Lite edition</td><td>No</td><td>No</td></tr></tbody></table></div>
<p>The table below maps common use cases to the most appropriate option.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Recommended option</th></tr></thead><tbody><tr><td>Up to a few thousand events, multi-framework team</td><td>Bryntum Scheduler</td></tr><tr><td>Open source project with moderate event volume</td><td>DHTMLX Scheduler Standard</td></tr><tr><td>Medium-scale Angular application</td><td>DayPilot Pro or Bryntum Scheduler</td></tr><tr><td>Tens of thousands of simultaneously visible events</td><td>Netronic VSW SE or ScheduleJS</td></tr></tbody></table></div>
<p>For most web applications that need multi-resource scheduling with thousands of events, the DOM-based options cover the requirement. Bryntum Scheduler provides the most complete feature set in that category, with two-axis virtual scrolling, built-in data management via CrudManager, and framework wrappers that share a single codebase.</p>
<p>When the event count reaches tens of thousands of simultaneously visible items, as is common in manufacturing execution systems, large logistics networks, and resource-heavy project portfolios, canvas-based rendering becomes necessary. Netronic VSW SE is the more flexible option in that tier because it is framework-agnostic. ScheduleJS is appropriate for Angular-specific projects where the native integration and change detection alignment are worth the framework constraint.</p>
<p>For projects at the boundary between DOM and canvas requirements, profiling the actual dataset shape in the target browser is the most reliable guide. Virtual scrolling handles large total row counts well, but when a single viewport must display many thousands of events simultaneously without scrolling, canvas rendering is the appropriate tool.</p>]]></content:encoded>
            <category>scheduler</category>
        </item>
        <item>
            <title><![CDATA[Best Vue calendar components]]></title>
            <link>https://www.react-gantt.com/content/best-vue-calendar-components/</link>
            <guid>https://www.react-gantt.com/content/best-vue-calendar-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When choosing a calendar component for Vue, we need to know whether the library can handle appointment workflows, not just date selection.]]></description>
            <content:encoded><![CDATA[<p>When choosing a calendar component for Vue, we need to know whether the library can handle appointment workflows, not just date selection. In this article, a calendar means day, week, and month views where users create, edit, and move events. For a broader comparison across frameworks, our <a href="https://bryntum.com/blog/best-javascript-calendar-components/" target="_blank" rel="noopener noreferrer" class="">best JavaScript calendar components</a> article covers more options.</p>
<p>This article compares five Vue calendar components using the criteria below.</p>
<ul>
<li class="">Vue integration model.</li>
<li class="">Calendar views and editing behavior.</li>
<li class="">Resource scheduling and recurrence.</li>
<li class="">Pricing and license tiers.</li>
<li class="">When Bryntum Calendar is the stronger production option.</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar">Bryntum Calendar<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#bryntum-calendar" class="hash-link" aria-label="Direct link to Bryntum Calendar" title="Direct link to Bryntum Calendar" translate="no">​</a></h2>
<p>Bryntum Calendar ships a dedicated Vue 3 wrapper package so integration feels native rather than bolted on. It focuses on performance and extensibility as a fully featured commercial component. The <a href="https://bryntum.com/products/calendar/docs/guide/Calendar/gettingstarted/api/integration-vue" target="_blank" rel="noopener noreferrer" class="">Bryntum Calendar Vue quick start</a> covers the full setup path.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Calendar showing a week view with multiple events" src="https://www.react-gantt.com/assets/images/bryntum-calendar-70dce206121152f0d903196195e93e01.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-setup-with-vue-3">Bryntum Calendar setup with Vue 3<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#bryntum-calendar-setup-with-vue-3" class="hash-link" aria-label="Direct link to Bryntum Calendar setup with Vue 3" title="Direct link to Bryntum Calendar setup with Vue 3" translate="no">​</a></h3>
<p>Bryntum Calendar uses a private npm registry. Install the trial package alongside the Vue 3 wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar@npm:@bryntum/calendar-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/calendar-vue-3@7.3.0</span><br></div></code></pre></div></div>
<p>Import the CSS files in <code>main.js</code>. The order matters: Font Awesome base styles must come before the icon subset, and the theme file must come after the component styles so theme variables override defaults correctly.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/calendar.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/calendar/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Then use the <code>BryntumCalendar</code> component in your <code>App.vue</code>:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;bryntum-calendar v-bind="calendarConfig" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { BryntumCalendar } from '@bryntum/calendar-vue-3';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const calendarConfig = ref({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    date      : '2025-10-12',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    resources : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 'bryntum', name : 'Bryntum team',     eventColor : 'blue' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 'hotel',   name : 'Hotel Park',       eventColor : 'orange' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 'michael', name : 'Michael Johnson', eventColor : 'deep-orange' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events    : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 1, name : 'Hackathon 2025',                       startDate : '2025-10-11T14:00:00', endDate : '2025-10-18T12:00:00', allDay : true, resourceId : 'bryntum', eventColor : 'green' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 2, name : 'Breakfast',                            startDate : '2025-10-12T09:00:00', endDate : '2025-10-12T10:00:00', resourceId : 'hotel' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 3, name : 'Team Scrum',                           startDate : '2025-10-12T10:00:00', endDate : '2025-10-12T12:00:00', resourceId : 'bryntum' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 4, name : 'Scheduler Grid introduction + review', startDate : '2025-10-12T12:00:00', endDate : '2025-10-12T14:00:00', resourceId : 'bryntum' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-gives-vue-apps-built-in-resource-scheduling">Bryntum Calendar gives Vue apps built-in resource scheduling<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#bryntum-calendar-gives-vue-apps-built-in-resource-scheduling" class="hash-link" aria-label="Direct link to Bryntum Calendar gives Vue apps built-in resource scheduling" title="Direct link to Bryntum Calendar gives Vue apps built-in resource scheduling" translate="no">​</a></h3>
<p>Bryntum Calendar provides a complete set of scheduling features.</p>
<ul>
<li class=""><strong>Day, week, month, year, and agenda views</strong> out of the box without plugins.</li>
<li class=""><strong>RFC 5545 RRULE recurring events</strong> so weekday recurrence rules work without custom parsing logic.</li>
<li class=""><strong>Drag-and-drop</strong> for both moving and resizing events.</li>
<li class=""><strong>Resource calendar view</strong> to display multiple people or rooms side by side.</li>
<li class=""><strong>Ten built-in themes</strong>, including dark mode options, with support for custom themes.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-starts-with-the-small-team-license">Bryntum Calendar starts with the Small Team license<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#bryntum-calendar-starts-with-the-small-team-license" class="hash-link" aria-label="Direct link to Bryntum Calendar starts with the Small Team license" title="Direct link to Bryntum Calendar starts with the Small Team license" translate="no">​</a></h3>
<p>Bryntum Calendar costs $680 per developer for the <strong>Small Team</strong> license, with a three-developer minimum and 12 months of updates. A free trial is available through the npm trial package used in the install step above.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-brings-advanced-scheduling-features-to-vue">Bryntum Calendar brings advanced scheduling features to Vue<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#bryntum-calendar-brings-advanced-scheduling-features-to-vue" class="hash-link" aria-label="Direct link to Bryntum Calendar brings advanced scheduling features to Vue" title="Direct link to Bryntum Calendar brings advanced scheduling features to Vue" translate="no">​</a></h3>
<p>Bryntum Calendar stands out in five areas.</p>
<ul>
<li class="">Native Vue 3 wrapper with full TypeScript support.</li>
<li class="">RFC 5545 RRULE recurring events built in.</li>
<li class="">Resource calendar included in the base product.</li>
<li class="">Ten themes, including dark mode options.</li>
<li class="">Active commercial support and long release history.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-calendar-adds-commercial-cost-and-configuration-depth">Bryntum Calendar adds commercial cost and configuration depth<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#bryntum-calendar-adds-commercial-cost-and-configuration-depth" class="hash-link" aria-label="Direct link to Bryntum Calendar adds commercial cost and configuration depth" title="Direct link to Bryntum Calendar adds commercial cost and configuration depth" translate="no">​</a></h3>
<p>Two limitations apply when evaluating Bryntum Calendar.</p>
<ul>
<li class="">Commercial license required, making it unsuitable for open-source projects with GPL-incompatible constraints.</li>
<li class="">Broader configuration surface means a steeper learning curve compared to simpler libraries.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar">FullCalendar<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#fullcalendar" class="hash-link" aria-label="Direct link to FullCalendar" title="Direct link to FullCalendar" translate="no">​</a></h2>
<p>FullCalendar has the widest adoption of any open-source calendar library in the JavaScript ecosystem. The core is MIT-licensed, and premium plugins add resource views for teams that need them.</p>
<p><img decoding="async" loading="lazy" alt="FullCalendar showing a month view with events" src="https://www.react-gantt.com/assets/images/fullcalendar-f424f641430ab0ee0ea9a350d153db7b.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-setup-with-vue-3-plugins">FullCalendar setup with Vue 3 plugins<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#fullcalendar-setup-with-vue-3-plugins" class="hash-link" aria-label="Direct link to FullCalendar setup with Vue 3 plugins" title="Direct link to FullCalendar setup with Vue 3 plugins" translate="no">​</a></h3>
<p>Install the Vue 3 component and the plugins you need:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @fullcalendar/vue3 @fullcalendar/core @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/list @fullcalendar/interaction @fullcalendar/rrule</span><br></div></code></pre></div></div>
<p>Then wire everything up in <code>App.vue</code>:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;FullCalendar :options="calendarOptions" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import FullCalendar from '@fullcalendar/vue3';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import dayGridPlugin from '@fullcalendar/daygrid';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import timeGridPlugin from '@fullcalendar/timegrid';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import listPlugin from '@fullcalendar/list';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import interactionPlugin from '@fullcalendar/interaction';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import rrulePlugin from '@fullcalendar/rrule';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const calendarOptions = {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    plugins      : [dayGridPlugin, timeGridPlugin, listPlugin, interactionPlugin, rrulePlugin],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    initialView  : 'dayGridMonth',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    headerToolbar : { left : 'prev,next today', center : 'title', right : 'dayGridMonth,timeGridWeek,listWeek' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    editable   : true,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    selectable : true,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events     : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { title : 'Team standup', rrule : { freq : 'weekly', byweekday : ['mo','tu','we','th','fr'], dtstart : '2026-01-15T09:00:00' }, duration : '00:30' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { title : 'Sprint review', start : '2026-01-16T14:00:00', end : '2026-01-16T15:00:00' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">};</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-covers-vue-calendars-without-resource-views">FullCalendar covers Vue calendars without resource views<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#fullcalendar-covers-vue-calendars-without-resource-views" class="hash-link" aria-label="Direct link to FullCalendar covers Vue calendars without resource views" title="Direct link to FullCalendar covers Vue calendars without resource views" translate="no">​</a></h3>
<p>FullCalendar covers day, week, month, and list views through its plugin architecture. The rrule plugin adds recurring event support using standard RRULE syntax. The interaction plugin handles drag-and-drop and click-to-select. The premium resource timeline and resource day grid plugins add side-by-side resource views for team scheduling, though these require a separate commercial license. The plugin model keeps bundle size lean, since only the views in use are shipped.</p>
<p>FullCalendar has the broader free ecosystem, but Bryntum Calendar includes the resource scheduling features Vue teams otherwise need <strong>Premium</strong> plugins to unlock.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-keeps-core-views-free-and-charges-for-premium-resources">FullCalendar keeps core views free and charges for Premium resources<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#fullcalendar-keeps-core-views-free-and-charges-for-premium-resources" class="hash-link" aria-label="Direct link to FullCalendar keeps core views free and charges for Premium resources" title="Direct link to FullCalendar keeps core views free and charges for Premium resources" translate="no">​</a></h3>
<p>The core FullCalendar library and its standard plugins are MIT-licensed and free. <strong>FullCalendar Premium</strong>, which includes resource timeline, resource day grid, and resource time grid plugins, starts at $480 per year.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-gives-vue-teams-a-mature-free-core">FullCalendar gives Vue teams a mature free core<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#fullcalendar-gives-vue-teams-a-mature-free-core" class="hash-link" aria-label="Direct link to FullCalendar gives Vue teams a mature free core" title="Direct link to FullCalendar gives Vue teams a mature free core" translate="no">​</a></h3>
<p>FullCalendar has five clear advantages.</p>
<ul>
<li class="">MIT core is free for any project type.</li>
<li class="">Large community with extensive Stack Overflow coverage.</li>
<li class="">Plugin architecture keeps bundle size small.</li>
<li class="">The rrule plugin for recurring events is well-documented.</li>
<li class="">Official Vue 3 wrapper maintained by the FullCalendar team.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="fullcalendar-needs-extra-plugins-and-custom-styling">FullCalendar needs extra plugins and custom styling<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#fullcalendar-needs-extra-plugins-and-custom-styling" class="hash-link" aria-label="Direct link to FullCalendar needs extra plugins and custom styling" title="Direct link to FullCalendar needs extra plugins and custom styling" translate="no">​</a></h3>
<p>Four limitations come with FullCalendar.</p>
<ul>
<li class="">Resource calendar requires a paid premium license.</li>
<li class="">Each view is a separate npm package, which adds installation overhead.</li>
<li class="">Default styling is minimal and requires CSS work to match most design systems.</li>
<li class="">No built-in dark mode theme.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x">Schedule-X<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#schedule-x" class="hash-link" aria-label="Direct link to Schedule-X" title="Direct link to Schedule-X" translate="no">​</a></h2>
<p>Schedule-X takes a TypeScript-first approach built around a plugin architecture. It is MIT-licensed and works with Vue, React, and plain JavaScript through framework-specific wrappers.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-setup-with-its-vue-adapter">Schedule-X setup with its Vue adapter<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#schedule-x-setup-with-its-vue-adapter" class="hash-link" aria-label="Direct link to Schedule-X setup with its Vue adapter" title="Direct link to Schedule-X setup with its Vue adapter" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @schedule-x/vue @schedule-x/calendar @schedule-x/theme-default @schedule-x/event-recurrence</span><br></div></code></pre></div></div>
<p>Create the calendar instance and pass it to the component:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;ScheduleXCalendar :calendar-app="calendar" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ScheduleXCalendar } from '@schedule-x/vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { createCalendar, createViewWeek, createViewMonthGrid } from '@schedule-x/calendar';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { createEventRecurrencePlugin } from '@schedule-x/event-recurrence';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import '@schedule-x/theme-default/dist/index.css';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const calendar = createCalendar({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    views   : [createViewWeek(), createViewMonthGrid()],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events  : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : '1', title : 'Team standup',  start : '2026-01-15 09:00', end : '2026-01-15 09:30' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : '2', title : 'Sprint review', start : '2026-01-16 14:00', end : '2026-01-16 15:00' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    plugins : [createEventRecurrencePlugin()]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-gives-vue-teams-a-typescript-first-calendar-core">Schedule-X gives Vue teams a TypeScript-first calendar core<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#schedule-x-gives-vue-teams-a-typescript-first-calendar-core" class="hash-link" aria-label="Direct link to Schedule-X gives Vue teams a TypeScript-first calendar core" title="Direct link to Schedule-X gives Vue teams a TypeScript-first calendar core" translate="no">​</a></h3>
<p>Schedule-X ships week and month grid views, with day and month agenda views also available. The recurrence plugin handles recurring events. The default theme supports dark mode through a CSS class toggle. The library is written in TypeScript throughout, so type definitions are accurate and IDE autocomplete works well. Drag-and-drop and resource view require Schedule-X <strong>Premium</strong> plugins.</p>
<p>Schedule-X gives Vue teams a lighter TypeScript-first calendar, while Bryntum Calendar gives them more built-in scheduling depth.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-pricing-separates-free-core-and-premium-plugins">Schedule-X pricing separates free core and Premium plugins<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#schedule-x-pricing-separates-free-core-and-premium-plugins" class="hash-link" aria-label="Direct link to Schedule-X pricing separates free core and Premium plugins" title="Direct link to Schedule-X pricing separates free core and Premium plugins" translate="no">​</a></h3>
<p>Schedule-X core is MIT-licensed and free. <strong>Premium</strong> plugins, including resource view, drag-and-drop, drag-to-create, and event forms, require a paid Schedule-X <strong>Premium</strong> license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-keeps-vue-calendars-typed-and-modular">Schedule-X keeps Vue calendars typed and modular<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#schedule-x-keeps-vue-calendars-typed-and-modular" class="hash-link" aria-label="Direct link to Schedule-X keeps Vue calendars typed and modular" title="Direct link to Schedule-X keeps Vue calendars typed and modular" translate="no">​</a></h3>
<p>Schedule-X suits TypeScript-first teams for several reasons.</p>
<ul>
<li class="">MIT-licensed with no commercial restrictions.</li>
<li class="">TypeScript-first with accurate type definitions.</li>
<li class="">Dark mode included in the default theme.</li>
<li class="">Lightweight and tree-shakeable plugin architecture.</li>
<li class="">Actively developed with modern API design.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedule-x-falls-short-when-resource-views-are-required">Schedule-X falls short when resource views are required<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#schedule-x-falls-short-when-resource-views-are-required" class="hash-link" aria-label="Direct link to Schedule-X falls short when resource views are required" title="Direct link to Schedule-X falls short when resource views are required" translate="no">​</a></h3>
<p>Four limitations restrict Schedule-X for some projects.</p>
<ul>
<li class="">No resource calendar view.</li>
<li class="">Smaller community than FullCalendar, so fewer third-party examples.</li>
<li class="">Drag-and-drop requires an additional plugin and is less mature than competing libraries.</li>
<li class="">Fewer built-in views compared to Bryntum or FullCalendar.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p>DHTMLX Scheduler predates modern component frameworks and has accumulated a broad feature set over many years. The Vue integration uses a small wrapper around the scheduler instance rather than a declarative component model.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler showing a week view" src="https://www.react-gantt.com/assets/images/dhtmlx-calendar-0fd1d8cd7c8d49686435e42b25656815.png" width="2880" height="1564" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-setup-with-vue-lifecycle-hooks">DHTMLX Scheduler setup with Vue lifecycle hooks<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#dhtmlx-scheduler-setup-with-vue-lifecycle-hooks" class="hash-link" aria-label="Direct link to DHTMLX Scheduler setup with Vue lifecycle hooks" title="Direct link to DHTMLX Scheduler setup with Vue lifecycle hooks" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>The public package can be initialized against a DOM element in <code>onMounted</code> and torn down in <code>onBeforeUnmount</code>:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;div ref="containerRef" style="width: 100%; height: 100vh;" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref, onMounted, onBeforeUnmount } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import 'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import scheduler from 'dhtmlx-scheduler';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const containerRef = ref(null);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">onMounted(() =&gt; {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.config.xml_date = '%Y-%m-%d %H:%i';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.init(containerRef.value, new Date(2026, 0, 15), 'month');</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.parse([</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 1, text : 'Team standup',  start_date : '2026-01-15 09:00', end_date : '2026-01-15 09:30' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 2, text : 'Sprint review', start_date : '2026-01-16 14:00', end_date : '2026-01-16 15:00' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">onBeforeUnmount(() =&gt; { scheduler.destructor(); });</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-requires-imperative-setup-in-vue">DHTMLX Scheduler requires imperative setup in Vue<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#dhtmlx-scheduler-requires-imperative-setup-in-vue" class="hash-link" aria-label="Direct link to DHTMLX Scheduler requires imperative setup in Vue" title="Direct link to DHTMLX Scheduler requires imperative setup in Vue" translate="no">​</a></h3>
<p>DHTMLX Scheduler covers day, week, month, year, and agenda views, plus a timeline view for resource scheduling in the <strong>PRO</strong> edition. Recurring events follow a custom DHTMLX format rather than RFC 5545, which can complicate interoperability with other calendar systems. Drag-and-drop is built in. The library has a long track record in enterprise deployments and extensive documentation accumulated over many years.</p>
<p>DHTMLX Scheduler brings mature views, but Bryntum Calendar fits Vue's component model more naturally through its Vue 3 wrapper.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing-separates-gpl-and-pro-use">DHTMLX Scheduler pricing separates GPL and PRO use<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#dhtmlx-scheduler-pricing-separates-gpl-and-pro-use" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" title="Direct link to DHTMLX Scheduler pricing separates GPL and PRO use" translate="no">​</a></h3>
<p>DHTMLX Scheduler <strong>Standard</strong> is free for GPL-compatible open-source projects. Paid <strong>PRO</strong> licenses start with the <strong>Individual</strong> tier at $599, and DHTMLX lists <strong>Commercial</strong>, <strong>Enterprise</strong>, and <strong>Ultimate</strong> tiers for larger teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-brings-mature-scheduler-views-to-vue">DHTMLX Scheduler brings mature scheduler views to Vue<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#dhtmlx-scheduler-brings-mature-scheduler-views-to-vue" class="hash-link" aria-label="Direct link to DHTMLX Scheduler brings mature scheduler views to Vue" title="Direct link to DHTMLX Scheduler brings mature scheduler views to Vue" translate="no">​</a></h3>
<p>DHTMLX Scheduler has four notable strengths.</p>
<ul>
<li class="">Proven in large-scale enterprise deployments.</li>
<li class="">Wide range of built-in views including timeline.</li>
<li class="">Perpetual license available.</li>
<li class="">Comprehensive documentation and a large archive of examples.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-does-not-fit-vues-declarative-model-cleanly">DHTMLX Scheduler does not fit Vue's declarative model cleanly<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#dhtmlx-scheduler-does-not-fit-vues-declarative-model-cleanly" class="hash-link" aria-label="Direct link to DHTMLX Scheduler does not fit Vue's declarative model cleanly" title="Direct link to DHTMLX Scheduler does not fit Vue's declarative model cleanly" translate="no">​</a></h3>
<p>Four drawbacks apply when using DHTMLX Scheduler in a Vue project.</p>
<ul>
<li class="">The public package uses manual DOM initialization, which does not fit the Vue declarative style well.</li>
<li class="">Global singleton architecture causes issues in multi-instance or SSR scenarios.</li>
<li class="">Recurring events use a proprietary format rather than RFC 5545.</li>
<li class="">UI looks dated compared to newer libraries without custom theming.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p>Mobiscroll prioritizes mobile-first design, with touch interactions and responsive layouts as primary design goals. It ships a dedicated Vue package with components for its event calendar, scheduler, and timeline views.</p>
<p><img decoding="async" loading="lazy" alt="Mobiscroll Event Calendar showing a week view" src="https://www.react-gantt.com/assets/images/mobiscroll-calendar-cd4f3cb5356370346e5d25e1de657bbe.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-setup-with-vue">Mobiscroll Event Calendar setup with Vue<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#mobiscroll-event-calendar-setup-with-vue" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar setup with Vue" title="Direct link to Mobiscroll Event Calendar setup with Vue" translate="no">​</a></h3>
<p>Configure the Mobiscroll private npm registry before installing the Vue package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/vue</span><br></div></code></pre></div></div>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;mbsc-eventcalendar :data="events" :view="myView" :drag-to-move="true" :drag-to-create="true" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { MbscEventcalendar } from '@mobiscroll/vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import '@mobiscroll/vue/dist/css/mobiscroll.min.css';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const events = ref([</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { id : 1, title : 'Team standup',  start : '2026-01-15T09:00:00', end : '2026-01-15T09:30:00', recurring : { repeat : 'weekly', weekDays : 'MO,TU,WE,TH,FR' } },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { id : 2, title : 'Sprint review', start : '2026-01-16T14:00:00', end : '2026-01-16T15:00:00' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const myView = { calendar : { type : 'week', popover : true } };</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-targets-mobile-first-vue-calendars">Mobiscroll Event Calendar targets mobile-first Vue calendars<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#mobiscroll-event-calendar-targets-mobile-first-vue-calendars" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar targets mobile-first Vue calendars" title="Direct link to Mobiscroll Event Calendar targets mobile-first Vue calendars" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar covers month, week, and day views alongside an agenda view and a schedule grid. Recurring events use a Mobiscroll-specific recurrence object rather than RFC 5545. The format is documented and covers common patterns. Props enable drag-and-drop for both moving and creating events. The component renders well on small screens. The same package includes a resource scheduler and timeline view as separate Mobiscroll components.</p>
<p>Mobiscroll is better suited to mobile-heavy Vue apps, while Bryntum Calendar is better suited to production scheduling apps with resource calendars.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-starts-with-an-internal-project-license">Mobiscroll Event Calendar starts with an internal project license<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#mobiscroll-event-calendar-starts-with-an-internal-project-license" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar starts with an internal project license" title="Direct link to Mobiscroll Event Calendar starts with an internal project license" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 for a single internal project as a perpetual license. The <strong>Complete</strong> internal project license starts at $1,955 and adds the full product set, source code, and priority support.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-prioritizes-touch-ux">Mobiscroll Event Calendar prioritizes touch UX<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#mobiscroll-event-calendar-prioritizes-touch-ux" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar prioritizes touch UX" title="Direct link to Mobiscroll Event Calendar prioritizes touch UX" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar is a strong fit for mobile-first Vue projects.</p>
<ul>
<li class="">Excellent mobile and touch experience.</li>
<li class="">Strong accessibility support.</li>
<li class="">Native Vue component with clean prop-based API.</li>
<li class="">The <strong>Complete</strong> internal project license includes the full Mobiscroll product set.</li>
<li class="">Built-in themes including dark mode.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-has-less-depth-for-advanced-customization">Mobiscroll Event Calendar has less depth for advanced customization<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#mobiscroll-event-calendar-has-less-depth-for-advanced-customization" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar has less depth for advanced customization" title="Direct link to Mobiscroll Event Calendar has less depth for advanced customization" translate="no">​</a></h3>
<p>Four limitations apply before choosing Mobiscroll.</p>
<ul>
<li class="">Multi-project product teams need a higher tier or a SaaS license.</li>
<li class="">Recurring events use a proprietary format rather than RFC 5545.</li>
<li class="">Community is smaller than FullCalendar.</li>
<li class="">Less documentation depth for advanced customization scenarios.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="which-vue-calendar-component-should-you-choose">Which Vue calendar component should you choose?<a href="https://www.react-gantt.com/content/best-vue-calendar-components/#which-vue-calendar-component-should-you-choose" class="hash-link" aria-label="Direct link to Which Vue calendar component should you choose?" title="Direct link to Which Vue calendar component should you choose?" translate="no">​</a></h2>
<p>The table below summarizes how each library compares across the features that matter most for calendar applications.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Calendar</th><th>FullCalendar</th><th>Schedule-X</th><th>DHTMLX Scheduler</th><th>Mobiscroll</th></tr></thead><tbody><tr><td>Day/week/month views</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Recurring events</td><td>RFC 5545</td><td>RFC 5545 (plugin)</td><td>Plugin</td><td>Proprietary</td><td>Proprietary</td></tr><tr><td>Drag-and-drop</td><td>Built in</td><td>Plugin</td><td>Plugin</td><td>Built in</td><td>Built in</td></tr><tr><td>Resource calendar</td><td>Built in</td><td><strong>Premium</strong> ($480/yr)</td><td>No</td><td><strong>PRO</strong> license</td><td>Separate component</td></tr><tr><td>Dark mode</td><td>Yes (10 themes)</td><td>No</td><td>Yes</td><td>No</td><td>Yes</td></tr><tr><td>Vue 3 native wrapper</td><td>Yes</td><td>Yes</td><td>Yes</td><td>No</td><td>Yes</td></tr><tr><td>Free / open-source</td><td>No</td><td>Core only</td><td>Yes</td><td>GPL only</td><td>No</td></tr></tbody></table></div>
<p>The table below matches common use cases to the library most likely to fit.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Recommended library</th></tr></thead><tbody><tr><td>Enterprise app with resource scheduling and commercial support</td><td>Bryntum Calendar</td></tr><tr><td>Open-source project needing a free, standards-based calendar</td><td>FullCalendar (core) or Schedule-X</td></tr><tr><td>Mobile-first app where touch and accessibility are priorities</td><td>Mobiscroll Event Calendar</td></tr><tr><td>Legacy application already using DHTMLX products</td><td>DHTMLX Scheduler</td></tr></tbody></table></div>
<p>For teams starting a new Vue 3 project that need a production-ready calendar with resource views, recurring events, and long-term vendor support, Bryntum Calendar is the strongest all-round choice. The native Vue 3 wrapper, RFC 5545 compliance, and 10 built-in themes reduce the amount of custom work needed to reach a polished result.</p>
<p>For teams with open-source licensing requirements, FullCalendar is the most mature free option. Its large community means answers to common questions are readily available, and the plugin architecture keeps the initial bundle lean. Schedule-X is worth considering if TypeScript support and modern API design are priorities and resource views are not required.</p>
<p>Mobiscroll stands out for teams building calendar experiences that need to work well on phones and tablets, where its touch handling and accessibility story are genuinely stronger than the alternatives. DHTMLX Scheduler remains a reasonable choice only when a project is already tied to the DHTMLX ecosystem, since its imperative initialization model does not fit naturally into Vue applications.</p>]]></content:encoded>
            <category>calendar</category>
        </item>
        <item>
            <title><![CDATA[Best Vue Gantt chart components]]></title>
            <link>https://www.react-gantt.com/content/best-vue-gantt-chart-components/</link>
            <guid>https://www.react-gantt.com/content/best-vue-gantt-chart-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Choosing a Gantt chart library for a Vue project involves trade offs between scheduling power, Vue integration, licensing, and cost.]]></description>
            <content:encoded><![CDATA[<p>Choosing a Gantt chart library for a Vue project involves trade-offs between scheduling power, Vue integration, licensing, and cost. This comparison covers five options: Bryntum Gantt, DHTMLX Gantt, Syncfusion Gantt, DayPilot Gantt, and vue-ganttastic.</p>
<p>The comparison uses these criteria: native Vue support, installation, scheduling logic, export support, production pricing, and practical trade-offs. If you are evaluating Gantt libraries more broadly and are not tied to Vue, see our article on the <a class="" href="https://www.react-gantt.com/content/best-javascript-gantt-chart-components-enterprise/">best JavaScript Gantt chart libraries</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt">Bryntum Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#bryntum-gantt" class="hash-link" aria-label="Direct link to Bryntum Gantt" title="Direct link to Bryntum Gantt" translate="no">​</a></h2>
<p>Bryntum Gantt is a commercial Gantt component built on ChronoGraph, Bryntum's open-source reactive scheduling engine. It ships a native Vue 3 wrapper package alongside the core library, so you do not need to manage a DOM ref or call imperative initialization code.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-gantt">Getting started with Bryntum Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#getting-started-with-bryntum-gantt" class="hash-link" aria-label="Direct link to Getting started with Bryntum Gantt" title="Direct link to Getting started with Bryntum Gantt" translate="no">​</a></h3>
<p>Install the trial package from npm. Bryntum uses a scoped alias to serve the trial build from the same package name, so your import paths stay the same when you move to a licensed build.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt@npm:@bryntum/gantt-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt-vue-3@7.3.0</span><br></div></code></pre></div></div>
<p>Import the required CSS files in <code>main.js</code> or <code>App.vue</code>. The order matters because each file builds on the previous one.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/gantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Then use the <code>BryntumGantt</code> component with a <code>ganttConfig</code> object passed through <code>v-bind</code>. All project data belongs inside the <code>project</code> property of that config object. Never mix the <code>project</code> prop with separate inline data props (<code>tasks</code>, <code>dependencies</code>, <code>resources</code>) on <code>BryntumGantt</code>, because the engine will not reconcile them correctly.</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;bryntum-gantt v-bind="ganttConfig" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { BryntumGantt } from '@bryntum/gantt-vue-3';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const ganttConfig = ref({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    columns : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { type : 'name',        width : 250 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { type : 'duration',    width : 80  },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { type : 'percentdone', width : 60  }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    project : {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      startDate : '2025-01-14',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      tasks : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              id : 1000, name : 'Launch SaaS Product', expanded : true, percentDone : 35.7,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              children : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  { id : 11, name : 'Install Apache',      startDate : '2025-01-14', duration : 3, percentDone : 50 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  { id : 12, name : 'Configure firewall', startDate : '2025-01-14', duration : 3, percentDone : 50 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                  { id : 15, name : 'Run tests',          startDate : '2025-01-21', duration : 2, percentDone : 0 }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">              ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      dependencies : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          { fromTask : 11, toTask : 15, lag : 2 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          { fromTask : 12, toTask : 15 }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-627cdc5a5d97c6a596d5b811f1dc7b71.png" width="2880" height="1562" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-features">Bryntum Gantt features<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#bryntum-gantt-features" class="hash-link" aria-label="Direct link to Bryntum Gantt features" title="Direct link to Bryntum Gantt features" translate="no">​</a></h3>
<p>The ChronoGraph engine handles auto-scheduling, so changing one task's duration or dates propagates constraints automatically through dependency links. Critical path highlighting, resource management with leveling, task baselines, split tasks, and undo/redo are all included in the base package. Client-side export covers PDF, PNG, Excel, ICS, and MS Project XML without requiring a server component. The component ships with 10 built-in themes and 45 locale files. Bryntum also provides an MCP server and a Claude Code skill, which means AI-assisted development workflows can read the API documentation and generate code directly.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-pricing">Bryntum Gantt pricing<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#bryntum-gantt-pricing" class="hash-link" aria-label="Direct link to Bryntum Gantt pricing" title="Direct link to Bryntum Gantt pricing" translate="no">​</a></h3>
<p>A single-developer perpetual license costs $940 and includes 12 months of updates. After the update period, you keep the version you have but no longer receive new releases. A free trial is available at <a href="https://bryntum.com/download/?product=gantt" target="_blank" rel="noopener noreferrer" class="">https://bryntum.com/download/?product=gantt</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-gantt">Pros of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#pros-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Pros of Bryntum Gantt" title="Direct link to Pros of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">Native Vue 3 wrapper with no manual DOM initialization</li>
<li class="">Full scheduling engine with auto-scheduling and critical path included in the base license</li>
<li class="">Export, baselines, and resource management ship in a single package with no add-on fees</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-gantt">Cons of Bryntum Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#cons-of-bryntum-gantt" class="hash-link" aria-label="Direct link to Cons of Bryntum Gantt" title="Direct link to Cons of Bryntum Gantt" translate="no">​</a></h3>
<ul>
<li class="">No free tier beyond the trial build</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt">DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#dhtmlx-gantt" class="hash-link" aria-label="Direct link to DHTMLX Gantt" title="Direct link to DHTMLX Gantt" translate="no">​</a></h2>
<p>DHTMLX Gantt is a mature JavaScript library with a long production history. It does not ship an official Vue wrapper, so you initialize it imperatively inside <code>onMounted</code> and clean up with <code>clearAll</code> on unmount.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-gantt">Getting started with DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#getting-started-with-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Gantt" title="Direct link to Getting started with DHTMLX Gantt" translate="no">​</a></h3>
<p>Install the library from npm.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-gantt@9.1.4</span><br></div></code></pre></div></div>
<p>Create a wrapper component that holds a container div and calls the DHTMLX initialization API inside a Vue lifecycle hook.</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;div ref="ganttContainer" style="width: 100%; height: 500px;"&gt;&lt;/div&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref, onMounted, onBeforeUnmount } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { gantt } from 'dhtmlx-gantt';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import 'dhtmlx-gantt/codebase/dhtmlxgantt.css';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const ganttContainer = ref(null);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const tasks = {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    data  : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 1, text : 'Phase 1',      start_date : '2026-01-01', duration : 14, open : true },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 2, text : 'Requirements', start_date : '2026-01-01', duration : 5,  parent : 1  },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 3, text : 'Design',       start_date : '2026-01-08', duration : 8,  parent : 1  }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    links : [{ id : 1, source : 2, target : 3, type : '0' }]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">};</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">onMounted(() =&gt; {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    gantt.config.date_format = '%Y-%m-%d';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    gantt.init(ganttContainer.value);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    gantt.parse(tasks);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">onBeforeUnmount(() =&gt; gantt.clearAll());</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="DHTMLX Gantt" src="https://www.react-gantt.com/assets/images/dhtmlx-gantt-ff658910fe3ae8368cfabb8d895d8c43.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-features">DHTMLX Gantt features<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#dhtmlx-gantt-features" class="hash-link" aria-label="Direct link to DHTMLX Gantt features" title="Direct link to DHTMLX Gantt features" translate="no">​</a></h3>
<p>The GPL Standard edition covers drag-and-drop rescheduling, dependency links, zoom levels, and task trees. The Pro edition adds auto-scheduling, critical path analysis, and resource management. The <code>gantt</code> object is a global singleton, which simplifies initialization but requires careful cleanup if you mount and unmount the container more than once.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-gantt-pricing">DHTMLX Gantt pricing<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#dhtmlx-gantt-pricing" class="hash-link" aria-label="Direct link to DHTMLX Gantt pricing" title="Direct link to DHTMLX Gantt pricing" translate="no">​</a></h3>
<p>The GPL Standard edition is free under the GPL license. Commercial editions are available at published prices: Individual $699, Commercial $1,399, Enterprise $2,999, Ultimate $5,999. The library is distributed through the public npm registry under all tiers.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-gantt">Pros of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#pros-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Pros of DHTMLX Gantt" title="Direct link to Pros of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard tier is genuinely free for open-source use</li>
<li class="">Published pricing for commercial tiers with no quote required</li>
<li class="">Available directly from the public npm registry</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-gantt">Cons of DHTMLX Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#cons-of-dhtmlx-gantt" class="hash-link" aria-label="Direct link to Cons of DHTMLX Gantt" title="Direct link to Cons of DHTMLX Gantt" translate="no">​</a></h3>
<ul>
<li class="">No official Vue wrapper, which requires manual DOM initialization and careful cleanup</li>
<li class="">The global singleton pattern can cause issues when the component is conditionally rendered</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt">Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#syncfusion-gantt" class="hash-link" aria-label="Direct link to Syncfusion Gantt" title="Direct link to Syncfusion Gantt" translate="no">​</a></h2>
<p>Syncfusion ships a native Vue component for its Gantt chart as part of the EJ2 suite. The component is fully Vue-idiomatic, meaning data binding and configuration work through props rather than imperative API calls.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-gantt">Getting started with Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#getting-started-with-syncfusion-gantt" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Gantt" title="Direct link to Getting started with Syncfusion Gantt" translate="no">​</a></h3>
<p>Install the package.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-vue-gantt@33.2.4</span><br></div></code></pre></div></div>
<p>Syncfusion requires a license key registered at application startup, along with CSS imports for each sub-package the Gantt component depends on. Add both to <code>main.js</code>.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// main.js</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> registerLicense </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-richtexteditor/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-treegrid/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-grids/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-gantt/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key-here'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Then configure the Gantt component in <code>App.vue</code> using the <code>taskFields</code> prop to map your data shape to the expected field names.</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;ejs-gantt :dataSource="data" :taskFields="taskFields" height="100%"&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;/ejs-gantt&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { GanttComponent as EjsGantt } from '@syncfusion/ej2-vue-gantt';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const data = [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        TaskID : 1, TaskName : 'Phase 1',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        subtasks : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            { TaskID : 2, TaskName : 'Requirements', StartDate : new Date('2026-01-01'), Duration : 5, Progress : 100 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            { TaskID : 3, TaskName : 'Design',       StartDate : new Date('2026-01-08'), Duration : 8, Progress : 20, Predecessor : '2' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">];</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const taskFields = {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    id         : 'TaskID',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    name       : 'TaskName',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    startDate  : 'StartDate',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    duration   : 'Duration',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    progress   : 'Progress',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    dependency : 'Predecessor',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    child      : 'subtasks'</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">};</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Syncfusion Gantt" src="https://www.react-gantt.com/assets/images/syncfusion-gantt-77a9b1156ed39130b3014fcc7a7d47a8.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-features">Syncfusion Gantt features<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#syncfusion-gantt-features" class="hash-link" aria-label="Direct link to Syncfusion Gantt features" title="Direct link to Syncfusion Gantt features" translate="no">​</a></h3>
<p>The Syncfusion Gantt component includes auto-scheduling, critical path highlighting, baselines, split tasks, resource management, undo/redo, and export. The feature set is comparable to Bryntum at the component level. The MCP servers Syncfusion provides are stdio-only, which limits their integration options compared to HTTP-based MCP servers.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-pricing">Syncfusion Gantt pricing<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#syncfusion-gantt-pricing" class="hash-link" aria-label="Direct link to Syncfusion Gantt pricing" title="Direct link to Syncfusion Gantt pricing" translate="no">​</a></h3>
<p>The Community License is free for individuals, organizations with fewer than five developers, fewer than 10 employees, and annual revenue under $1 million. It covers the full feature set with no capability restrictions. Commercial licenses are quote-based and require contacting Syncfusion sales directly.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-gantt">Pros of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#pros-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Pros of Syncfusion Gantt" title="Direct link to Pros of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Native Vue component with full declarative configuration</li>
<li class="">Community License grants access to all features at no cost for qualifying teams</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-gantt">Cons of Syncfusion Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#cons-of-syncfusion-gantt" class="hash-link" aria-label="Direct link to Cons of Syncfusion Gantt" title="Direct link to Cons of Syncfusion Gantt" translate="no">​</a></h3>
<ul>
<li class="">Setup requires importing CSS from 10 separate sub-packages</li>
<li class="">MCP servers are stdio-only</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt">DayPilot Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#daypilot-gantt" class="hash-link" aria-label="Direct link to DayPilot Gantt" title="Direct link to DayPilot Gantt" translate="no">​</a></h2>
<p>DayPilot Pro is a commercial UI component suite. The Gantt component ships as a native Vue component and is straightforward to configure for basic scheduling scenarios.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-gantt">Getting started with DayPilot Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#getting-started-with-daypilot-gantt" class="hash-link" aria-label="Direct link to Getting started with DayPilot Gantt" title="Direct link to Getting started with DayPilot Gantt" translate="no">​</a></h3>
<p>DayPilot Pro is not on the public npm registry. After purchasing or starting a trial, install the package as directed by DayPilot.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-vue</span><br></div></code></pre></div></div>
<p>Pass all configuration through a reactive <code>config</code> object bound to the component.</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;DayPilotGantt :config="config" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { DayPilotGantt } from 'daypilot-pro-vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const config = ref({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    startDate : '2026-01-01',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    days      : 30,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    tasks     : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : '1', start : '2026-01-01', end : '2026-01-15', text : 'Phase 1', completion : 50 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : '2', start : '2026-01-08', end : '2026-01-20', text : 'Design',  completion : 20 }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    links : [{ from : '1', to : '2' }]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-features">DayPilot Gantt features<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#daypilot-gantt-features" class="hash-link" aria-label="Direct link to DayPilot Gantt features" title="Direct link to DayPilot Gantt features" translate="no">​</a></h3>
<p>DayPilot Gantt supports dependency links, drag-and-drop rescheduling, and task completion percentage. The suite includes a UI Builder, which lets you configure and preview the component visually before generating code. A 60-day trial is available without a purchase. The library does not include an auto-scheduling engine, so task dates do not propagate automatically through dependency constraints.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-gantt-pricing">DayPilot Gantt pricing<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#daypilot-gantt-pricing" class="hash-link" aria-label="Direct link to DayPilot Gantt pricing" title="Direct link to DayPilot Gantt pricing" translate="no">​</a></h3>
<p>Licenses start at $649 per developer and are perpetual. Pricing details are available on the DayPilot website.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-gantt">Pros of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#pros-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Pros of DayPilot Gantt" title="Direct link to Pros of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">Native Vue component with config-driven setup</li>
<li class="">UI Builder for visual configuration and code generation</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-gantt">Cons of DayPilot Gantt<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#cons-of-daypilot-gantt" class="hash-link" aria-label="Direct link to Cons of DayPilot Gantt" title="Direct link to Cons of DayPilot Gantt" translate="no">​</a></h3>
<ul>
<li class="">No auto-scheduling engine, so dependent tasks do not adjust automatically</li>
<li class="">Fewer features than Bryntum or Syncfusion for complex project management scenarios</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="vue-ganttastic">vue-ganttastic<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#vue-ganttastic" class="hash-link" aria-label="Direct link to vue-ganttastic" title="Direct link to vue-ganttastic" translate="no">​</a></h2>
<p>vue-ganttastic is a free, MIT-licensed Gantt library built specifically for Vue 3. It uses the Composition API throughout and is well suited to simple timeline visualizations where a full scheduling engine is not required.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-vue-ganttastic">Getting started with vue-ganttastic<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#getting-started-with-vue-ganttastic" class="hash-link" aria-label="Direct link to Getting started with vue-ganttastic" title="Direct link to Getting started with vue-ganttastic" translate="no">​</a></h3>
<p>Install from npm.</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> vue-ganttastic</span><br></div></code></pre></div></div>
<p>The component model is row-based. Each <code>g-gantt-row</code> receives a <code>bars</code> array, and you specify which fields in each bar object represent the start and end dates using <code>bar-start</code> and <code>bar-end</code> props on the parent <code>g-gantt-chart</code>.</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;g-gantt-chart</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        :chart-start="chartStart"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        :chart-end="chartEnd"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        precision="day"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        bar-start="myBeginDate"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        bar-end="myEndDate"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        &lt;g-gantt-row</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            v-for="row in rows"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            :key="row.label"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            :label="row.label"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            :bars="row.bars"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;/g-gantt-chart&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { GGanttChart, GGanttRow } from 'vue-ganttastic';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const chartStart = '2026-01-01 00:00';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const chartEnd   = '2026-02-01 00:00';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const rows = ref([</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        label : 'Requirements',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        bars  : [{ myBeginDate : '2026-01-01 08:00', myEndDate : '2026-01-08 17:00', ganttBarConfig : { id : '1', label : 'Requirements' } }]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        label : 'Design',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        bars  : [{ myBeginDate : '2026-01-08 08:00', myEndDate : '2026-01-20 17:00', ganttBarConfig : { id : '2', label : 'Design' } }]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="vue-ganttastic-features">vue-ganttastic features<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#vue-ganttastic-features" class="hash-link" aria-label="Direct link to vue-ganttastic features" title="Direct link to vue-ganttastic features" translate="no">​</a></h3>
<p>vue-ganttastic supports drag-and-drop bar movement, custom slot rendering for bar content, configurable precision (hour, day, week, or month), and TypeScript typings. It is fully Vue 3 native and uses the Composition API. It does not include auto-scheduling, critical path analysis, resource management, file export, or dependency arrows between bars.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="vue-ganttastic-pricing">vue-ganttastic pricing<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#vue-ganttastic-pricing" class="hash-link" aria-label="Direct link to vue-ganttastic pricing" title="Direct link to vue-ganttastic pricing" translate="no">​</a></h3>
<p>Free under the MIT license. There is no commercial license to purchase.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-vue-ganttastic">Pros of vue-ganttastic<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#pros-of-vue-ganttastic" class="hash-link" aria-label="Direct link to Pros of vue-ganttastic" title="Direct link to Pros of vue-ganttastic" translate="no">​</a></h3>
<ul>
<li class="">Free and open source under MIT</li>
<li class="">Native Vue 3 with Composition API support</li>
<li class="">Lightweight with no large dependency tree</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-vue-ganttastic">Cons of vue-ganttastic<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#cons-of-vue-ganttastic" class="hash-link" aria-label="Direct link to Cons of vue-ganttastic" title="Direct link to Cons of vue-ganttastic" translate="no">​</a></h3>
<ul>
<li class="">No auto-scheduling, critical path, resource management, export, or dependency arrows</li>
<li class="">Not suitable for enterprise project management use cases that require scheduling logic</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-vue-gantt-chart-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below summarizes feature availability across all five libraries.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Feature</th><th>Bryntum Gantt</th><th>DHTMLX Gantt</th><th>Syncfusion Gantt</th><th>DayPilot Gantt</th><th>vue-ganttastic</th></tr></thead><tbody><tr><td>Auto-scheduling</td><td>Yes</td><td>Pro only</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Critical path</td><td>Yes</td><td>Pro only</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Resource management</td><td>Yes</td><td>Pro only</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Vue native wrapper</td><td>Yes</td><td>No</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Export</td><td>Yes</td><td>Pro only</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Open-source / free tier</td><td>No</td><td>GPL Standard</td><td>Community License</td><td>60-day trial</td><td>MIT</td></tr><tr><td>MCP server</td><td>Yes</td><td>No</td><td>Yes (stdio)</td><td>No</td><td>No</td></tr></tbody></table></div>
<p>The table below maps common use cases to the library best suited for each.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Use case</th><th>Recommended library</th></tr></thead><tbody><tr><td>Enterprise project management with full scheduling engine</td><td>Bryntum Gantt</td></tr><tr><td>Full-featured Gantt under a free Community License</td><td>Syncfusion Gantt</td></tr><tr><td>Open-source or GPL-licensed project</td><td>DHTMLX Gantt Standard</td></tr><tr><td>Simple project timeline with zero licensing cost</td><td>vue-ganttastic</td></tr></tbody></table></div>
<p>For enterprise applications that require auto-scheduling, critical path, and resource management with a native Vue component, Bryntum Gantt and Syncfusion Gantt are the strongest choices. Syncfusion's Community License makes it attractive for small teams that qualify, while Bryntum's published per-developer pricing and MCP server support make it easier to evaluate and integrate.</p>
<p>DHTMLX Gantt is a solid option for teams that need a proven library under a permissive open-source license. The GPL Standard tier is genuinely free, and the commercial tiers have published prices. The absence of an official Vue wrapper adds setup friction, but the integration pattern is well documented and straightforward.</p>
<p>vue-ganttastic fills a specific niche: teams that need a simple, dependency-free timeline visualization in a Vue 3 project and have no requirement for scheduling logic. For anything beyond basic bar display, the commercial options in this comparison offer substantially more capability.</p>]]></content:encoded>
            <category>gantt</category>
        </item>
        <item>
            <title><![CDATA[Best Vue scheduler components]]></title>
            <link>https://www.react-gantt.com/content/best-vue-scheduler-components/</link>
            <guid>https://www.react-gantt.com/content/best-vue-scheduler-components/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This comparison covers five Vue resource scheduling libraries: Bryntum Scheduler, DHTMLX Scheduler, Syncfusion Schedule, DayPilot Scheduler, and Mobiscroll.]]></description>
            <content:encoded><![CDATA[<p>This comparison covers five Vue resource scheduling libraries: Bryntum Scheduler, DHTMLX Scheduler, Syncfusion Schedule, DayPilot Scheduler, and Mobiscroll Event Calendar. A resource scheduler, also called a timeline scheduler, places resources on the Y-axis and a time axis on the X-axis, then renders event bars for each resource across that timeline. This is distinct from a Gantt chart, which models task dependencies and work breakdown structures, and from a calendar, which shows personal appointment views.</p>
<p>Vendor naming is inconsistent. Bryntum calls this product a Scheduler, Mobiscroll calls it an Event Calendar with a timeline view, and Syncfusion calls it Schedule. For a framework-agnostic comparison, see our article on <a href="https://bryntum.com/blog/best-javascript-scheduler-components/" target="_blank" rel="noopener noreferrer" class="">the best JavaScript scheduler components</a>.</p>
<p>Each section covers installation, a working Vue code sample, features, pricing, and trade-offs. Four of the five libraries ship a native Vue 3 wrapper. DHTMLX Scheduler is a global singleton that has no official Vue wrapper, so Vue integration requires initializing the library against a container element inside <code>onMounted</code> and cleaning up in <code>onBeforeUnmount</code>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler">Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#bryntum-scheduler" class="hash-link" aria-label="Direct link to Bryntum Scheduler" title="Direct link to Bryntum Scheduler" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/scheduler/" target="_blank" rel="noopener noreferrer" class="">Bryntum Scheduler</a> is a commercial JavaScript resource scheduler that ships a first-party Vue 3 wrapper. It renders resources on rows and places event bars on a configurable time axis. The library includes 18 built-in view presets, virtual scrolling for large datasets, and an event editor out of the box. Bryntum Scheduler Pro extends the base product with a ChronoGraph scheduling engine that handles travel time between events and constraint-based scheduling.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-bryntum-scheduler">Getting started with Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#getting-started-with-bryntum-scheduler" class="hash-link" aria-label="Direct link to Getting started with Bryntum Scheduler" title="Direct link to Getting started with Bryntum Scheduler" translate="no">​</a></h3>
<p>Install the trial package and the Vue 3 wrapper:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler@npm:@bryntum/scheduler-trial@7.3.0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/scheduler-vue-3@7.3.0</span><br></div></code></pre></div></div>
<p>Import the required stylesheets in <code>main.js</code> or <code>App.vue</code>. CSS load order matters here: the FontAwesome base stylesheet must come before the solid icons stylesheet, and the theme file must come last.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/scheduler.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/scheduler/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Define the scheduler configuration in a reactive ref and bind it with <code>v-bind</code> to the <code>&lt;bryntum-scheduler&gt;</code> component:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;bryntum-scheduler v-bind="schedulerConfig" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { BryntumScheduler } from '@bryntum/scheduler-vue-3';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const schedulerConfig = ref({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    startDate  : '2025-05-07',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    endDate    : '2025-05-26',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    viewPreset : 'hourAndDay',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    columns    : [{ text : 'Name', field : 'name', width : 130 }],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    resources  : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 1,  name : 'Celia',          title : 'Sales' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 11, name : 'Fancy law firm', eventColor : 'teal' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 12, name : 'Small boutique', eventColor : 'blue' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 13, name : 'Grocery store',  eventColor : 'lime' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events     : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 1, resourceId : 1,  name : 'Busy',              startDate : '2025-05-07', endDate : '2025-05-09', eventColor : 'red' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 2, resourceId : 11, name : 'Meeting',           startDate : '2025-05-07', endDate : '2025-05-09', location : 'clients office' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 3, resourceId : 12, name : 'Phone',             startDate : '2025-05-07', endDate : '2025-05-08', location : 'office' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      { id : 4, resourceId : 13, name : 'Suggested meeting', startDate : '2025-05-09', endDate : '2025-05-11', location : 'grocery store' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Bryntum Scheduler" src="https://www.react-gantt.com/assets/images/bryntum-scheduler-cdea645a1b76ea741b10ad1742864273.png" width="2558" height="1188" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-features">Bryntum Scheduler features<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#bryntum-scheduler-features" class="hash-link" aria-label="Direct link to Bryntum Scheduler features" title="Direct link to Bryntum Scheduler features" translate="no">​</a></h3>
<p>Bryntum Scheduler supports multi-resource event assignments, event overlap detection, drag-and-drop resize, a built-in event editor, recurring events, resource grouping in both vertical and horizontal orientations, and virtual scrolling. It ships 18 view presets covering time scales from minutes to years, and 10 built-in themes. Bryntum also provides an MCP server and a Claude Code skill so AI coding assistants can reference the API documentation directly during development. Scheduler Pro adds travel time between events and the ChronoGraph reactive scheduling engine.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-scheduler-pricing">Bryntum Scheduler pricing<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#bryntum-scheduler-pricing" class="hash-link" aria-label="Direct link to Bryntum Scheduler pricing" title="Direct link to Bryntum Scheduler pricing" translate="no">​</a></h3>
<p>The small-team license costs $680 per developer as a perpetual license, with a three-developer minimum and 12 months of updates. After the update period, you retain the last version received. A trial is available via npm using the install command above.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-bryntum-scheduler">Pros of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#pros-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Pros of Bryntum Scheduler" title="Direct link to Pros of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Native Vue 3 wrapper with full TypeScript type definitions.</li>
<li class="">18 built-in view presets cover most time scales without custom configuration.</li>
<li class="">Virtual scrolling maintains performance with large resource and event sets.</li>
<li class="">MCP server and Claude Code skill support AI-assisted development workflows.</li>
<li class="">All features are included in the base license without paid add-ons.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-bryntum-scheduler">Cons of Bryntum Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#cons-of-bryntum-scheduler" class="hash-link" aria-label="Direct link to Cons of Bryntum Scheduler" title="Direct link to Cons of Bryntum Scheduler" translate="no">​</a></h3>
<ul>
<li class="">No free tier beyond the npm trial.</li>
<li class="">Per-developer pricing is higher than some alternatives in this list.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler">DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#dhtmlx-scheduler" class="hash-link" aria-label="Direct link to DHTMLX Scheduler" title="Direct link to DHTMLX Scheduler" translate="no">​</a></h2>
<p><a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Scheduler</a> is a mature JavaScript calendar and scheduling library. It supports multiple calendar views and adds a Timeline view for resource scheduling. DHTMLX does not ship an official Vue wrapper, so Vue integration requires initializing the library against a DOM element inside <code>onMounted</code> and cleaning up in <code>onBeforeUnmount</code>. The library is also a global singleton, which means running multiple scheduler instances on the same page requires careful management.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-dhtmlx-scheduler">Getting started with DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#getting-started-with-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Getting started with DHTMLX Scheduler" title="Direct link to Getting started with DHTMLX Scheduler" translate="no">​</a></h3>
<p>Install the package from npm:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> dhtmlx-scheduler</span><br></div></code></pre></div></div>
<p>Create a Vue component that initializes the DHTMLX Scheduler Timeline view against a container element using a template ref:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;div ref="containerRef" style="width: 100%; height: 100vh;" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref, onMounted, onBeforeUnmount } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import 'dhtmlx-scheduler/codebase/dhtmlxscheduler_material.css';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import scheduler from 'dhtmlx-scheduler';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const containerRef = ref(null);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">onMounted(() =&gt; {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.config.xml_date = '%Y-%m-%d %H:%i';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.createTimelineView({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        name       : 'timeline',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        x_unit     : 'hour',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        x_date     : '%H:%i',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        x_step     : 1,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        x_size     : 8,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        x_start    : 8,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        x_length   : 8,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        y_unit     : scheduler.serverList('people'),</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        y_property : 'section_id',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        render     : 'bar'</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    });</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.init(containerRef.value, new Date(2026, 0, 2), 'timeline');</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.serverList('people', [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { key : '1', label : 'Alice' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { key : '2', label : 'Bob' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.parse([</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 1, text : 'Meeting', start_date : '2026-01-02 10:00', end_date : '2026-01-02 12:00', section_id : '1' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 2, text : 'Workshop', start_date : '2026-01-04 09:00', end_date : '2026-01-04 17:00', section_id : '2' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">onBeforeUnmount(() =&gt; {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scheduler.destructor();</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<p>The Timeline view for resource scheduling requires the DHTMLX Scheduler PRO edition. The Standard edition does not include it.</p>
<p><img decoding="async" loading="lazy" alt="DHTMLX Scheduler" src="https://www.react-gantt.com/assets/images/dhtmlx-scheduler-8a45f0e64d65f3372e6310101f1f0116.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-features">DHTMLX Scheduler features<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#dhtmlx-scheduler-features" class="hash-link" aria-label="Direct link to DHTMLX Scheduler features" title="Direct link to DHTMLX Scheduler features" translate="no">​</a></h3>
<p>DHTMLX Scheduler provides multiple calendar views (day, week, month, agenda), a Timeline view for resource scheduling (Pro), recurring events, and touch support. Because <code>scheduler</code> is a global singleton, you must call <code>scheduler.destructor()</code> on component unmount to avoid memory leaks and state conflicts.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="dhtmlx-scheduler-pricing">DHTMLX Scheduler pricing<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#dhtmlx-scheduler-pricing" class="hash-link" aria-label="Direct link to DHTMLX Scheduler pricing" title="Direct link to DHTMLX Scheduler pricing" translate="no">​</a></h3>
<p>The Standard edition is free under the GPL license for open-source projects. Commercial PRO licenses are perpetual and range from $599 for an individual license to $3,999 for an enterprise license.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-dhtmlx-scheduler">Pros of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#pros-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Pros of DHTMLX Scheduler" title="Direct link to Pros of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">GPL Standard edition is free for open-source projects.</li>
<li class="">Package is available on the public npm registry without authentication.</li>
<li class="">Published pricing tiers make budgeting straightforward.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-dhtmlx-scheduler">Cons of DHTMLX Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#cons-of-dhtmlx-scheduler" class="hash-link" aria-label="Direct link to Cons of DHTMLX Scheduler" title="Direct link to Cons of DHTMLX Scheduler" translate="no">​</a></h3>
<ul>
<li class="">No official Vue wrapper: DOM initialization and teardown must be handled manually with lifecycle hooks.</li>
<li class="">The Timeline view for resource scheduling requires the PRO edition.</li>
<li class="">The global singleton pattern complicates multiple-instance scenarios.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule">Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#syncfusion-schedule" class="hash-link" aria-label="Direct link to Syncfusion Schedule" title="Direct link to Syncfusion Schedule" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/vue-components/vue-scheduler" target="_blank" rel="noopener noreferrer" class="">Syncfusion Schedule</a> ships as a first-party Vue component through the <code>@syncfusion/ej2-vue-schedule</code> package. Timeline Day, Timeline Week, and Timeline Month views provide the resource scheduling layout. The component is available under a Community License for qualifying organizations.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-syncfusion-schedule">Getting started with Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#getting-started-with-syncfusion-schedule" class="hash-link" aria-label="Direct link to Getting started with Syncfusion Schedule" title="Direct link to Getting started with Syncfusion Schedule" translate="no">​</a></h3>
<p>Install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-vue-schedule</span><br></div></code></pre></div></div>
<p>Register the Syncfusion license key in <code>main.js</code> before any component mounts. Calling <code>registerLicense</code> after component initialization causes rendering errors.</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> registerLicense </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'YOUR_LICENSE_KEY'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Syncfusion requires multiple stylesheet imports. Add all of the following to <code>main.js</code>:</p>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-vue-schedule/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Define the resource data and event data in a Vue component using the Syncfusion directive components:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;ejs-schedule height="550px" :selected-date="selectedDate" :event-settings="eventSettings"&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        &lt;e-resources&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            &lt;e-resource field="ResourceId" title="Resource" name="Resources"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                :data-source="resourceData" text-field="text" id-field="id" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        &lt;/e-resources&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        &lt;e-views&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            &lt;e-view option="TimelineDay" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            &lt;e-view option="TimelineWeek" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        &lt;/e-views&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;/ejs-schedule&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ScheduleComponent as EjsSchedule, ResourcesDirective as EResources, ResourceDirective as EResource, ViewsDirective as EViews, ViewDirective as EView, TimelineViewsService } from '@syncfusion/ej2-vue-schedule';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const selectedDate = ref(new Date(2026, 0, 2));</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const resourceData = ref([</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { text : 'Alice', id : 1 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { text : 'Bob', id : 2 }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const eventSettings = ref({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    dataSource : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { Id : 1, Subject : 'Meeting', StartTime : new Date(2026, 0, 2, 10), EndTime : new Date(2026, 0, 2, 12), ResourceId : 1 },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { Id : 2, Subject : 'Workshop', StartTime : new Date(2026, 0, 4, 9), EndTime : new Date(2026, 0, 4, 17), ResourceId : 2 }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">provide('schedule', [TimelineViewsService]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-features">Syncfusion Schedule features<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#syncfusion-schedule-features" class="hash-link" aria-label="Direct link to Syncfusion Schedule features" title="Direct link to Syncfusion Schedule features" translate="no">​</a></h3>
<p>Syncfusion Schedule includes Timeline Day, Timeline Week, and Timeline Month views, drag-and-drop event editing, recurring events, resource grouping, virtual scrolling, and export. The standard calendar views (Day, Week, Month) are also available alongside the timeline views.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-schedule-pricing">Syncfusion Schedule pricing<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#syncfusion-schedule-pricing" class="hash-link" aria-label="Direct link to Syncfusion Schedule pricing" title="Direct link to Syncfusion Schedule pricing" translate="no">​</a></h3>
<p>The Community License is free for organizations with annual gross revenue under $1 million and five or fewer developers. Commercial licensing is quote-based and not publicly listed.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-syncfusion-schedule">Pros of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#pros-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Pros of Syncfusion Schedule" title="Direct link to Pros of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">Native Vue component with first-party support.</li>
<li class="">Community License covers all features at no cost for qualifying teams.</li>
<li class="">Multiple timeline views (day, week, month) are included in the base package.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-syncfusion-schedule">Cons of Syncfusion Schedule<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#cons-of-syncfusion-schedule" class="hash-link" aria-label="Direct link to Cons of Syncfusion Schedule" title="Direct link to Cons of Syncfusion Schedule" translate="no">​</a></h3>
<ul>
<li class="">Setup requires importing eight separate CSS files from different packages.</li>
<li class="">Commercial pricing requires contacting Syncfusion for a quote.</li>
<li class="">The license registration call must appear in <code>main.js</code> before any component renders.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler">DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#daypilot-scheduler" class="hash-link" aria-label="Direct link to DayPilot Scheduler" title="Direct link to DayPilot Scheduler" translate="no">​</a></h2>
<p><a href="https://doc.daypilot.org/scheduler/" target="_blank" rel="noopener noreferrer" class="">DayPilot Pro</a> provides a Vue scheduler component through the <code>daypilot-pro-vue</code> package. It renders resource rows on the Y-axis and a configurable time axis on the X-axis, with drag-and-drop event editing and a hierarchical resource tree. A DayPilot Lite version with limited features is freely available.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-daypilot-scheduler">Getting started with DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#getting-started-with-daypilot-scheduler" class="hash-link" aria-label="Direct link to Getting started with DayPilot Scheduler" title="Direct link to Getting started with DayPilot Scheduler" translate="no">​</a></h3>
<p>Install the package (distributed after purchasing a license):</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> daypilot-pro-vue</span><br></div></code></pre></div></div>
<p>Define the scheduler configuration in a reactive object and pass it to the <code>&lt;daypilot-scheduler&gt;</code> component:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;daypilot-scheduler :config="config" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { reactive } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { DayPilotScheduler as DaypilotScheduler } from 'daypilot-pro-vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const config = reactive({</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    startDate  : '2026-01-01',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    days       : 7,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    scale      : 'Hour',</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    cellWidth  : 40,</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    resources  : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { name : 'Alice', id : 'R1' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { name : 'Bob',   id : 'R2' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ],</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    events     : [</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 1, text : 'Meeting', start : '2026-01-02T10:00:00', end : '2026-01-02T12:00:00', resource : 'R1' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        { id : 2, text : 'Workshop', start : '2026-01-04T09:00:00', end : '2026-01-04T17:00:00', resource : 'R2' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">});</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-features">DayPilot Scheduler features<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#daypilot-scheduler-features" class="hash-link" aria-label="Direct link to DayPilot Scheduler features" title="Direct link to DayPilot Scheduler features" translate="no">​</a></h3>
<p>DayPilot Scheduler supports resource rows, drag-and-drop event editing, a hierarchical resource tree, multi-day events, and event customization callbacks. It does not include a scheduling engine, so event dates do not recalculate automatically when dependencies change. A UI Builder lets you configure the component visually and export the resulting configuration code.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="daypilot-scheduler-pricing">DayPilot Scheduler pricing<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#daypilot-scheduler-pricing" class="hash-link" aria-label="Direct link to DayPilot Scheduler pricing" title="Direct link to DayPilot Scheduler pricing" translate="no">​</a></h3>
<p>DayPilot Pro starts at $899 per developer as a perpetual license. A Lite version with limited features is free.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-daypilot-scheduler">Pros of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#pros-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Pros of DayPilot Scheduler" title="Direct link to Pros of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">Native Vue component.</li>
<li class="">Hierarchical resource tree is included without additional configuration.</li>
<li class="">Lite version provides a free entry point for simple use cases.</li>
<li class="">UI Builder reduces configuration time for common layouts.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-daypilot-scheduler">Cons of DayPilot Scheduler<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#cons-of-daypilot-scheduler" class="hash-link" aria-label="Direct link to Cons of DayPilot Scheduler" title="Direct link to Cons of DayPilot Scheduler" translate="no">​</a></h3>
<ul>
<li class="">No scheduling engine: dependent event dates must be managed in application code.</li>
<li class="">Package is not on the public npm registry.</li>
<li class="">Feature set is narrower than Bryntum Scheduler or Syncfusion Schedule.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar">Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar" title="Direct link to Mobiscroll Event Calendar" translate="no">​</a></h2>
<p><a href="https://mobiscroll.com/event-calendar-scheduler" target="_blank" rel="noopener noreferrer" class="">Mobiscroll Event Calendar</a> is a commercial component suite that includes a timeline view for resource scheduling. Mobiscroll uses the "Event Calendar" name for what other vendors call a scheduler. The library is built with a mobile-first approach and is optimized for touch interaction and responsive layouts across desktop and mobile.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="getting-started-with-mobiscroll-event-calendar">Getting started with Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#getting-started-with-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Getting started with Mobiscroll Event Calendar" title="Direct link to Getting started with Mobiscroll Event Calendar" translate="no">​</a></h3>
<p>Install the package:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @mobiscroll/vue</span><br></div></code></pre></div></div>
<p>Define resources, events, and the view configuration in a Vue component using the <code>&lt;mbsc-eventcalendar&gt;</code> component:</p>
<div class="language-vue codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-vue codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    &lt;mbsc-eventcalendar :data="myEvents" :resources="myResources" :view="myView" /&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;script setup&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { ref } from 'vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import { MbscEventcalendar } from '@mobiscroll/vue';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">import '@mobiscroll/vue/dist/css/mobiscroll.min.css';</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const myResources = ref([</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { id : 1, name : 'Alice' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { id : 2, name : 'Bob' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const myEvents = ref([</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { id : 1, resource : 1, title : 'Meeting', start : '2026-01-02T10:00:00', end : '2026-01-02T12:00:00' },</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    { id : 2, resource : 2, title : 'Workshop', start : '2026-01-04T09:00:00', end : '2026-01-04T17:00:00' }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">]);</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">const myView = { timeline : { type : 'week', eventList : false } };</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">&lt;/script&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-features">Mobiscroll Event Calendar features<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#mobiscroll-event-calendar-features" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar features" title="Direct link to Mobiscroll Event Calendar features" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar includes a timeline view, drag-and-drop event editing, recurring events, and responsive layouts. The library is mobile-first: it handles touch gestures and adapts the layout for small screens without additional configuration. Among the five options in this article, Mobiscroll provides the best out-of-the-box mobile experience.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mobiscroll-event-calendar-pricing">Mobiscroll Event Calendar pricing<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#mobiscroll-event-calendar-pricing" class="hash-link" aria-label="Direct link to Mobiscroll Event Calendar pricing" title="Direct link to Mobiscroll Event Calendar pricing" translate="no">​</a></h3>
<p>Mobiscroll Event Calendar starts at $995 per internal project as a perpetual license. A trial is available on the Mobiscroll website.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="pros-of-mobiscroll-event-calendar">Pros of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#pros-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Pros of Mobiscroll Event Calendar" title="Direct link to Pros of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">Native Vue component.</li>
<li class="">Best mobile and touch experience among the five options compared here.</li>
<li class="">Single CSS import keeps the setup straightforward.</li>
<li class="">Responsive layout adapts to different screen sizes without custom work.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="cons-of-mobiscroll-event-calendar">Cons of Mobiscroll Event Calendar<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#cons-of-mobiscroll-event-calendar" class="hash-link" aria-label="Direct link to Cons of Mobiscroll Event Calendar" title="Direct link to Cons of Mobiscroll Event Calendar" translate="no">​</a></h3>
<ul>
<li class="">SaaS and multi-customer product pricing requires a custom quote.</li>
<li class="">Narrower feature set for resource scheduling compared to Bryntum Scheduler.</li>
<li class="">No free tier beyond the trial.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="conclusion">Conclusion<a href="https://www.react-gantt.com/content/best-vue-scheduler-components/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The table below summarizes the key capabilities across all five libraries.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:left">Bryntum Scheduler</th><th style="text-align:left">DHTMLX Scheduler</th><th style="text-align:left">Syncfusion Schedule</th><th style="text-align:left">DayPilot Scheduler</th><th style="text-align:left">Mobiscroll Event Calendar</th></tr></thead><tbody><tr><td style="text-align:left">Resource grouping</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes (Pro)</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Multi-level resources</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes (Pro)</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes (tree)</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Drag-and-drop</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Recurring events</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Virtual scrolling</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">Yes</td><td style="text-align:left">No</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left">Vue 3 native wrapper</td><td style="text-align:left">Yes</td><td style="text-align:left">No (container approach)</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Free tier</td><td style="text-align:left">Trial only</td><td style="text-align:left">GPL Standard</td><td style="text-align:left">Community License</td><td style="text-align:left">Lite version</td><td style="text-align:left">Trial only</td></tr></tbody></table></div>
<p>The table below maps common project requirements to the library best suited for each.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Use case</th><th style="text-align:left">Recommended library</th></tr></thead><tbody><tr><td style="text-align:left">Enterprise Vue app requiring full resource scheduling</td><td style="text-align:left">Bryntum Scheduler</td></tr><tr><td style="text-align:left">Full-featured scheduler with a free Community License</td><td style="text-align:left">Syncfusion Schedule</td></tr><tr><td style="text-align:left">Mobile or touch-first scheduling interface</td><td style="text-align:left">Mobiscroll Event Calendar</td></tr><tr><td style="text-align:left">Open-source project or GPL-licensed application</td><td style="text-align:left">DHTMLX Scheduler Standard</td></tr></tbody></table></div>
<p>For most Vue teams building a resource scheduling UI, Bryntum Scheduler and Syncfusion Schedule are the strongest choices. Both ship native Vue 3 wrappers and include virtual scrolling, resource grouping, and recurring events. Bryntum Scheduler adds an MCP server and Claude Code skill that make it well suited to teams using AI coding assistants during development. The Syncfusion Community License makes it the practical choice for smaller teams that qualify under the revenue and headcount thresholds.</p>
<p>DHTMLX Scheduler is the best option when the project is open-source and the GPL license fits. The lack of an official Vue wrapper is a real integration cost, but the Timeline view covers the resource scheduling use case once you are on the PRO edition. DayPilot Scheduler suits teams that need a native Vue component with a hierarchical resource tree and can accept the absence of a scheduling engine. Mobiscroll Event Calendar is the right choice when mobile and touch support are primary requirements: no other library in this comparison matches its responsive behavior and touch gesture handling out of the box.</p>]]></content:encoded>
            <category>scheduler</category>
        </item>
        <item>
            <title><![CDATA[How to Create a Gantt Chart in JavaScript with Frappe Gantt]]></title>
            <link>https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/</link>
            <guid>https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to Create a Gantt Chart in JavaScript with Frappe Gantt]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Header" src="https://www.react-gantt.com/assets/images/updated-frappe-gantt-header-d9421b602d7b3fedaa08bbb7bcd7863b.png" width="1679" height="1137" class="img_Z5b4"></p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="what-is-frappe-gantt">What is Frappe Gantt?<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#what-is-frappe-gantt" class="hash-link" aria-label="Direct link to What is Frappe Gantt?" title="Direct link to What is Frappe Gantt?" translate="no">​</a></h2>
<p>Frappe Gantt is an open-source JavaScript Gantt chart library. A Gantt chart is a commonly used project management tool for scheduling tasks. Frappe Gantt comes with built-in support for drag-and-drop task scheduling, task dependencies, progress tracking, and multiple view modes (day, week, month).</p>
<p>In this article, we’ll make a Gantt chart using <a href="https://frappe.io/gantt" target="_blank" rel="noopener noreferrer" class="">Frappe Gantt</a>, then compare it with our commercial <a href="https://bryntum.com/products/gantt/examples/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt chart</a> to look at the differences between building your own chart versus using an off-the-shelf solution.</p>
<p>The basic interactive Gantt chart that we’ll create using Frappe Gantt will have the following features:</p>
<ul>
<li class="">Tasks can be added and deleted.</li>
<li class="">The task date can be changed using drag and drop.</li>
<li class="">The task can be resized by clicking and dragging the sides of the taskbars.</li>
<li class="">The tasks have a progress bar indicating task completion as a percentage.</li>
<li class="">The Gantt chart view can be changed: day, week or month.</li>
<li class="">The tasks can have dependencies.</li>
<li class="">The tasks can be labeled as important, which changes the taskbar color.</li>
</ul>
<p>We'll also build a Gantt chart using <a href="https://www.bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a> for comparison. Here's what you'll build.</p>
<p>The Frappe Gantt chart:</p>
<p><img decoding="async" loading="lazy" alt="Frappe Gantt - complete" src="https://www.react-gantt.com/assets/images/frappe-gantt-complete-ae5da00e27d111239a095c6177d8cb0d.png" width="1210" height="1006" class="img_Z5b4"></p>
<p>The Bryntum Gantt chart:</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-422ce33c4ced500ecd26d74f29494e78.png" width="2880" height="1064" class="img_Z5b4"></p>
<p>You can find the code for the completed Frappe Gantt chart in <a href="https://github.com/bryntum/frappe-gantt-vanilla-js/tree/complete-gantt" target="_blank" rel="noopener noreferrer" class="">our GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="setting-up-your-gantt-chart-html-and-javascript-project-with-vite">Setting Up Your Gantt Chart HTML and JavaScript Project with Vite<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#setting-up-your-gantt-chart-html-and-javascript-project-with-vite" class="hash-link" aria-label="Direct link to Setting Up Your Gantt Chart HTML and JavaScript Project with Vite" title="Direct link to Setting Up Your Gantt Chart HTML and JavaScript Project with Vite" translate="no">​</a></h2>
<p>The starter repository contains all of the files that you’ll need to create the Gantt chart. It uses <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer" class="">Vite</a>, which is a development server and JavaScript bundler. You’ll need Node.js version 20.19.0 or higher for Vite to work. The dependency needed for our Gantt chart is <a href="https://www.npmjs.com/package/frappe-gantt" target="_blank" rel="noopener noreferrer" class="">Frappe Gantt</a>.</p>
<ol>
<li class="">Clone the <a href="https://github.com/bryntum/frappe-gantt-vanilla-js" target="_blank" rel="noopener noreferrer" class="">Frappe Gantt chart starter GitHub repository</a>:</li>
</ol>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://github.com/bryntum/frappe-gantt-vanilla-js</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(78, 201, 176)">cd</span><span class="token plain"> frappe-gantt-vanilla-js</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">Install the dependencies:</li>
</ol>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><br></div></code></pre></div></div>
<ol start="3">
<li class="">Run the local development server:</li>
</ol>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> run dev</span><br></div></code></pre></div></div>
<p>You’ll see a page with the text “Loading...” in the middle of the screen.</p>
<p>The following Vite commands are available:</p>
<ul>
<li class=""><code>npm run dev</code> runs vite to start the dev server.</li>
<li class=""><code>npm run build</code> runs vite build to build the production bundle to the <code>dist</code> folder.</li>
<li class=""><code>npm run preview</code> runs vite preview to serve the production bundle.</li>
</ul>
<p>Let’s take a look at how the Frappe Gantt chart starter code is structured.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="adding-gantt-chart-styles-with-css">Adding Gantt Chart Styles with CSS<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#adding-gantt-chart-styles-with-css" class="hash-link" aria-label="Direct link to Adding Gantt Chart Styles with CSS" title="Direct link to Adding Gantt Chart Styles with CSS" translate="no">​</a></h3>
<p>The CSS we’ll use for the Gantt chart comes from two places. The Frappe Gantt library ships its own CSS, which we’ll import in <code>main.js</code>. Additional styles for the forms and buttons are in the <code>styles.css</code> file in the starter code.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="understanding-the-utility-functions-and-data-structure">Understanding the Utility Functions and Data Structure<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#understanding-the-utility-functions-and-data-structure" class="hash-link" aria-label="Direct link to Understanding the Utility Functions and Data Structure" title="Direct link to Understanding the Utility Functions and Data Structure" translate="no">​</a></h3>
<p>We’ll use the native <code>fetch</code> API to load our example Gantt chart data, which is in the <code>data.json</code> file in the <code>public/data</code> folder.</p>
<p>The <code>dateFunctions.js</code> file in the <code>utils</code> folder contains a <code>createFormattedDateFromStr</code> function that we’ll use to format date strings. The <code>constants.js</code> file contains a <code>months</code> array that we’ll use for getting month names from their index value.</p>
<p>Now let’s start creating the Frappe Gantt chart component.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="creating-a-basic-interactive-gantt-chart-with-task-data">Creating a Basic Interactive Gantt Chart with Task Data<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#creating-a-basic-interactive-gantt-chart-with-task-data" class="hash-link" aria-label="Direct link to Creating a Basic Interactive Gantt Chart with Task Data" title="Direct link to Creating a Basic Interactive Gantt Chart with Task Data" translate="no">​</a></h2>
<p>First, we’ll create a basic Frappe Gantt chart by fetching the tasks data from the <code>data.json</code> file in the <code>public/data</code> folder. We’ll then create a Frappe Gantt instance and pass the data to it.</p>
<ol>
<li class="">Add the following code to <code>main.js</code>:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> Gantt </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"frappe-gantt"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"/node_modules/frappe-gantt/dist/frappe-gantt.css"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">fetchData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> response </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">fetch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"data/data.json"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    tasks </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">await</span><span class="token plain"> response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">json</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ganttChart </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"#gantt"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">bar_height</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">25</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">view_mode</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"Week"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">showGantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">showErrorMsg</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">hideLoader</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">hideLoader</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementsByClassName</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"loading"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">style</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">display </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"none"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">showGantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementsByClassName</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"gantt-wrapper"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">style</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">display </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"block"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">showErrorMsg</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementsByClassName</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"error"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">style</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">display </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"flex"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">fetchData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>We’ll store the tasks state in the <code>tasks</code> variable. The <code>fetchData</code> function will run on page load. It uses the native <code>fetch</code> API to get the task data from <code>data.json</code>, which is then passed into the created Gantt chart instance. The first argument of the Gantt constructor function is the <code>id</code> of the <code>&lt;svg&gt;</code> element that will contain the Gantt chart. This <code>&lt;svg&gt;</code> element is part of the starter code in the <code>index.html</code> file. The second argument is the data and the third argument is an options object for configuring the Gantt chart.</p>
<p>We set the <code>bar_height</code> of the taskbars and the <code>view_mode</code> of the calendar. On page load, the "...loading" <code>&lt;div&gt;</code> is displayed. It is then hidden using the <code>hideLoader</code> function in the <code>finally</code> block, which runs whether the fetch succeeds or fails. If there is an error, the error message <code>&lt;div&gt;</code> will be displayed. If the request is successful, the Gantt chart is shown using the <code>showGantt</code> function.</p>
<p>If you run your local server now, you’ll see the following Gantt chart in your browser window:</p>
<video controls="" playsinline="" src="/img/articles/creating-a-gantt-chart-frappe-vs-bryntum/frappe-gantt-initial.webm" title="Initial Frappe Gantt"></video>
<p>The Frappe Gantt has drag, resize, task progress display and dependencies built in, making it a solid open source Gantt chart component out of the box. The last task, "Set up test strategy", is red because it has the custom class <code>is-important</code>. You can see this in the <code>data.json</code> file. The styling for it is in the <code>styles.css</code> file. Now let’s customize our Gantt chart and add more features.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="customizing-the-task-tooltip">Customizing the Task Tooltip<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#customizing-the-task-tooltip" class="hash-link" aria-label="Direct link to Customizing the Task Tooltip" title="Direct link to Customizing the Task Tooltip" translate="no">​</a></h2>
<p>We’re going to customize the tooltip that’s displayed when you click a taskbar.</p>
<ol>
<li class="">In <code>main.js</code>, add the following property in the Gantt chart constructor function’s options argument, below the <code>view_mode</code> property:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">custom_popup_html</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> start_day </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getDate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> start_month </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> months</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getMonth</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> end_day </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getDate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> end_month </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> months</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">_end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getMonth</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">          &lt;div class='details-container'&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;h5&gt;</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">task</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">name</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;/h5&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;br&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;p&gt;Task started on: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">start_day</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)"> </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">start_month</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;/p&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;p&gt;Expected to finish by </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">end_day</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)"> </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">end_month</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">&lt;/p&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">            &lt;p&gt;</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">task</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">progress</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">% completed!&lt;/p&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">          &lt;/div&gt;</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token template-string string" style="color:rgb(206, 145, 120)">        </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><br></div></code></pre></div></div>
<p>The value of this property is a function that accepts a task as an argument. It returns a string that is displayed in the task. The "details-container" class is defined in our <code>styles.css</code> file. We display the task name, start date, end date and progress. If you use this in production, make sure that you sanitize the task data as creating HTML with user-supplied data is a security risk.</p>
<ol start="2">
<li class="">At the top of <code>main.js</code>, add the following import:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> months </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"./constants.js"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Now when you click a taskbar, you’ll see our custom tooltip:</p>
<p><img decoding="async" loading="lazy" alt="Frappe Gantt - custom tooltip" src="https://www.react-gantt.com/assets/images/frappe-gantt-tooltip-5a911059cec2e09bfe4796503786fe3f.png" width="2880" height="706" class="img_Z5b4"></p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="adding-tasks-to-your-gantt-chart">Adding Tasks to Your Gantt Chart<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#adding-tasks-to-your-gantt-chart" class="hash-link" aria-label="Direct link to Adding Tasks to Your Gantt Chart" title="Direct link to Adding Tasks to Your Gantt Chart" translate="no">​</a></h2>
<p>Let's create a form that will allow us to add new tasks.</p>
<ol>
<li class="">In <code>index.html</code>, add the following HTML code as the second child of the <code>&lt;div&gt;</code> with a class of "gantt-wrapper":</li>
</ol>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">controls-container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">form</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">add-task</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">h2</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Add task</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">h2</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">task-name</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Task name</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">input</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">task-name</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">task-name</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">required</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">start-date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Start date</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">input</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">start-date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">start-date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">value</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">2022-11-08</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">min</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">2022-01-01</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">max</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">2050-12-31</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">end-date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">End date</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">input</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">end-date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">end-date</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">value</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">2022-11-10</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">min</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">2022-01-01</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">max</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">2050-12-31</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">progress</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Progress (%)</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">input</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">number</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">progress</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">progress</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">value</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">0</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">min</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">0</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">            </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">max</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">100</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">important-checkbox-container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">is-important</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Is it an important task?</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">label</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">input</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">checkbox</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">is-important</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">is-important</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Add</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">form</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>This form contains all of the task properties except for the dependencies. We’ll add dependency inputs later.</p>
<ol start="2">
<li class="">At the top of <code>main.js</code>, add the following line to select the "Add task" form:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> addForm </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"add-task"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<ol start="3">
<li class="">At the bottom of <code>main.js</code>, add the following event listener to listen for the form submit:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">addForm</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">addEventListener</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"submit"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> addTask</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<ol start="4">
<li class="">In <code>main.js</code>, add the following <code>addTask</code> function below the <code>showErrorMsg</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">addTask</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">preventDefault</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> formElements </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">target</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">elements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> formElements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"task-name"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> formElements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"start-date"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> formElements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"end-date"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> progress </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">parseInt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">formElements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"progress"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> isImportant </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> formElements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"is-important"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">checked</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> newtask </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">Date</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">now</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    progress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">custom_class</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> isImportant </span><span class="token operator" style="color:rgb(212, 212, 212)">?</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"is-important"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">""</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">push</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">newtask</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">refresh</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>This function gets the values from the "Add task" form, creates a new task object and then updates the <code>tasks</code> variable, which is the tasks state of our Gantt chart. We use the Frappe Gantt <code>refresh</code> method to update our Gantt chart with the new task state.</p>
<p>You’ll now be able to add new tasks to your Gantt chart. However, there's a problem with updating the Gantt chart state. Try changing the date of a task by dragging or resizing it and then add a new task. After the new task is added, the task date changes back to its original value. To fix this, we’ll use two event listeners provided by Frappe Gantt: <code>on_date_change</code> and <code>on_progress_change</code>.</p>
<ol start="5">
<li class="">At the top of <code>main.js</code>, add the following import:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> createFormattedDateFromStr </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"./utils/dateFunctions.js"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<ol start="6">
<li class="">In <code>main.js</code>, add the following properties in the Gantt chart constructor function’s options argument, below the <code>custom_popup_html</code> property:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">on_date_change</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> start</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token function" style="color:rgb(220, 220, 170)">updateDate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token function-variable function" style="color:rgb(220, 220, 170)">on_progress_change</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> progress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token function" style="color:rgb(220, 220, 170)">updateProgress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> progress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><br></div></code></pre></div></div>
<p>The <code>on_date_change</code> listener accepts a callback function that’s called when a task date is changed. This function calls the <code>updateDate</code> function. The <code>on_progress_change</code> listener is called when a task progress value is changed. This function calls the <code>updateProgress</code> function. Let’s define the <code>updateDate</code> and <code>updateProgress</code> functions.</p>
<ol start="7">
<li class="">In <code>main.js</code>, add the following lines below the <code>addTask</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">updateDate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> start</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> startYear </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getFullYear</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> startMonth </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getMonth</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> startDay </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getDate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> endYear </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getFullYear</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> endMonth </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getMonth</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> endDay </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getDate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> startStr </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createFormattedDateFromStr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    startYear</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    startMonth </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    startDay</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> endStr </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">createFormattedDateFromStr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">endYear</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endMonth </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> endDay</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> taskToUpdate </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">find</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  taskToUpdate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> startStr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  taskToUpdate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">end </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> endStr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">refresh</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">updateProgress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> progress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> taskToUpdate </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">find</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  taskToUpdate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">progress </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> progress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">refresh</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>The <code>updateDate</code> function uses the passed-in date arguments as well as our <code>createFormattedDateFromStr</code> utility function to get the new <code>start</code> and <code>end</code> date strings of the task. We then update the tasks state and refresh the Gantt chart with the new state.</p>
<p>The <code>updateProgress</code> function is similar to the <code>updateDate</code> function. We update the task <code>progress</code>, which does not require formatting like updating the start and end dates.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="adding-task-dependencies-to-your-gantt-chart-component">Adding Task Dependencies to Your Gantt Chart Component<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#adding-task-dependencies-to-your-gantt-chart-component" class="hash-link" aria-label="Direct link to Adding Task Dependencies to Your Gantt Chart Component" title="Direct link to Adding Task Dependencies to Your Gantt Chart Component" translate="no">​</a></h2>
<p>In our Gantt chart, most of the tasks from the <code>data.json</code> file have tasks that they are dependent on. This is indicated by arrows that point from the dependency to the task. Let’s add dependency inputs to our "Add task" form.</p>
<ol>
<li class="">In <code>index.html</code>, add the following HTML code just above the <code>&lt;button&gt;Add&lt;/button&gt;</code> line:</li>
</ol>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">fieldset</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">tasks-checkbox-container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">legend</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Dependencies</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">legend</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">fieldset</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">At the top of <code>main.js</code>, add the following variable:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> tasksCheckboxContainers </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">querySelectorAll</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token string" style="color:rgb(206, 145, 120)">".tasks-checkbox-container"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>We use <code>querySelectorAll</code> because we’ll add a similar task checkbox container in the "Delete tasks" form that we’ll create later.</p>
<ol start="3">
<li class="">In <code>main.js</code>, add the following function below the <code>updateProgress</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">addTaskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  tasksCheckboxContainers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">forEach</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">container</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    container</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">innerHTML </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">""</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> fragment </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">DocumentFragment</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> legend </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createElement</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"legend"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      legend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createTextNode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Dependencies"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      legend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createTextNode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Tasks"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    fragment</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">legend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">map</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> div </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createElement</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"div"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> checkbox </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createElement</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"input"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      checkbox</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">type </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"checkbox"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      checkbox</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">task</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      checkbox</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">name </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"task"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      checkbox</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> label </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createElement</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"label"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      label</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">htmlFor </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">i</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">task</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      label</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">createTextNode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      div</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">checkbox</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      div</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">label</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      fragment</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">div</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    container</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendChild</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">fragment</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>This function is used to dynamically create checkboxes for all of the dependencies, which are the tasks. For each task, we create a checkbox <code>&lt;input&gt;</code> element. We then append the checkboxes to the form <code>&lt;fieldset&gt;</code> element.</p>
<p>Now we need to update the <code>addTask</code> function so that we can add dependencies to a new task.</p>
<ol start="4">
<li class="">In <code>main.js</code>, add the following lines below the <code>const isImportant = formElements["is-important"].checked;</code> line in the <code>addTask</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> taskCheckboxes </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> formElements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"task"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> timeDiff </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getTime</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getTime</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">timeDiff </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> depIds </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">length </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">||</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token plain">taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// no existing tasks, no dependencies to add</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">else</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">length </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">checked</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      depIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">push</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">forEach</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">dep</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dep</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">checked</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        depIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">push</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dep</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<ol start="5">
<li class="">In <code>main.js</code>, add the following property to the <code>newTask</code> object:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token literal-property property">dependencies</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> depIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">join</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">", "</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><br></div></code></pre></div></div>
<ol start="6">
<li class="">In <code>main.js</code>, add the following line below the <code>ganttChart.refresh(tasks);</code> line in the <code>addTask</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">addTaskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The <code>timeDiff</code> variable is a check to make sure that the user does not select an invalid input range. The <code>depIds</code> array stores the <code>id</code> values of the checked dependencies. We loop through the <code>taskCheckboxes</code> and add the task ID if the checkbox is checked. We then add the <code>dependencies</code> as a property to the <code>newTask</code> object.</p>
<p>After the Gantt chart is refreshed with the new tasks, we call the <code>addTaskCheckboxes</code> function so that the dependency checkboxes are updated. You’ll see that at the start of the <code>addTaskCheckboxes</code> function, the checkboxes <code>&lt;fieldset&gt;</code> container is cleared before adding the new dependencies by setting the <code>innerHTML</code> to an empty string.</p>
<ol start="7">
<li class="">In <code>main.js</code>, add the following function call below the <code>showGantt()</code> line in the <code>fetchData</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">addTaskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>You’ll now be able to add dependencies to your new tasks:</p>
<video controls="" playsinline="" src="/img/articles/creating-a-gantt-chart-frappe-vs-bryntum/frappe-gantt-add-dependencies.webm" title="Frappe Gantt - add dependencies"></video>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="deleting-tasks-from-your-gantt-chart">Deleting Tasks from Your Gantt Chart<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#deleting-tasks-from-your-gantt-chart" class="hash-link" aria-label="Direct link to Deleting Tasks from Your Gantt Chart" title="Direct link to Deleting Tasks from Your Gantt Chart" translate="no">​</a></h2>
<p>Let’s create a form that will allow us to delete tasks.</p>
<ol>
<li class="">In <code>index.html</code>, add the following "Delete tasks" form below the "Add task" form:</li>
</ol>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">form</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">delete-tasks</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">h2</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Delete tasks</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">h2</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">fieldset</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">tasks-checkbox-container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">legend</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Tasks</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">legend</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">fieldset</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Delete</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">form</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>We’ll create a dynamic group of checkboxes like we did with the "Add tasks" form dependencies.</p>
<ol start="2">
<li class="">At the top of <code>main.js</code>, add the following variable:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> deleteForm </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"delete-tasks"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<ol start="3">
<li class="">In <code>main.js</code>, add the following <code>deleteTasks</code> function below the <code>addTask</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">deleteTasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">preventDefault</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> formElements </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">target</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">elements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> taskCheckboxes </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> formElements</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"task"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> taskIds </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token plain">taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">length </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">checked</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> taskIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">push</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    taskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">forEach</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">checked</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> taskIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">push</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">taskIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">length </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// remove deleted tasks</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> filteredTasks </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">filter</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token plain">taskIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">includes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// remove deleted dependencies</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> newTasks </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> filteredTasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">map</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">dependencies</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">length </span><span class="token operator" style="color:rgb(212, 212, 212)">===</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> depsArr </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">dependencies</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> newDeps </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> depsArr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">filter</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">dep</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">!</span><span class="token plain">taskIds</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">includes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dep</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">...</span><span class="token plain">tsk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">dependencies</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> newDeps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  tasks </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> newTasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">refresh</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token function" style="color:rgb(220, 220, 170)">addTaskCheckboxes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>This function gets the tasks to delete from the checkboxes that were checked in the "Delete tasks" form and stores their task IDs in the <code>taskIds</code> variable. We loop through the <code>tasks</code> variable and remove the deleted tasks. We then loop through these tasks and remove any dependencies that no longer exist. We then update the Gantt chart with the new tasks state using the <code>refresh</code> method.</p>
<ol start="4">
<li class="">At the bottom of <code>main.js</code>, add the following event listener:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">deleteForm</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">addEventListener</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"submit"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> deleteTasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>You’ll now be able to delete tasks.</p>
<video controls="" playsinline="" src="/img/articles/creating-a-gantt-chart-frappe-vs-bryntum/frappe-gantt-delete.webm" title="Frappe Gantt - delete tasks"></video>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="changing-view-modes-in-your-gantt-chart">Changing View Modes in Your Gantt Chart<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#changing-view-modes-in-your-gantt-chart" class="hash-link" aria-label="Direct link to Changing View Modes in Your Gantt Chart" title="Direct link to Changing View Modes in Your Gantt Chart" translate="no">​</a></h2>
<p>The last feature that we’ll add to our Frappe Gantt chart will be some buttons that will allow us to change the time range view of the Gantt chart.</p>
<ol>
<li class="">In <code>index.html</code>, add the following lines below the "Delete tasks" form:</li>
</ol>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">chart-controls</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">h2</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Tracker Time Range</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">h2</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">button-container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">day-btn</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Day</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">week-btn</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Week</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">month-btn</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Month</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">button</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">          </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">In <code>main.js</code>, add the following function below the <code>addTaskCheckboxes</code> function:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">addViewModes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"day-btn"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">addEventListener</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"click"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">change_view_mode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Day"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"week-btn"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">addEventListener</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"click"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">change_view_mode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Week"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getElementById</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"month-btn"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">addEventListener</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"click"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    ganttChart</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">change_view_mode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Month"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<p>This function selects the buttons and adds "click" event listeners to them that change the Gantt chart’s view mode.</p>
<ol start="3">
<li class="">In <code>main.js</code>, add the following function call inside the <code>fetchData</code> function, below the <code>addTaskCheckboxes();</code> line:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">addViewModes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Now if you click one of the buttons, the time range view will change.</p>
<video controls="" playsinline="" src="/img/articles/creating-a-gantt-chart-frappe-vs-bryntum/frappe-gantt-time-range-change.webm" title="Frappe Gantt - time range change"></video>
<p>We’ve completed our basic Frappe Gantt chart, but the process was a little tedious and the library is a bit buggy. Now let’s create a Gantt chart using our <a href="https://bryntum.com/products/gantt/examples/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a> JavaScript component for comparison.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="creating-a-gantt-chart-using-bryntum">Creating a Gantt chart using Bryntum<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#creating-a-gantt-chart-using-bryntum" class="hash-link" aria-label="Direct link to Creating a Gantt chart using Bryntum" title="Direct link to Creating a Gantt chart using Bryntum" translate="no">​</a></h2>
<p>We’ve completed our Frappe Gantt chart. Now let’s see how the same result compares when using <a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a>, a commercial off-the-shelf Gantt component. Where Frappe Gantt required us to hand-code task management, view switching, and form handling, Bryntum Gantt ships all of that, and more, out of the box.</p>
<p>The starter repository contains all of the files that you’ll need to create the Gantt chart. It also uses <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer" class="">Vite</a>. To install Bryntum Gantt with npm, you’ll just need to install one library with zero external dependencies. If you are unfamiliar with Bryntum products, you can follow the <a href="https://www.bryntum.com/products/gantt/docs/guide/Gantt/quick-start/javascript-npm" target="_blank" rel="noopener noreferrer" class="">guide to installing the Gantt chart component using npm</a>.</p>
<ol>
<li class="">Clone the <a href="https://github.com/bryntum/bryntum-gantt-vanilla-js" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt chart starter GitHub repository</a>:</li>
</ol>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://github.com/bryntum/bryntum-gantt-vanilla-js</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(78, 201, 176)">cd</span><span class="token plain"> bryntum-gantt-vanilla-js</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">Install the dependencies:</li>
</ol>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><br></div></code></pre></div></div>
<ol start="3">
<li class="">Run the local development server:</li>
</ol>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> run dev</span><br></div></code></pre></div></div>
<p>You’ll see a blank page.</p>
<p>The <code>styles.css</code> file contains some basic styling for the Gantt chart. We set the <code>&lt;HTML&gt;</code> and <code>&lt;body&gt;</code> elements to have a height of 100vh so that the Bryntum Gantt chart will take up the full height of the screen. We also have custom styling for important tasks using the <code>is-important</code> class, as we did with the Frappe Gantt.</p>
<p>The data for the Gantt chart is in the <code>data.json</code> file in the <code>public/data</code> folder. There is one important task in the data. It has a <a href="https://www.bryntum.com/products/scheduler/docs/api/Core/widget/Widget#property-cls" target="_blank" rel="noopener noreferrer" class=""><code>cls</code></a> property value of <code>is-important</code>. This is a custom CSS class.</p>
<p>The data is similar to the Frappe Gantt data. There is a parent row called "Launch SaaS Product" that contains the tasks data. This row is expandable. This feature is especially useful if there is a lot of data.</p>
<p>Now let’s create a simple Bryntum Gantt chart.</p>
<ol start="4">
<li class="">Add the following CSS imports to the top of <code>styles.css</code>:</li>
</ol>
<div class="language-css codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-css codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">"@bryntum/gantt/fontawesome/css/fontawesome.css"</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">"@bryntum/gantt/fontawesome/css/solid.css"</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">"@bryntum/gantt/gantt.css"</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token atrule rule">@import</span><span class="token atrule"> </span><span class="token atrule string" style="color:rgb(206, 145, 120)">"@bryntum/gantt/svalbard-light.css"</span><span class="token atrule punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>This imports the structural CSS, the Svalbard Light theme, and the FontAwesome icons used by the component. Bryntum Gantt ships several themes. You can see a demo of the available themes <a href="https://bryntum.com/products/gantt/examples/theme/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<ol start="5">
<li class="">Add the following lines to <code>main.js</code>:</li>
</ol>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Gantt </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"@bryntum/gantt"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">appendTo</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> document</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">project</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">transport</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token literal-property property">load</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token literal-property property">url</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"data/data.json"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">autoLoad</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">columns</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"name"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">text</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"Tasks"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>We import the Bryntum Gantt component and create a new Gantt instance, passing it a configuration object.</p>
<p>We configured the <a href="https://www.bryntum.com/products/gantt/docs/guide/Gantt/data/crud_manager" target="_blank" rel="noopener noreferrer" class="">project</a> with the transport property to populate the Gantt chart’s data stores. We’ve configured the <code>url</code> to load data using the load property. You can also configure the transport to sync data changes to a specific URL. For more information, you can read the <a href="https://www.bryntum.com/products/gantt/docs/guide/Gantt/data/project_data" target="_blank" rel="noopener noreferrer" class="">project data guide</a> in our docs.</p>
<p>We also created a single task column to display the tasks.</p>
<p>Now, when you run your development server, you’ll see the Bryntum Gantt chart:</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt" src="https://www.react-gantt.com/assets/images/bryntum-gantt-422ce33c4ced500ecd26d74f29494e78.png" width="2880" height="1064" class="img_Z5b4"></p>
<p>This basic example of the Bryntum Gantt component has more features by default than the Frappe Gantt chart that we created. The features include:</p>
<ul>
<li class="">Collapsible task groups.</li>
<li class="">Drag-and-drop re-ordering of tasks.</li>
<li class="">Add, edit, copy, and delete tasks. Right-click on a task to see a pop-up menu with these actions and more, including editing dependencies.</li>
<li class="">Draggable task durations.</li>
<li class="">Resizeable task durations. Hover over the left or right side of a task duration until the cursor changes to a resize icon. Then click and drag left or right.</li>
<li class="">Create task dependencies. Hover over the left or right side of a task duration until you see a circle icon. Then click and drag to connect the task to another task.</li>
<li class="">Filter tasks by name.</li>
<li class="">Change date ranges.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt - date row popup" src="https://www.react-gantt.com/assets/images/bryntum-gantt-popup-b5e2b6334a56d0ca8fcfb376528b3764.png" width="2753" height="876" class="img_Z5b4"></p>
<p>Try out some of these features in your app.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="frappe-gantt-vs-bryntum-gantt">Frappe Gantt vs Bryntum Gantt<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#frappe-gantt-vs-bryntum-gantt" class="hash-link" aria-label="Direct link to Frappe Gantt vs Bryntum Gantt" title="Direct link to Frappe Gantt vs Bryntum Gantt" translate="no">​</a></h2>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th>Area</th><th>Frappe Gantt</th><th>Bryntum Gantt</th></tr></thead><tbody><tr><td>License</td><td>Open source (MIT)</td><td>Commercial</td></tr><tr><td>Built-in interactions</td><td>Drag, resize, progress, dependencies, view modes</td><td>Drag, resize, progress, dependencies, view modes, task editing, context menus, filtering, columns, and more</td></tr><tr><td>Extra code in this tutorial</td><td>Forms, deletion, dependency inputs, view buttons, state syncing</td><td>None: the basic example includes it</td></tr><tr><td>Data format</td><td>Task objects with <code>id</code>, <code>name</code>, <code>start</code>, <code>end</code>, <code>progress</code>, <code>dependencies</code></td><td>Project config with a data URL</td></tr><tr><td>Best fit</td><td>Lightweight charts where you own the app logic</td><td>Production apps where support and built-in features matter</td></tr></tbody></table></div>
<p>Both libraries produce a working Gantt chart. The real question is how much you want to build around it. Bryntum has task editing, filtering, context menus, and <a href="https://bryntum.com/products/gantt/examples/" target="_blank" rel="noopener noreferrer" class="">more built in</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="build-or-buy-evaluating-open-source-gantt-chart-libraries">Build or Buy? Evaluating Open Source Gantt Chart Libraries<a href="https://www.react-gantt.com/content/creating-a-gantt-chart-frappe-vs-bryntum/#build-or-buy-evaluating-open-source-gantt-chart-libraries" class="hash-link" aria-label="Direct link to Build or Buy? Evaluating Open Source Gantt Chart Libraries" title="Direct link to Build or Buy? Evaluating Open Source Gantt Chart Libraries" translate="no">​</a></h2>
<p>This Gantt chart tutorial gives you a starting point for building with Frappe Gantt. If you’re instead looking to buy an off-the-shelf, battle-tested solution that just works, take a look at some examples of our <a href="https://bryntum.com/products/gantt/examples/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a>. With the Bryntum Gantt component, you can:</p>
<ul>
<li class="">Schedule tasks using dependencies and constraints.</li>
<li class="">Leverage calendars for projects, tasks, and resources.</li>
<li class="">Use recurrent and fixed time intervals.</li>
<li class="">Customize rendering and styling.</li>
<li class="">Customize user experience through many different column types and task editors.</li>
<li class="">Deal with extensive data sets and performance tuning.</li>
</ul>
<p>We also have a <a href="https://forum.bryntum.com/" target="_blank" rel="noopener noreferrer" class="">support forum</a> and offer <a href="https://www.bryntum.com/services/" target="_blank" rel="noopener noreferrer" class="">professional services</a>.</p>]]></content:encoded>
            <category>bryntum</category>
            <category>gantt</category>
            <category>comparison</category>
        </item>
        <item>
            <title><![CDATA[DHTMLX Gantt alternatives]]></title>
            <link>https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/</link>
            <guid>https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[DHTMLX Gantt is a JavaScript Gantt library with a GPL licensed Standard edition covering drag and drop, dependency links, and basic task rendering.]]></description>
            <content:encoded><![CDATA[<p><a href="https://dhtmlx.com/docs/products/dhtmlxGantt/" target="_blank" rel="noopener noreferrer" class="">DHTMLX Gantt</a> is a JavaScript Gantt library with a GPL-licensed <strong>Standard</strong> edition covering drag-and-drop, dependency links, and basic task rendering. If you're looking for an alternative, you're likely trying to avoid the paid <strong>Pro</strong> gate for auto-scheduling, critical path, resource management, baselines, and task splitting, or you need client-side export instead of DHTMLX's online export service.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="what-to-know-about-dhtmlx-gantt-alternatives">What to know about DHTMLX Gantt alternatives<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#what-to-know-about-dhtmlx-gantt-alternatives" class="hash-link" aria-label="Direct link to What to know about DHTMLX Gantt alternatives" title="Direct link to What to know about DHTMLX Gantt alternatives" translate="no">​</a></h2>
<p>The table below compares licensing, scheduling features, framework support, package access, and MCP support.</p>
<div class="table-scroll-wrapper" role="region" aria-label="Scrollable table" tabindex="0"><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:left">Syncfusion Gantt</th><th style="text-align:left">ScheduleJS</th><th style="text-align:left">Netronic VSW SE</th><th style="text-align:left">Bryntum Gantt</th></tr></thead><tbody><tr><td style="text-align:left">License</td><td style="text-align:left"><strong>Community License</strong> (free) / <strong>Commercial</strong></td><td style="text-align:left"><strong>Commercial</strong> (from 1,500 EUR)</td><td style="text-align:left"><strong>Commercial</strong> (quote-based)</td><td style="text-align:left"><strong>Commercial</strong></td></tr><tr><td style="text-align:left">Free tier</td><td style="text-align:left"><strong>Community License</strong></td><td style="text-align:left">None</td><td style="text-align:left">None</td><td style="text-align:left">Trial only</td></tr><tr><td style="text-align:left">Auto-scheduling</td><td style="text-align:left">✔️</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td><td style="text-align:left">✔️</td></tr><tr><td style="text-align:left">Critical path</td><td style="text-align:left">✔️</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td><td style="text-align:left">✔️</td></tr><tr><td style="text-align:left">Resource management</td><td style="text-align:left">✔️</td><td style="text-align:left">✔️ (rows)</td><td style="text-align:left">✔️</td><td style="text-align:left">✔️</td></tr><tr><td style="text-align:left">Framework support</td><td style="text-align:left">React, Angular, Vue, Blazor</td><td style="text-align:left">Angular only</td><td style="text-align:left">Framework-agnostic</td><td style="text-align:left">React, Angular, Vue, plain JavaScript</td></tr><tr><td style="text-align:left">Public npm</td><td style="text-align:left">✔️</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td><td style="text-align:left">Trial packages and wrappers</td></tr><tr><td style="text-align:left">Agent support (MCP, skills)</td><td style="text-align:left">stdio MCP server (JavaScript / React)</td><td style="text-align:left">❌</td><td style="text-align:left">❌</td><td style="text-align:left">HTTP MCP server, Claude Code skill</td></tr></tbody></table></div>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt">Syncfusion Gantt<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#syncfusion-gantt" class="hash-link" aria-label="Direct link to Syncfusion Gantt" title="Direct link to Syncfusion Gantt" translate="no">​</a></h2>
<p><a href="https://www.syncfusion.com/javascript-ui-controls/js-gantt-chart" target="_blank" rel="noopener noreferrer" class="">Syncfusion Gantt</a> is a commercial JavaScript Gantt component that includes auto-scheduling, critical path, baselines, task splitting, resource management, and undo/redo. The <strong>Community License</strong> makes it free for qualifying organizations: less than $1 million in annual gross revenue, five or fewer developers, and 10 or fewer total employees.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="installing-syncfusion-gantt">Installing Syncfusion Gantt<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#installing-syncfusion-gantt" class="hash-link" aria-label="Direct link to Installing Syncfusion Gantt" title="Direct link to Installing Syncfusion Gantt" translate="no">​</a></h3>
<p>The package is on the public npm registry:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @syncfusion/ej2-gantt@33.2.4</span><br></div></code></pre></div></div>
<p>A license key suppresses the trial validation banner. <strong>Community License</strong> holders generate a key from the Syncfusion account portal, then register it before initializing any component. This minimal setup shows a two-phase project with a dependency:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">&lt;!-- index.html --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">html</span><span class="token style language-css selector punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css selector" style="color:rgb(215, 186, 125)"> body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">margin</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">0</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">%</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector id" style="color:rgb(215, 186, 125)">#container</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">vh</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> registerLicense </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Selection</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Toolbar </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-base/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-buttons/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-calendars/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-dropdowns/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-inputs/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-navigations/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-popups/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-richtexteditor/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-treegrid/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-grids/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@syncfusion/ej2-gantt/styles/material.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">registerLicense</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key-here'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">Inject</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Edit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Selection</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Toolbar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">TaskID</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Phase 1: Discovery'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">subtasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Requirements'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">TaskID</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">TaskName</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Design'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       </span><span class="token literal-property property">StartDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-08'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Progress</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">Predecessor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">dataSource</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">height</span><span class="token plain">     </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'100%'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">taskFields</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">id</span><span class="token plain">         </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskID'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">name</span><span class="token plain">       </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'StartDate'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">duration</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">progress</span><span class="token plain">   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Progress'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">dependency</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Predecessor'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">child</span><span class="token plain">      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'subtasks'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">columns</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">headerText</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Task'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">headerText</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">field</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Progress'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">headerText</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'%'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">        </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">labelSettings</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">leftLabel</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'TaskName'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">splitterSettings</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">position</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'40%'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">projectStartDate</span><span class="token plain">  </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-01'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">projectEndDate</span><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Date</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'2026-05-20'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">toolbar</span><span class="token plain">           </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'ZoomIn'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'ZoomOut'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'ZoomToFit'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">highlightWeekends</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">appendTo</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'#container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Four setup details require attention:</p>
<ul>
<li class="">The <code>Gantt.Inject()</code> call must come before instantiation with any feature modules (<code>Edit</code>, <code>Selection</code>, <code>Toolbar</code>, and others).</li>
<li class="">CSS must cover the Gantt component and all its dependencies. Replace these styles with a single Syncfusion combined theme file to consolidate imports.</li>
<li class="">The <code>taskFields</code> config maps data property names to Gantt field identifiers.</li>
<li class="">The <code>registerLicense()</code> call must come before the first component mounts.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Syncfusion Gantt rendering a project with task dependencies and progress indicators" src="https://www.react-gantt.com/assets/images/syncfusion-gantt-77a9b1156ed39130b3014fcc7a7d47a8.png" width="1280" height="720" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="community-license-includes-all-scheduling-features-for-qualifying-organizations-at-no-cost"><strong>Community License</strong> includes all scheduling features for qualifying organizations at no cost<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#community-license-includes-all-scheduling-features-for-qualifying-organizations-at-no-cost" class="hash-link" aria-label="Direct link to community-license-includes-all-scheduling-features-for-qualifying-organizations-at-no-cost" title="Direct link to community-license-includes-all-scheduling-features-for-qualifying-organizations-at-no-cost" translate="no">​</a></h3>
<p>Qualifying organizations get these features at no cost through the <strong>Community License</strong>, with no feature gating between community and commercial tiers:</p>
<ul>
<li class="">Auto-scheduling</li>
<li class="">Critical path</li>
<li class="">Baselines</li>
<li class="">Task splitting</li>
<li class="">Resource management</li>
<li class="">Undo/redo</li>
</ul>
<p>Export to PDF, Excel, and CSV runs client-side. Framework wrappers cover React, Angular, Vue, and Blazor. It is the only alternative in this comparison with auto-scheduling, critical path, and baselines available through a free tier.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-requires-per-feature-css-imports-inject-calls-and-stdio-mcp-setup">Syncfusion Gantt requires per-feature CSS imports, Inject calls, and stdio MCP setup<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#syncfusion-gantt-requires-per-feature-css-imports-inject-calls-and-stdio-mcp-setup" class="hash-link" aria-label="Direct link to Syncfusion Gantt requires per-feature CSS imports, Inject calls, and stdio MCP setup" title="Direct link to Syncfusion Gantt requires per-feature CSS imports, Inject calls, and stdio MCP setup" translate="no">​</a></h3>
<p>CSS setup requires either a combined Syncfusion theme file or separate imports for the Gantt component and all its dependencies. The <code>Gantt.Inject()</code> call for each feature module adds a setup step that teams often miss.</p>
<p>Paid licensing uses custom pricing with no published rates. Teams that exceed <strong>Community License</strong> thresholds need to contact Syncfusion sales.</p>
<p>The Syncfusion JavaScript and React MCP servers communicate via stdio, not HTTP. They require MCP client configuration with an API key rather than a public HTTP URL. Unlike the DHTMLX Gantt and Bryntum Gantt HTTP servers, which work in Claude Code without API key configuration, the Syncfusion stdio servers require additional client-side setup.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="syncfusion-gantt-pricing-free-community-license-commercial-rates-on-request">Syncfusion Gantt pricing: free <strong>Community License</strong>, commercial rates on request<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#syncfusion-gantt-pricing-free-community-license-commercial-rates-on-request" class="hash-link" aria-label="Direct link to syncfusion-gantt-pricing-free-community-license-commercial-rates-on-request" title="Direct link to syncfusion-gantt-pricing-free-community-license-commercial-rates-on-request" translate="no">​</a></h3>
<p>The <strong>Community License</strong> is free for organizations with less than $1 million in annual gross revenue, five or fewer developers, and 10 or fewer total employees (and less than $3 million in external funding). Paid licensing uses quote-based subscription pricing.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs">ScheduleJS<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#schedulejs" class="hash-link" aria-label="Direct link to ScheduleJS" title="Direct link to ScheduleJS" translate="no">​</a></h2>
<p><a href="https://schedulejs.com/" target="_blank" rel="noopener noreferrer" class="">ScheduleJS</a> is a commercial Angular Gantt library that renders to an HTML Canvas element rather than DOM elements, which suits applications that need smooth scrolling at very large row counts. The library handles rendering and interaction but leaves scheduling logic, auto-scheduling, critical path, and export to the application.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="installing-schedulejs">Installing ScheduleJS<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#installing-schedulejs" class="hash-link" aria-label="Direct link to Installing ScheduleJS" title="Direct link to Installing ScheduleJS" translate="no">​</a></h3>
<p>ScheduleJS is not on the public npm registry. After purchasing a license from AISO SA and receiving the package, place it in a <code>local_modules/</code> folder in the project root and install it as a local file reference:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">yarn</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">add</span><span class="token plain"> file:./local_modules/schedule</span><br></div></code></pre></div></div>
<p>ScheduleJS targets Angular. A new Angular project provides the required shell:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token plain">ng new project-name </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">--style</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">scss</span><br></div></code></pre></div></div>
<p>The following shows a team sprint Gantt with two members. Setup spans three files: the Angular module, the component class, and the component template.</p>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// app.module.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">NgModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/platform-browser'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Locale</span><span class="token imports"> </span><span class="token imports keyword module" style="color:rgb(86, 156, 214)">as</span><span class="token imports"> </span><span class="token imports maybe-class-name">BaseLocaleEnUs</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@js-joda/locale/dist/prebuilt/en-us'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">LicenseManager</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Locale</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">ScheduleModule</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">AppComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./app.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">SprintGanttComponent</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./sprint-gantt/sprint-gantt.component'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">NgModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  declarations </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">SprintGanttComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  imports      </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">BrowserModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token maybe-class-name">ScheduleModule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  bootstrap    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token maybe-class-name">AppComponent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token function" style="color:rgb(220, 220, 170)">constructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token maybe-class-name">Locale</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">updateDefault</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token maybe-class-name">BaseLocaleEnUs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token constant" style="color:rgb(100, 102, 149)">US</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token maybe-class-name">LicenseManager</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">setLicenseFromKey</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'your-license-key-here'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<div class="language-typescript codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-typescript codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// sprint-gantt.component.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Component</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Injector</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@angular/core'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">AppTransactionalService</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">ChronoUnit</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">DefaultScheduleGanttComponentBase</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">GanttChart</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">Layer</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">MutableActivityBase</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">Row</span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports">  </span><span class="token imports maybe-class-name">TimeUtil</span><span class="token imports"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token imports"></span><span class="token imports punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'schedule'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">Task</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">MutableActivityBase</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token class-name" style="color:rgb(78, 201, 176)"> name</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">:</span><span class="token class-name" style="color:rgb(78, 201, 176)"> </span><span class="token class-name builtin" style="color:rgb(86, 156, 214)">string</span><span class="token class-name" style="color:rgb(78, 201, 176)"> </span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token function" style="color:rgb(220, 220, 170)">constructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">string</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> startHours</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">number</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> durationHours</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">number</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token maybe-class-name">TimeUtil</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">now</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token maybe-class-name">TimeUtil</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">ofHours</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">startHours</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> end   </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token maybe-class-name">TimeUtil</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">ofHours</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">durationHours</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">super</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> end</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">setUserObject</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> name </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">TeamMember</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">Row</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token class-name keyword nil" style="color:rgb(86, 156, 214)">undefined</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token class-name" style="color:rgb(78, 201, 176)"> </span><span class="token class-name keyword nil" style="color:rgb(86, 156, 214)">undefined</span><span class="token class-name punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token class-name" style="color:rgb(78, 201, 176)"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">Task</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token decorator at operator" style="color:rgb(212, 212, 212)">@</span><span class="token decorator function" style="color:rgb(220, 220, 170)">Component</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  selector    </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'app-sprint-gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  templateUrl </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'./sprint-gantt.component.html'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  styleUrls   </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'./sprint-gantt.component.scss'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword module" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">SprintGanttComponent</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">extends</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">DefaultScheduleGanttComponentBase</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">TeamMember</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  gantt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">GanttChart</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">TeamMember</span><span class="token class-name operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token keyword nil" style="color:rgb(86, 156, 214)">undefined</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">_injector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token function" style="color:rgb(220, 220, 170)">constructor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    _appTransactionalService</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">AppTransactionalService</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    _injector</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Injector</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">super</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">_appTransactionalService</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> _injector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token function" style="color:rgb(220, 220, 170)">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> tasksLayer </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">Layer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'Tasks'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">getLayers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">push</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasksLayer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> alice </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">TeamMember</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'Alice (Frontend)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    alice</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">addActivity</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasksLayer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">Task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'UI Component Library'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">40</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> bob </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">TeamMember</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'Bob (Backend)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    bob</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">addActivity</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">tasksLayer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name" style="color:rgb(78, 201, 176)">Task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'REST API Development'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">40</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">addRows</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">alice</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> bob</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">this</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token property-access">gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">getTimeline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">showTemporalUnit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token maybe-class-name">ChronoUnit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token constant" style="color:rgb(100, 102, 149)">DAYS</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">200</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></div></code></pre></div></div>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">&lt;!-- sprint-gantt.component.html --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">default-schedule-button-bar</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[gantt]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">gantt</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">default-schedule-button-bar</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">timeline-container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">timeline-filler</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">timeline</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">schedule-date-line</span><span class="token tag" style="color:rgb(78, 201, 176)">  </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[gantt]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">gantt</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">schedule-date-line</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">schedule-event-line</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[gantt]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">gantt</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">schedule-event-line</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">default-schedule-gantt-graphic</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">  </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">gantt-graphic</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">  </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[gantt]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">gantt</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag" style="color:rgb(78, 201, 176)"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token tag" style="color:rgb(78, 201, 176)">  </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">[ganttContainerElement]</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">nativeElement</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">default-schedule-gantt-graphic</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>Four setup details require attention:</p>
<ul>
<li class="">The <code>LicenseManager.setLicenseFromKey()</code> call must come before any ScheduleJS component mounts.</li>
<li class="">The package name is <code>schedule</code>, not <code>schedulejs</code>. All import paths use <code>'schedule'</code>.</li>
<li class="">Resources are <code>Row</code> subclasses and task bars are <code>MutableActivityBase</code> subclasses. The library uses class extension rather than configuration objects.</li>
<li class="">Extend <code>DefaultScheduleGanttComponentBase</code> to wire up the Angular lifecycle.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="ScheduleJS Gantt showing two resources with canvas-rendered activity bars across a day timeline" src="https://www.react-gantt.com/assets/images/schedulejs-gantt-e1757a56f158db618475011ecc54bb6d.png" width="684" height="380" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-suits-large-angular-datasets-that-push-dom-rendering-to-its-limits">ScheduleJS suits large Angular datasets that push DOM rendering to its limits<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#schedulejs-suits-large-angular-datasets-that-push-dom-rendering-to-its-limits" class="hash-link" aria-label="Direct link to ScheduleJS suits large Angular datasets that push DOM rendering to its limits" title="Direct link to ScheduleJS suits large Angular datasets that push DOM rendering to its limits" translate="no">​</a></h3>
<p>Canvas rendering keeps the component fast at very large activity counts. The class-extension data model gives pixel-level control over activity renderers, row heights, and interaction layers. Three layout types ship: Gantt layout, chart or histogram layout, and agenda layout.</p>
<p>ScheduleJS suits the specific case where the dataset is large enough to push DOM rendering to its limits and the target framework is Angular. Like Netronic VSW SE, it uses canvas rendering for performance at large activity counts, but targets Angular specifically rather than offering a framework-agnostic API.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-has-no-scheduling-engine-no-public-npm-package-and-supports-only-angular">ScheduleJS has no scheduling engine, no public npm package, and supports only Angular<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#schedulejs-has-no-scheduling-engine-no-public-npm-package-and-supports-only-angular" class="hash-link" aria-label="Direct link to ScheduleJS has no scheduling engine, no public npm package, and supports only Angular" title="Direct link to ScheduleJS has no scheduling engine, no public npm package, and supports only Angular" translate="no">​</a></h3>
<p>ScheduleJS is Angular-only. React, Vue, and vanilla JavaScript applications require a different library.</p>
<p>The library provides ActivityLink visualization but no project scheduling engine. Applications need custom implementation for:</p>
<ul>
<li class="">Auto-scheduling</li>
<li class="">Critical path</li>
<li class="">Baselines</li>
<li class="">Task splitting</li>
<li class="">Undo/redo</li>
<li class="">PDF or Excel export</li>
</ul>
<p>The local file install adds friction at onboarding and in automated pipelines. ScheduleJS and Netronic VSW SE both require a manual distribution step that Syncfusion Gantt and DHTMLX Gantt avoid with public npm packages.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="schedulejs-pricing-from-1500-eur-perpetual-license-per-developer-and-application">ScheduleJS pricing: from 1,500 EUR, perpetual license per developer and application<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#schedulejs-pricing-from-1500-eur-perpetual-license-per-developer-and-application" class="hash-link" aria-label="Direct link to ScheduleJS pricing: from 1,500 EUR, perpetual license per developer and application" title="Direct link to ScheduleJS pricing: from 1,500 EUR, perpetual license per developer and application" translate="no">​</a></h3>
<p>AISO SA publishes pricing from 1,500 EUR for the ScheduleJS <strong>Enterprise</strong> perpetual license. The license includes one year of updates, support, and maintenance for one application and one developer.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se">Netronic VSW SE<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#netronic-vsw-se" class="hash-link" aria-label="Direct link to Netronic VSW SE" title="Direct link to Netronic VSW SE" translate="no">​</a></h2>
<p><a href="https://www.netronic.com/html5-gantt-chart-javascript-scheduler" target="_blank" rel="noopener noreferrer" class="">Netronic Visual Scheduling Widget SE</a> is a commercial JavaScript scheduling widget that renders to an HTML Canvas element. It works with any JavaScript framework and includes resource timelines, resource histograms, drag-and-drop, work calendars, and PDF export. Auto-scheduling, critical path, and baselines are absent.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="installing-netronic-vsw-se">Installing Netronic VSW SE<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#installing-netronic-vsw-se" class="hash-link" aria-label="Direct link to Installing Netronic VSW SE" title="Direct link to Installing Netronic VSW SE" translate="no">​</a></h3>
<p>Netronic VSW SE is not on the public npm registry. Teams go through an evaluation or purchase flow with Netronic GmbH, then download the bundle from the customer portal and place it in the project manually. Version 9.0 added ESM and TypeScript support for modern build setups. Teams should plan around four setup details from the public Netronic documentation:</p>
<ul>
<li class="">Teams should expect a sales or evaluation flow rather than a public npm install.</li>
<li class="">The widget delegates data management and business logic to the host application.</li>
<li class="">No wrapper package exists for React, Angular, or Vue. The API-driven configuration works with any JavaScript environment.</li>
<li class="">Canvas-based rendering means DOM inspection tools show a single canvas element rather than individual task bar elements.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Netronic VSW SE showing a resource timeline with production orders, dependency arrows, histograms, and milestones" src="https://www.react-gantt.com/assets/images/netronic-vsw-se-e8a8b97b25fa141f0e2fd4f40eb16f7f.png" width="1165" height="610" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-suits-framework-agnostic-canvas-based-scheduling-at-large-activity-counts">Netronic VSW SE suits framework-agnostic canvas-based scheduling at large activity counts<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#netronic-vsw-se-suits-framework-agnostic-canvas-based-scheduling-at-large-activity-counts" class="hash-link" aria-label="Direct link to Netronic VSW SE suits framework-agnostic canvas-based scheduling at large activity counts" title="Direct link to Netronic VSW SE suits framework-agnostic canvas-based scheduling at large activity counts" translate="no">​</a></h3>
<p>Canvas rendering keeps the widget fast at large activity counts. The framework-agnostic API works in React, Angular, Vue, or plain JavaScript without a wrapper package. Resource histograms, work calendars, and PDF export are included without custom implementation.</p>
<p>Netronic VSW SE fills the gap that ScheduleJS leaves for non-Angular applications: canvas performance and resource histograms across any JavaScript environment. Unlike ScheduleJS, which also uses canvas rendering but requires Angular, Netronic VSW SE works with React, Vue, and plain JavaScript without a wrapper.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-has-no-auto-scheduling-no-critical-path-and-no-public-npm-package">Netronic VSW SE has no auto-scheduling, no critical path, and no public npm package<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#netronic-vsw-se-has-no-auto-scheduling-no-critical-path-and-no-public-npm-package" class="hash-link" aria-label="Direct link to Netronic VSW SE has no auto-scheduling, no critical path, and no public npm package" title="Direct link to Netronic VSW SE has no auto-scheduling, no critical path, and no public npm package" translate="no">​</a></h3>
<p>These features are absent:</p>
<ul>
<li class="">Auto-scheduling</li>
<li class="">Critical path</li>
<li class="">Baselines</li>
<li class="">Task splitting</li>
<li class="">Undo/redo</li>
</ul>
<p>Applications that need these features require custom implementation. The local bundle distribution adds friction at onboarding and in automated pipelines. Netronic VSW SE and ScheduleJS both omit auto-scheduling and critical path, while Syncfusion Gantt and Bryntum Gantt include both without a paid upgrade.</p>
<p>Pricing is quote-based with no published rates. Teams cannot compare costs directly without contacting Netronic sales. Netronic ships no MCP server, no Claude Code skill, and no AI tooling.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="netronic-vsw-se-pricing-quote-based-with-no-published-rates">Netronic VSW SE pricing: quote-based with no published rates<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#netronic-vsw-se-pricing-quote-based-with-no-published-rates" class="hash-link" aria-label="Direct link to Netronic VSW SE pricing: quote-based with no published rates" title="Direct link to Netronic VSW SE pricing: quote-based with no published rates" translate="no">​</a></h3>
<p>Netronic VSW SE uses commercial quote-based pricing. No standard rates are published on the product page. A trial version is available for evaluation before purchase.</p>
<h2 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt">Bryntum Gantt<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#bryntum-gantt" class="hash-link" aria-label="Direct link to Bryntum Gantt" title="Direct link to Bryntum Gantt" translate="no">​</a></h2>
<p><a href="https://bryntum.com/products/gantt/" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt</a> is a commercial JavaScript Gantt component built on <a href="https://github.com/bryntum/chronograph" target="_blank" rel="noopener noreferrer" class="">ChronoGraph</a>, an open-source reactive scheduling engine. These features are all in the base license:</p>
<ul>
<li class="">Auto-scheduling</li>
<li class="">Critical path</li>
<li class="">Resource management</li>
<li class="">Baselines</li>
<li class="">Task splitting</li>
<li class="">Client-side export</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="installing-bryntum-gantt">Installing Bryntum Gantt<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#installing-bryntum-gantt" class="hash-link" aria-label="Direct link to Installing Bryntum Gantt" title="Direct link to Installing Bryntum Gantt" translate="no">​</a></h3>
<p>The <a href="https://www.npmjs.com/package/@bryntum/gantt-trial" target="_blank" rel="noopener noreferrer" class="">trial package</a> is on the public npm registry without authentication:</p>
<div class="language-bash codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-bash codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> @bryntum/gantt@npm:@bryntum/gantt-trial@7.3.0</span><br></div></code></pre></div></div>
<p>This minimal setup shows a two-task project with a dependency. Three CSS imports are required in order before instantiation:</p>
<div class="language-html codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-html codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">&lt;!-- index.html --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">html</span><span class="token style language-css selector punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css selector" style="color:rgb(215, 186, 125)"> body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">margin</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">0</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">%</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css">  </span><span class="token style language-css selector id" style="color:rgb(215, 186, 125)">#container</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">height</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">100</span><span class="token style language-css unit">vh</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token style language-css"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">container</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">div</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<div class="language-js codeBlockContainer_nU9e theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_VAMU"><pre tabindex="0" class="prism-code language-js codeBlock_sWHK thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_utWd"><div class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/fontawesome.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/fontawesome/css/solid.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/gantt.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt/svalbard-light.css'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> Gantt </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'@bryntum/gantt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Gantt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">appendTo</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'container'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">columns</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">        </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">250</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'duration'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'percentdone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">width</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">60</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">project</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">tasks</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Launch SaaS Product'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">expanded</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">35.7</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token literal-property property">children</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Install Apache'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Configure firewall'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-14'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">id</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">name</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Run tests'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">          </span><span class="token literal-property property">startDate</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'2025-01-21'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">duration</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">percentDone</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token literal-property property">dependencies</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">11</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">lag</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> </span><span class="token literal-property property">fromTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token literal-property property">toTask</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">15</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>The three CSS imports cover FontAwesome icons, the structural <code>gantt.css</code>, and a theme file. Bryntum ships 10 themes across five light/dark pairs, all switchable at runtime via <code>DomHelper.setTheme()</code>.</p>
<p><img decoding="async" loading="lazy" alt="Bryntum Gantt rendering a project with phases, task dependencies, and progress indicators" src="https://www.react-gantt.com/assets/images/bryntum-gantt-805d816cb63a4950212be0a24e977e59.png" width="1440" height="850" class="img_Z5b4"></p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="chronograph-scheduling-engine-auto-scheduling-critical-path-and-client-side-export">ChronoGraph scheduling engine, auto-scheduling, critical path, and client-side export<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#chronograph-scheduling-engine-auto-scheduling-critical-path-and-client-side-export" class="hash-link" aria-label="Direct link to ChronoGraph scheduling engine, auto-scheduling, critical path, and client-side export" title="Direct link to ChronoGraph scheduling engine, auto-scheduling, critical path, and client-side export" translate="no">​</a></h3>
<p>The ChronoGraph scheduling engine is the primary differentiator. Auto-scheduling, dependencies, constraints, and project, task, and resource calendars work together through the engine. ChronoGraph is open-source under the MIT license, so the reactive scheduling logic is auditable.</p>
<p>The base license also includes:</p>
<ul>
<li class="">Auto-scheduling and critical path</li>
<li class="">Resource management and baselines</li>
<li class="">Task splitting and undo/redo</li>
<li class="">Client-side export to PDF, PNG, Excel, ICS, and MS Project XML</li>
<li class="">MS Project and Primavera P6 import through MPXJ</li>
<li class="">45 built-in locales</li>
<li class="">Virtual rendering for large datasets</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-4-mb-bundle-and-separate-project-and-gantt-configuration-objects">Bryntum Gantt: 4 MB bundle and separate project and Gantt configuration objects<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#bryntum-gantt-4-mb-bundle-and-separate-project-and-gantt-configuration-objects" class="hash-link" aria-label="Direct link to Bryntum Gantt: 4 MB bundle and separate project and Gantt configuration objects" title="Direct link to Bryntum Gantt: 4 MB bundle and separate project and Gantt configuration objects" translate="no">​</a></h3>
<p>The trial watermark persists during evaluation, which complicates stakeholder demos before a license purchase. The API surface is large: project-level and Gantt-level configuration are separate objects with different responsibilities. Mixing the <code>project</code> prop with inline data props (<code>tasks</code>, <code>dependencies</code>, <code>resources</code>) throws at runtime. The uncompressed bundle exceeds 4 MB.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="bryntum-gantt-pricing-940-per-developer-perpetual-license-with-12-months-of-updates">Bryntum Gantt pricing: $940 per developer, perpetual license with 12 months of updates<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#bryntum-gantt-pricing-940-per-developer-perpetual-license-with-12-months-of-updates" class="hash-link" aria-label="Direct link to Bryntum Gantt pricing: $940 per developer, perpetual license with 12 months of updates" title="Direct link to Bryntum Gantt pricing: $940 per developer, perpetual license with 12 months of updates" translate="no">​</a></h3>
<p>Per-developer licensing starts at $940. A three-person team pays $2,820 as an entry cost. All licenses are perpetual and include 12 months of updates. OEM licensing for SaaS applications requires a separate quote.</p>
<h3 class="anchor anchorTargetStickyNavbar_dUaO" id="mcp-server-and-claude-code-skill">MCP server and Claude Code skill<a href="https://www.react-gantt.com/content/alternatives-to-dhtmlx-gantt/#mcp-server-and-claude-code-skill" class="hash-link" aria-label="Direct link to MCP server and Claude Code skill" title="Direct link to MCP server and Claude Code skill" translate="no">​</a></h3>
<p>Bryntum ships two complementary AI tools: an MCP server for documentation retrieval and a Claude Code skill for agent-level judgment about common coding mistakes.</p>
<p>The MCP server at <code>mcp.bryntum.com</code> exposes a <code>search_bryntum_docs</code> tool that returns version-specific documentation, source code examples, and API references for Gantt and the rest of the Bryntum suite. The Claude Code skill covers the mistakes documentation retrieval alone misses: CSS import order, the project-vs-inline-data constraint, and the correct dark mode pattern via <code>DomHelper.setTheme()</code>.</p>
<p>Bryntum also ships an experimental, disabled-by-default AI assistant for Gantt. End users interact with the project data through natural language without touching the interface directly.</p>
<p>The <a href="https://bryntum.com/download/?product=gantt" target="_blank" rel="noopener noreferrer" class="">Bryntum Gantt free trial</a> includes auto-scheduling, critical path, and client-side export alongside the MCP server, Claude Code skill, and public npm trial package.</p>]]></content:encoded>
            <category>dhtmlx</category>
            <category>gantt</category>
        </item>
    </channel>
</rss>