{"id":11812,"date":"2023-10-17T15:12:03","date_gmt":"2023-10-17T12:12:03","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=11812"},"modified":"2026-09-15T14:20:58","modified_gmt":"2026-09-15T11:20:58","slug":"deep-dhtmlx-gantt-customization-project-roadmap-split-tasks-milestones-organized-via-swimlanes","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/deep-dhtmlx-gantt-customization-project-roadmap-split-tasks-milestones-organized-via-swimlanes\/","title":{"rendered":"Deep DHTMLX Gantt Customization: Project Roadmap with Split Tasks and Milestones Organized via Swimlanes"},"content":{"rendered":"<p>Creating a consistent and appealing visual style is an important requirement in any project management app. That is why we continue exploring this kind of customization in our <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/\" target=\"_blank\" rel=\"noopener\">JavaScript Gantt Chart library<\/a> in the newly launched series of publications dedicated to this topic.<\/p>\n<p>In this blog post, we will consider a new Gantt customization scenario requested by one of our customers, where our Gantt component is used for creating a project roadmap.<\/p>\n<h5>Use Case: Project Roadmap with Custom Time Scales, Split Tasks, and Text Labels<\/h5>\n<p>DHTMLX Gantt is commonly used in project management apps for detailed project scheduling and management, but it can also be adapted for building a project roadmap like in the example below.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-11819\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/10\/office_timeline_border-1024x361.png\" alt=\"Project roadmap\" width=\"1024\" height=\"361\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/10\/office_timeline_border-1024x361.png 1024w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/10\/office_timeline_border-300x106.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/10\/office_timeline_border-768x271.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/10\/office_timeline_border.png 1877w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/office_timeline_demo?mode=wide\" target=\"_blank\" rel=\"noopener\">Check the code snippet &gt;<\/a><\/p>\n<p>Our customer asked us to create a sample similar to the <a href=\"https:\/\/www.officetimeline.com\/timeline\/templates\/swimlane-diagram\" target=\"_blank\" rel=\"noopener\">swimlane PowerPoint template<\/a> based on the Office Timeline Pro Add-in.<\/p>\n<p>This roadmap provides a high-level overview of project&#8217;s goals and major deliverables (tasks, milestones) on a timeline. As you can see, we added swimlanes to visualize the workflow in this demo. Swimlanes help to clearly divide tasks and milestones into different phases of a product roadmap.<\/p>\n<p>But the most notable part of this demo lies in several custom changes delivered by our team. Here we are talking about the upper scale of the Gantt timeline, usage of split tasks (split mode), shapes of taskbars, and multiple options for displaying text content for taskbars.<\/p>\n<p>Let us discuss the implementation of these customizations at the programming level.<\/p>\n<h5>Customization Guide<\/h5>\n<h6>Time Scales and Markers<\/h6>\n<p>We start with scales and markers at the top of the Gantt chart. The configuration of scales is specified using the <strong>scales<\/strong> property. We included two scale objects in the array of the <strong>scales<\/strong> config. These objects come with the <strong>unit<\/strong> property, where the corresponding &#8220;year&#8221; and &#8220;quarter&#8221; scales are specified.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">scales<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;year&quot;<\/span><span class=\"sy0\">,<\/span> step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> date<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> markerDates <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;2025-03-28&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;2025-07-05&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;2025-09-25&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;2025-12-20&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> markers <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; markerDates.<span class=\"me1\">forEach<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>markerDate<span class=\"sy0\">,<\/span> index<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; markers.<span class=\"me1\">push<\/span><span class=\"br0\">&#40;<\/span>`<span class=\"sy0\">&lt;<\/span>span <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;scale_label&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;left:${gantt.posFromDate(markerDate)}px&quot;<\/span><span class=\"sy0\">&gt;<\/span>Q$<span class=\"br0\">&#123;<\/span>index <span class=\"sy0\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#125;<\/span> review<span class=\"sy0\">&lt;\/<\/span>span<span class=\"sy0\">&gt;&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;scale_marker&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;left:${gantt.posFromDate(markerDate)}px&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span>`<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> markers.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;quarter&quot;<\/span><span class=\"sy0\">,<\/span> step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> date<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ console.log(date, (new Date(date).getMonth() % 3 + 1))<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;Q&quot;<\/span> <span class=\"sy0\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">getMonth<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">\/<\/span> <span class=\"nu0\">3<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>In the upper &#8220;year&#8221; scale, we also added custom markers. To do that, it is required to determine the marker\u2019s position using the <strong>posFromDate()<\/strong> method and specify this position with the <strong>left<\/strong> CSS property.<\/p>\n<h6>Project Phases with Split Tasks<\/h6>\n<p>Now we proceed to the most interesting part of this scenario, namely displaying project phases with split tasks in the timeline. There are four main (parent) tasks (Planning, Strategy, Service Development, and Business Intelligence), which are split into subtasks (child tasks) that are shown in the same row.<\/p>\n<p>To enable the split mode for a certain task, we usually have to set its <strong>render<\/strong> property to split. But the current version of DHTMLX Gantt does not have a built-in ability to display split tasks in different vertical positions. Therefore, we had to come up with a custom solution. For each task, we added the <strong>level<\/strong> parameter, where we used variables from 1 to 4 to indicate its position.<\/p>\n<p>Depending on the value in this parameter, different class names are returned in the <strong>task_class<\/strong> template. The position of tasks is determined with CSS styles (<strong>margin-top<\/strong> parameter). In the <strong>task_class<\/strong> template, we also specify where the task text should be displayed.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">templates<\/span>.<span class=\"me1\">task_class<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>start<span class=\"sy0\">,<\/span> end<span class=\"sy0\">,<\/span> task<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> css <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">level<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; css.<span class=\"me1\">push<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;level_&quot;<\/span> <span class=\"sy0\">+<\/span> task.<span class=\"me1\">level<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">type<\/span> <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;skew&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; css.<span class=\"me1\">push<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;skew&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">text_position<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; css.<span class=\"me1\">push<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text_position_&quot;<\/span> <span class=\"sy0\">+<\/span> task.<span class=\"me1\">text_position<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; css.<span class=\"me1\">push<\/span><span class=\"br0\">&#40;<\/span>styleFromParent<span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">parent<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> css.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot; &quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>This Gantt scenario does not require the ability to create task dependencies and change task progress, therefore we disable these features in this scenario.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">drag_links<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span><br \/>\ngantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">drag_progress<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<h6>Shapes of Subtasks<\/h6>\n<p>Subtasks (child split tasks) in the timeline have shapes of polygons and octagons instead of regular rectangles and diamonds. Shapes of tasks are modified with CSS styles. For instance, split tasks in the form of polygons are made with the <strong>clip-path<\/strong> property. This property is used for creating complex shapes in CSS.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">.<span class=\"me1\">gantt_task_line<\/span>.<span class=\"me1\">gantt_bar_task<\/span> .<span class=\"me1\">gantt_task_content<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; clip<span class=\"sy0\">-<\/span>path<span class=\"sy0\">:<\/span> polygon<span class=\"br0\">&#40;<\/span><span class=\"nu0\">50<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">%,<\/span> <span class=\"nu0\">98<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">100<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">21<\/span><span class=\"sy0\">%,<\/span> <span class=\"nu0\">100<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">65<\/span><span class=\"sy0\">%,<\/span> <span class=\"nu0\">96<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">98<\/span><span class=\"sy0\">%,<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">100<\/span><span class=\"sy0\">%,<\/span> <span class=\"nu0\">0<\/span> <span class=\"nu0\">77<\/span><span class=\"sy0\">%,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">43<\/span><span class=\"sy0\">%,<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">%<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<h6>Text Labels for Taskbars<\/h6>\n<p>And lastly, we pass on to consider options for displaying task labels. By default, HTML content is displayed inside taskbars after it is specified in the <strong>task_text<\/strong> template. But in our demo textual content for tasks is shown outside taskbars as well.<\/p>\n<p>If it is necessary to display text outside the taskbar, the <strong>task_text<\/strong> template should include the <strong>text_position<\/strong> parameter. In this case, an empty string is returned in the <strong>task_text<\/strong> template.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">templates<\/span>.<span class=\"me1\">task_text<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>start<span class=\"sy0\">,<\/span> end<span class=\"sy0\">,<\/span> task<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">text_position<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">return<\/span> task.<span class=\"me1\">text<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Let us examine in more detail how to add a text block to the left side of the taskbar. For this purpose, we used the <strong>leftside_text<\/strong> template. This template also includes the <strong>text_position<\/strong> parameter, but here we return the task text.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">templates<\/span>.<span class=\"me1\">leftside_text<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>start<span class=\"sy0\">,<\/span> end<span class=\"sy0\">,<\/span> task<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">text_position<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">return<\/span> task.<span class=\"me1\">text<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The position of the task text is specified using CSS styles. The first part of the selector is returned by the <strong>task_class<\/strong> template, while its second part (<strong>.gantt_side_content.gantt_left<\/strong>) can be taken from the element to the left of the taskbar.<\/p>\n<p>Following these instructions, you can create a custom project roadmap with DHTMLX Gantt that is similar to our <a href=\"https:\/\/snippet.dhtmlx.com\/office_timeline_demo?mode=wide\" target=\"_blank\" rel=\"noopener\">sample<\/a>.<\/p>\n<h5>Wrapping Up<\/h5>\n<p>Roadmaps and Gantt charts are both visual project management tools and may seem similar, but they are used by project teams for different purposes. The use case described above shows that you can create a custom project roadmap on the basis of our JavaScript Gantt chart. Thus, our library gives you an opportunity to integrate these functionalities into a web app and use them simultaneously for moving projects forward. Try it yourself by downloading a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" target=\"_blank\" rel=\"noopener\">free 30-day trial version<\/a>.<\/p>\n<p>If you have in mind an interesting customization scenario for DHTMLX Gantt, feel free to send it to us and we might choose it for one of our future articles of the series.<\/p>\n<h5>Related Materials<\/h5>\n<ul>\n<li><a href=\"https:\/\/dhtmlx.com\/blog\/deep-dhtmlx-gantt-customization-tasks-month-marker-grid\/\" target=\"_blank\" rel=\"noopener\">Deep DHTMLX Gantt Customization: New Looks of Tasks, Month Marker, and Customized Grid<\/a><\/li>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/eq70o558?tag=gantt&amp;mode=wide\" target=\"_blank\" rel=\"noopener\">200+ Code Snippets with DHTMLX Gantt<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/\" target=\"_blank\" rel=\"noopener\">DHTMLX Gantt Documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/demos\/\" target=\"_blank\" rel=\"noopener\">100+ DHTMLX Gantt Samples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" target=\"_blank\" rel=\"noopener\">30-day Free Trial Version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Creating a consistent and appealing visual style is an important requirement in any project management app. That is why we continue exploring this kind of customization in our JavaScript &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":11817,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[33,20],"class_list":["post-11812","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-all-posts","tag-gantt"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/11812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/101014"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=11812"}],"version-history":[{"count":11,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/11812\/revisions"}],"predecessor-version":[{"id":15887,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/11812\/revisions\/15887"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/11817"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=11812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=11812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=11812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}