{"id":15698,"date":"2026-06-22T18:18:00","date_gmt":"2026-06-22T15:18:00","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=15698"},"modified":"2026-10-22T14:49:07","modified_gmt":"2026-10-22T11:49:07","slug":"dhtmlx-richtext-editor-2-1","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-richtext-editor-2-1\/","title":{"rendered":"DHTMLX RichText Editor 2.1:  Trigger-Based Editing Workflows, Flexible Content Insertion, and More"},"content":{"rendered":"<p>We are happy to present the release of DHTMLX RichText Editor 2.1. This update introduces new opportunities to deliver more comprehensive text-editing experiences in web apps. The centerpiece of this release is a customizable trigger system that allows users to add user mentions, tags, emojis, slash-style command menus, and other contextual interactions directly in the editor. Another notable novelty is the ability to insert content (text, HTML, or Markdown) at the current cursor position or replace the selected text.<\/p>\n<p>In addition, v2.1 also includes out-of-the-box markdown support, drag-and-drop image insertion and improved clipboard handling to facilitate everyday content editing.<\/p>\n\n\t\t<div class='post-banner'>\n\t\t    <div class='post-banner__inside'>\n\t\t        <div>\n\t\t            <div class=\"post-banner__title\">Download DHTMLX Rich Text Editor v2.1<\/div>\n\t\t            <div class=\"post-banner__text\">Estimate the updated functionality for delivering a feature-packed text editor<\/div>\n                <\/div>\n\t\t            \n                \n            <div class='post-banner__btn'>\n                <a href='https:\/\/dhtmlx.com\/docs\/products\/dhtmlxRichText\/download.shtml' title='' class='button-secondary'>Get free trial<\/a>\n            <\/div>\n        \n            <\/div>\n\t\t<\/div>\n\t\n<p>Let us consider all new features and improvements in more detail.<\/p>\n<h2>Smart Triggers for Context-Aware Editing<\/h2>\n<p>Starting from v2.1, our RichText component allows you to go beyond standard text formatting operations and extend the editor\u2019s functionality with the special trigger mechanism. Now, you can specify trigger characters that activate suggestion lists and custom actions. It enables end-users to promptly perform a range of contextual interactions in the document while typing. \u0421ommon examples include the following:<\/p>\n<ul>\n<li>@ &#8211; mention users or workspace members,<\/li>\n<li># &#8211; apply tags to content,<\/li>\n<li>\/- invoke command menus<\/li>\n<li>:- add emojis,<\/li>\n<li>$ &#8211; insert a financial ticker or variable<\/li>\n<\/ul>\n<p>To configure the behavior of the needed character, you\u2019ll need the <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/config\/triggers\/\" rel=\"noopener\" target=\"_blank\">triggers<\/a><\/strong> property added to the RichText API. It includes several parameters to cover both standard and custom scenarios.  <\/p>\n<h3>Standard Trigger-Based Insertions<\/h3>\n<p>Let us start with the basics. For instance, you need to add suggestion lists for user mentions, tags, and less common options, like searching for a user. To do that, you specify characters that open the required dropdowns in the <strong>trigger<\/strong> parameter and bind them to associated data sources in the <strong>data<\/strong> parameter. There are three possible forms of data sources: array, sync function, and async function. The interactive example below employs all these forms for the <strong>data<\/strong> field.<\/p>\n<p><iframe data-src=\"https:\/\/snippet.dhtmlx.com\/nfvvfize?mode=mobile\" frameborder=\"0\" width=\"100%\" height=\"560\"class=\"snippet-container js-iframe\"><\/iframe> <a href=\"https:\/\/snippet.dhtmlx.com\/nfvvfize?text=richtext&#038;mode=wide rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>Try entering @, #, or +, the editor will detect the context and offer the corresponding dropdown list with predefined items. Then, you can insert the appropriate option with a mouse click or keyboard shortcuts. As a result, the selected item is inserted into the document as a structured, non-editable token. No need to open a separate dialog or menu.<\/p>\n<p>Each dropdown item specified in the data parameter is shown as plain text using the label field. But you can customize the way these items are rendered in the dropdown list for different triggers. For this purpose, you pass a custom template via the new <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/config\/trigger-template\/\" rel=\"noopener\" target=\"_blank\">triggerTemplate<\/a><\/a><\/strong> property that changes the appearance of suggestion items for a particular character. <\/p>\n<p>For instance, here is how to enrich the dropdown for the user mention trigger (@) with items containing avatar, username, and full name, while keeping basic text labels for the tag character:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> widget <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> richtext.<span class=\"me1\">Richtext<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#richtext&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; value<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; triggers<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> trigger<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;@&quot;<\/span><span class=\"sy0\">,<\/span> data<span class=\"sy0\">:<\/span> people <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> trigger<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;#&quot;<\/span><span class=\"sy0\">,<\/span> data<span class=\"sy0\">:<\/span> tags <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; triggerTemplate<span class=\"sy0\">:<\/span> template<span class=\"br0\">&#40;<\/span>obj <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>obj.<span class=\"me1\">trigger<\/span> <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;@&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> `<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;user&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>img <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;user-avatar&quot;<\/span> src<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;${obj.data.image}&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;user-nickname&quot;<\/span><span class=\"sy0\">&gt;<\/span>$<span class=\"br0\">&#123;<\/span>obj.<span class=\"me1\">data<\/span>.<span class=\"me1\">label<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;user-name&quot;<\/span><span class=\"sy0\">&gt;<\/span>$<span class=\"br0\">&#123;<\/span>obj.<span class=\"me1\">data<\/span>.<span class=\"me1\">name<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span>`<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">return<\/span> obj.<span class=\"me1\">data<\/span>.<span class=\"me1\">label<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/06\/image4-1.gif\" alt=\"custom rendering for suggestion items\" width=\"1292\" height=\"400\" class=\"alignleft size-full wp-image-15719\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/0p3bbnhz?tag=richtext&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a> <\/p>\n<p>The trigger system also provides events such as <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/events\/show-suggest\/\" rel=\"noopener\" target=\"_blank\">show-suggest<\/a><\/strong>, <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/events\/hide-suggest\/\" rel=\"noopener\" target=\"_blank\">hide-suggest<\/a><\/strong>, and <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/events\/insert-token\/\" rel=\"noopener\" target=\"_blank\">insert-token<\/a><\/strong>, allowing apps to react when the dropdown is shown or hidden, or when an item is selected. <\/p>\n<p>And that\u2019s not all. The <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/config\/triggers\/\" rel=\"noopener\" target=\"_blank\">triggers<\/a><\/strong> property allows you to go even further and respond to trigger selections with custom actions.<\/p>\n<h3>Custom Trigger-Based Actions<\/h3>\n<p>In DHTMLX RichText, triggers are not limited to inserting structured tokens into the document. For more advanced use cases, you can specify custom logic that will be executed once a dropdown item is selected.  <\/p>\n<p>Under the hood, it is done with the help of the <strong>action<\/strong> parameter, allowing you to run your own code instead of inserting a token. For example, this custom callback function is great for creating a slash-command menu with formatting options and system commands like &#8220;Print&#8221;.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> widget <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> richtext.<span class=\"me1\">Richtext<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#richtext&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; value<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; triggers<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trigger<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;\/&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data<span class=\"sy0\">:<\/span> commands<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action<span class=\"sy0\">:<\/span> data <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> widget.<span class=\"me1\">api<\/span>.<span class=\"me1\">exec<\/span><span class=\"br0\">&#40;<\/span>data.<span class=\"me1\">id<\/span><span class=\"sy0\">,<\/span> data.<span class=\"me1\">config<\/span> <span class=\"sy0\">||<\/span> <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/06\/image1-3-1.gif\" alt=\"custom slash-command menu\" width=\"1292\" height=\"400\" class=\"alignleft size-full wp-image-15720\" \/><br \/>\nTry these formatting options and the &#8220;Print&#8221; command using the <a href=\"https:\/\/snippet.dhtmlx.com\/e0mrmyam?tag=richtext&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">official sample<\/a>.<\/p>\n<p>Additionally, the <strong>action<\/strong> parameter can be combined with the <strong>triggerTemplate<\/strong> property to add visual elements to dropdown items. The most vivid example of this scenario is adding emojis grouped by categories.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/06\/image5-1-1.gif\" alt=\"cutstom-trigger-based actions\" width=\"1292\" height=\"400\" class=\"alignleft size-full wp-image-15715\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/g5z1d868?tag=richtext&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>By combining triggers with custom rendering and action handling, it becomes much easier to implement dynamic, context-aware editing workflows tailored to specific project requirements.<\/p>\n<p>Complete information on the trigger system&#8217;s capabilities in DHTMLX RichText Editor is provided in this <a href=\"https:\/\/docs.dhtmlx.com\/richtext\/guides\/mentions_and_tags\/\" rel=\"noopener\" target=\"_blank\">guide<\/a>.<\/p>\n<h2>More Control Over Content Insertion<\/h2>\n<p>The next noteworthy addition to the RichText API delivered in v2.1 is the new <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/methods\/insert-value\/\" rel=\"noopener\" target=\"_blank\">insertValue()<\/a><\/strong> method. With this novelty, you get a convenient way to embed content right in the editor at the current cursor position or replace the selected piece of text. The method supports multiple content formats, including plain text, HTML, and Markdown.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">function<\/span> insertSample<span class=\"br0\">&#40;<\/span>format<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>format <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;markdown&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; widget.<span class=\"me1\">insertValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;**bold** and *italic*&quot;<\/span><span class=\"sy0\">,<\/span> richtext.<span class=\"me1\">markdown<\/span>.<span class=\"me1\">fromMarkdown<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>format <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; widget.<span class=\"me1\">insertValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot; plain text &quot;<\/span><span class=\"sy0\">,<\/span> richtext.<span class=\"me1\">text<\/span>.<span class=\"me1\">fromText<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; widget.<span class=\"me1\">insertValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;a href=&quot;https:\/\/dhtmlx.com&quot; title=&quot;DHTMLX site&quot;&gt;DHTMLX link&lt;\/a&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/06\/image2-2-1.gif\" alt=\"inserting content programmatically\" width=\"1292\" height=\"400\" class=\"alignleft size-full wp-image-15717\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/pew2g1ku?tag=richtext&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>Moreover, the <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/methods\/insert-value\/\" rel=\"noopener\" target=\"_blank\">insertValue()<\/a><\/strong> method can also be applied when configuring custom actions for triggers using the <strong>action<\/strong> parameter. Particularly, it comes in handy when implementing the dropdown list for inserting emojis directly in the document:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> editor <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> Richtext<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#root&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;triggers<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;trigger<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;:&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data<span class=\"sy0\">:<\/span> emoji<span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ [{ id: &quot;apple&quot;, label: &quot;apple&quot;, code: &quot;1F34E&quot; }, ...]<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;action<span class=\"sy0\">:<\/span> item <span class=\"sy0\">=&gt;<\/span> editor.<span class=\"me1\">insertValue<\/span><span class=\"br0\">&#40;<\/span>`<span class=\"sy0\">&lt;<\/span>span<span class=\"sy0\">&gt;<\/span>$<span class=\"br0\">&#123;<\/span>emojiFromCode<span class=\"br0\">&#40;<\/span>item.<span class=\"me1\">code<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span> <span class=\"sy0\">&lt;\/<\/span>span<span class=\"sy0\">&gt;<\/span>`<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"co1\">\/\/ render the emoji itself (not just its label) in the dropdown<\/span><br \/>\n&nbsp; &nbsp;triggerTemplate<span class=\"sy0\">:<\/span> template<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span> data <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> `$<span class=\"br0\">&#123;<\/span>emojiFromCode<span class=\"br0\">&#40;<\/span>data.<span class=\"me1\">code<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span> $<span class=\"br0\">&#123;<\/span>data.<span class=\"me1\">label<\/span><span class=\"br0\">&#125;<\/span>`<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Together with optimized <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/methods\/set-value\/\" rel=\"noopener\" target=\"_blank\">setValue()<\/a><\/strong> and <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/methods\/get-value\/\" rel=\"noopener\" target=\"_blank\">getValue()<\/a><\/strong>, <strong><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/api\/methods\/insert-value\/\" rel=\"noopener\" target=\"_blank\">insertValue()<\/a><\/strong> is a vital part of our efforts taken in this release to ensure a smooth editing experience with the content in the Markdown format. <\/p>\n<h2>Other Improvements<\/h2>\n<p>Apart from the main features highlighted above, v2.1 brings along a few quality-of-life improvements:<\/p>\n<ul>\n<li>Improved image management with drag-and-drop insertions and serverless image uploads<\/li>\n<li>Enhanced clipboard support for smoother content transfer between RichText instances and external sources<\/li>\n<\/ul>\n<p>Visit the &#8220;<a href=\"https:\/\/docs.dhtmlx.com\/richtext\/news\/whats_new\/#version-21\" rel=\"noopener\" target=\"_blank\">What\u2019s New<\/a>&#8221; section for the final overview of new features included in DHTMLX RichText Editor 2.1. After that, it makes sense to download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxRichText\/download.shtml\" rel=\"noopener\" target=\"_blank\">free 30-day trial version<\/a> of the product and try the novelties in action. Our current clients can access v2.1 via their <a href=\"https:\/\/dhtmlx.com\/clients\/\" rel=\"noopener\" target=\"_blank\">Client\u2019s Area<\/a>. <\/p>\n<p>And last but not least, we want to remind you that <a href=\"https:\/\/dhtmlx.com\/blog\/dhtmlx-javascript-components-become-available-gpl-license\/\" rel=\"noopener\" target=\"_blank\">RichText has recently become available under the GPL license<\/a>, as well as many other DHTMLX components.<\/p>\n<h2>Related Materials<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/news\/whats_new\/#version-21\" rel=\"noopener\" target=\"_blank\">What\u2019s new in v2.1<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/richtext\/\" rel=\"noopener\" target=\"_blank\">DHTMLX RichText documentation<\/a><\/li>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/nfvvfize?tag=richtext&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">DHTMLX Rich samples<\/a><\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/@dhtmlx\/richtext\" rel=\"noopener\" target=\"_blank\">Rich Text Editor (GPL Edition)<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxRichText\/download.shtml\" rel=\"noopener\" target=\"_blank\">Free 30-day trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>We are happy to present the release of DHTMLX RichText Editor 2.1. This update introduces new opportunities to deliver more comprehensive text-editing experiences in web apps. The centerpiece of &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":15705,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[33,61],"class_list":["post-15698","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-releases","tag-all-posts","tag-richtext"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15698","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=15698"}],"version-history":[{"count":14,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15698\/revisions"}],"predecessor-version":[{"id":15700,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15698\/revisions\/15700"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/15705"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=15698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=15698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=15698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}