{"id":13321,"date":"2025-01-14T15:15:41","date_gmt":"2025-01-14T12:15:41","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=13321"},"modified":"2026-09-15T14:17:40","modified_gmt":"2026-09-15T11:17:40","slug":"adding-progress-line-dhtmlx-javascript-gantt-chart","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/adding-progress-line-dhtmlx-javascript-gantt-chart\/","title":{"rendered":"Adding a Progress Line to DHTMLX JavaScript Gantt Chart"},"content":{"rendered":"<p>Hello everyone! We hope you had a great holiday and are ready to get back to work with renewed energy. We start 2025 with a tutorial that unveils a new customization option for enhanced user experience with Gantt charts based on DHTMLX. <\/p>\n<p>Today, you will learn how to complement a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/\" rel=\"noopener\" target=\"_blank\">JavaScript Gantt chart<\/a> with a progress line to facilitate project progress monitoring.<\/p>\n<h5>What is a Progress Line and How It Benefits a Gantt Chart<\/h5>\n<p>In complex Gantt chart scenarios, members of the project team or stakeholders may struggle to promptly and accurately estimate the current status of multiple tasks. That\u2019s where a progress line can come in handy. It is a visual indicator in the form of a curved line that displays the current status of tasks relative to their planned timelines. This line stems from the current date and indicates the progress of each task, giving the team a clear visual summary of the project&#8217;s status. This feature also helps project teams to quickly understand if any adjustments are required without diving into detailed data.<\/p>\n<p>Overall, end-users can get the following benefits from the implementation of a progress line:<\/p>\n<ul>\n<li>at-a-glance understanding of task statuses (on track, ahead, or delayed)<\/li>\n<li>decreased risk of missing deadlines and resource misallocation<\/li>\n<li>enhanced team coordination<\/li>\n<li>better workflow transparency<\/li>\n<\/ul>\n<p>As a result, this feature helps project teams to maintain clarity and good timing in project management workflows. <\/p>\n<p>Here is a sample of a Gantt chart with a progress line built with DHTMLX:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/01\/image2.png\" alt=\"Gantt chart with a progress line\" width=\"1445\" height=\"255\" class=\"aligncenter size-full wp-image-13322\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/01\/image2.png 1445w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/01\/image2-300x53.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/01\/image2-768x136.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/01\/image2-1024x181.png 1024w\" sizes=\"auto, (max-width: 1445px) 100vw, 1445px\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/yop6ok0k?text=gantt.%2Bprogress&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<h5>Guide on Complementing DHTMLX Gantt with Progress Line<\/h5>\n<p>DHTMLX Gantt does not provide the progress line feature by default, but it can be easily added to the Gantt configuration via the Gantt API. <\/p>\n<h6>Prerequisites<\/h6>\n<p>We won\u2019t dwell on adding a JavaScript Gantt chart on a web page and configuring it since these aspects are well covered in the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/\" rel=\"noopener\" target=\"_blank\">documentation<\/a>. Instead, we would like to focus on important details related to creating progress lines.<\/p>\n<p>From a coding perspective, a progress line is a custom element that can be displayed in the Gantt timeline with the <strong><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_addtasklayer.html\" rel=\"noopener\" target=\"_blank\">addTasklayer()<\/a><\/strong> method. This method is called for each row with the task, meaning you can add the progress line in pieces. <\/p>\n<p>If the task starts before the current date and is completed or the task has a progress status of 0% and starts after the current date, you\u2019ll need to add one straight line. If the task progress is from 0 to 100%, you draw two lines associated with the current date and progress of the task. It can be done with SVG. You\u2019ll need three progress line coordinates:<\/p>\n<ul>\n<li>top point related to the task row and the date position in the timeline<\/li>\n<li>bend point related to the current task progress (and its date)<\/li>\n<li>bottom point related to the task row and the date position in the timeline<\/li>\n<\/ul>\n<h6>Step 1: Positioning of Required Elements<\/h6>\n<p>First, you need to use the <strong><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_posfromdate.html\" rel=\"noopener\" target=\"_blank\">posFromDate()<\/a><\/strong> method to get the positions of the task&#8217;s start and end dates in the timeline.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> startPos <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">posFromDate<\/span><span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">start_date<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> endPos <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">posFromDate<\/span><span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">end_date<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>After that, you get the position of the current date.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> linePos <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">posFromDate<\/span><span class=\"br0\">&#40;<\/span>today<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Next, you calculate the difference between the positions of the start and end dates of the task and multiply it by the task progress. As a result, you\u2019ll get the task progress date.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> progressOffset <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>endPos <span class=\"sy0\">-<\/span> startPos<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> task.<span class=\"me1\">progress<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> progressPos <span class=\"sy0\">=<\/span> startPos <span class=\"sy0\">+<\/span> progressOffset<span class=\"sy0\">;<\/span><\/div><\/div>\n<p>To get the coordinates of the taskbar, you should use the <strong><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_gettaskposition.html\" rel=\"noopener\" target=\"_blank\">getTaskPosition()<\/a><\/strong> method.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> sizes <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">getTaskPosition<\/span><span class=\"br0\">&#40;<\/span>task<span class=\"sy0\">,<\/span> task.<span class=\"me1\">start_date<\/span><span class=\"sy0\">,<\/span> task.<span class=\"me1\">end_date<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<h6>Step 2: Creating SVG Element and Adding Attributes<\/h6>\n<p>Now you can create an SVG element and add the necessary attributes. The height parameter is taken from the task coordinates (the height of the entire row), while the width parameter is inherited. The position is specified using the top and left styles. The SVG element will occupy the entire task row in the timeline.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> svgNS <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;http:\/\/www.w3.org\/2000\/svg&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> svg <span class=\"sy0\">=<\/span> document.<span class=\"me1\">createElementNS<\/span><span class=\"br0\">&#40;<\/span>svgNS<span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;svg&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nsvg.<span class=\"me1\">classList<\/span>.<span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;progress-line&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nsvg.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;width&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'inherit'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nsvg.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;height&quot;<\/span><span class=\"sy0\">,<\/span> sizes.<span class=\"me1\">rowHeight<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nsvg.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;style&quot;<\/span><span class=\"sy0\">,<\/span> `top<span class=\"sy0\">:<\/span>$<span class=\"br0\">&#123;<\/span>sizes.<span class=\"me1\">top<\/span><span class=\"br0\">&#125;<\/span>px<span class=\"sy0\">;<\/span> left<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span>`<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>After that, you create the path element needed to draw lines and add attributes.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> path <span class=\"sy0\">=<\/span> document.<span class=\"me1\">createElementNS<\/span><span class=\"br0\">&#40;<\/span>svgNS<span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;path&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\npath.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;stroke&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;black&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\npath.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;stroke-width&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;2&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\npath.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;fill&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;none&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<h6>Step 3: Calculating Coordinates for Progress Line<\/h6>\n<p>The next step is to calculate coordinates for lines. For those who have never worked with SVG elements, we want to clarify a couple of symbols used in path coordinates:<\/p>\n<ul>\n<li>M &#8211; moving the initial coordinate, from which the elements will be built (from 0,0 to the specified coordinate).<\/li>\n<li>L &#8211; drawing a line from the current coordinate to the new one.<\/li>\n<\/ul>\n<p>Coordinates are specified in the following order:<\/p>\n<ul>\n<li>M x,y &#8211; the initial coordinate. x is taken from the position of the current date. y is 0 because it is the first coordinate starting from the top.<\/li>\n<li>L x,y &#8211; the coordinate of the task progress date. x is taken from the position of the progress. y is taken from half the row height.<\/li>\n<li>L x,y &#8211; the ending coordinates. x is taken from the position of the current date. y is taken from the row height.<\/li>\n<\/ul>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> startPoint <span class=\"sy0\">=<\/span> `M$<span class=\"br0\">&#123;<\/span>linePos<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span>`<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> middlePoint <span class=\"sy0\">=<\/span> `L$<span class=\"br0\">&#123;<\/span>progressPos<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span>$<span class=\"br0\">&#123;<\/span>sizes.<span class=\"me1\">rowHeight<\/span> <span class=\"sy0\">\/<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#125;<\/span>`<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> endPoint <span class=\"sy0\">=<\/span> `L$<span class=\"br0\">&#123;<\/span>linePos<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span>$<span class=\"br0\">&#123;<\/span>sizes.<span class=\"me1\">rowHeight<\/span><span class=\"br0\">&#125;<\/span>`<span class=\"sy0\">;<\/span><\/div><\/div>\n<h6>Step 4: Checking Task\u2019s Date and Progress<\/h6>\n<p>At this point, you need to check the date and progress of the task. If the task starts before the current date and its progress is 100% (i.e. 1) or it starts after the current date and its progress is greater than 0, the task is still in progress. In this case, it is necessary to draw two lines from the task progress. If the condition above is not met, one line is drawn. i.e. the second coordinate is simply excluded.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> ongoingTask <span class=\"sy0\">=<\/span> task.<span class=\"me1\">start_date<\/span> <span class=\"sy0\">&lt;<\/span> today <span class=\"sy0\">&amp;&amp;<\/span> task.<span class=\"me1\">progress<\/span> <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> unfinishedTask <span class=\"sy0\">=<\/span> today <span class=\"sy0\">&lt;=<\/span> task.<span class=\"me1\">start_date<\/span> <span class=\"sy0\">&amp;&amp;<\/span> task.<span class=\"me1\">progress<\/span> <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>ongoingTask <span class=\"sy0\">||<\/span> unfinishedTask<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; pathData <span class=\"sy0\">=<\/span> `$<span class=\"br0\">&#123;<\/span>startPoint<span class=\"br0\">&#125;<\/span> $<span class=\"br0\">&#123;<\/span>middlePoint<span class=\"br0\">&#125;<\/span> $<span class=\"br0\">&#123;<\/span>endPoint<span class=\"br0\">&#125;<\/span>`<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; pathData <span class=\"sy0\">=<\/span> `$<span class=\"br0\">&#123;<\/span>startPoint<span class=\"br0\">&#125;<\/span> $<span class=\"br0\">&#123;<\/span>endPoint<span class=\"br0\">&#125;<\/span>`<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>After that, you add the <strong>path<\/strong> element to the SVG element and return the SVG element.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">path.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;d&quot;<\/span><span class=\"sy0\">,<\/span> pathData<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nsvg.<span class=\"me1\">appendChild<\/span><span class=\"br0\">&#40;<\/span>path<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">return<\/span> svg<span class=\"sy0\">;<\/span><\/div><\/div>\n<h6>Step 5: Adding Styles<\/h6>\n<p>And the final touch is to add styles to the progress line.<\/p>\n<div class=\"codecolorer-container css default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"css codecolorer\"><span class=\"re1\">.progress-line<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">pointer-events<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">none<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">z-index<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"re1\">.progress-line<\/span> path <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">stroke<\/span><span class=\"sy0\">:<\/span> <span class=\"kw3\">rgba<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"re3\">70%<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Let us clarify the parameters used in the piece of code above:<\/p>\n<ul>\n<li><strong>position: absolute;<\/strong> &#8211; ensures that the elements are drawn at their positions in the timeline.<\/li>\n<li><strong>pointer-events: none;<\/strong> &#8211; disables mouse events for SVG elements, i.e. when you click on an SVG element, the click is triggered on the element below it.<\/li>\n<li><strong>z-index: 10;<\/strong> &#8211; allows displaying custom elements on top of taskbars and links.<\/li>\n<li><strong>stroke<\/strong> &#8211; serves to set the color.<\/li>\n<\/ul>\n<p>That\u2019s it. The instructions above will help you enrich your JavaScript Gantt chart with a custom progress line like our <a href=\"https:\/\/snippet.dhtmlx.com\/yop6ok0k?text=gantt.%2Bprogress&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">sample<\/a>.<\/p>\n<h5>Wrapping Up<\/h5>\n<p>Overall, it is great to have an easy way to add a simple yet useful feature like a progress line to a Gantt chart. This feature enables end-users to see how their work aligns with the project&#8217;s timeline and take timely measures when things don\u2019t go according to the plan. With DHTMLX Gantt, you get an extensive API for implementing a progress line and many other custom features. If still in doubt, download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" rel=\"noopener\" target=\"_blank\">free 30-day trial version<\/a> of our product and give it a try. Stay tuned for more tutorials on DHTMLX Gantt customization in 2025.<\/p>\n<h5>Related Materials<\/h5>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/demos\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt samples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/blog\/tutorials\/?tag=gantt\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt tutorials<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt free trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hello everyone! We hope you had a great holiday and are ready to get back to work with renewed energy. We start 2025 with a tutorial that unveils a &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":13323,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[33,20],"class_list":["post-13321","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\/13321","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=13321"}],"version-history":[{"count":6,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13321\/revisions"}],"predecessor-version":[{"id":15882,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13321\/revisions\/15882"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/13323"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=13321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=13321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=13321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}