168 KiB

Changelog

Tags:

  • 💥 [Breaking Change]
  • 🚀 [New Feature]
  • 🐛 [Bug Fix]
  • 📝 [Documentation]
  • 🏠 [Internal]
  • 💅 [Polish]

4.12.0

🚀 New Feature

  • Add Jodit.configure() static method for deep-merging partial options into global defaults without losing existing keys. Previously, overriding nested defaults like controls or createAttributes required setting each property individually. Now you can patch only the keys you need:

    // Add a button without losing existing controls
    Jodit.configure({
      controls: {
        myButton: { icon: 'pencil', command: 'selectall' }
      }
    });
    
    // Partially update createAttributes
    Jodit.configure({
      createAttributes: {
        div: { class: 'my-class' }
      }
    });
    

🏠 Internal

  • Upgrade TypeScript from 5.9 to 6.0
  • Replace ts-node with tsx for running TypeScript tooling scripts
  • Add ignoreDeprecations: "6.0" to tsconfig files for TS 6 compatibility
  • Add declare module '*.less' for TS 6 stricter side-effect import checks
  • Fix --update-snapshots flag not being passed to Playwright in make screenshots-update

4.11.15

🏠 Internal

  • Add data-ref attributes to image buttons in UIImageMainTab

4.11.14

🚀 New Feature

  • Add stream() method to Ajax class for SSE (Server-Sent Events) streaming over XMLHttpRequest. Returns an AsyncGenerator<string> that yields parsed data: fields incrementally via onprogress.

    const ajax = new Jodit.modules.Ajax({
      method: 'POST',
      url: '/api/ai/stream',
      contentType: 'application/json',
      data: { prompt: 'Hello' }
    });
    
    try {
      for await (const data of ajax.stream()) {
        const event = JSON.parse(data);
        editor.s.insertHTML(event.text);
      }
    } finally {
      ajax.destruct();
    }
    

📝 Documentation

  • Rewrite src/core/request/README.md with full API reference, usage examples, SSE streaming guide, AbortController integration, and real-world patterns (FileBrowser, Uploader, plugins).

4.11.12

🚀 New Feature

  • Add link.openInNewTabCheckboxDefaultChecked option to set default state of "Open in new tab" checkbox when inserting a new link (#1289)

🐛 Bug Fix

  • Fix pasting table into table cell creating invalid nesting and trailing empty paragraph (#1314)
  • Fix font size module misbehavior in pt mode: duplicated unit display, incorrect active state, and wrong px/pt conversion (#1197)
  • Fix focus competition between multiple editor instances in Source mode (#1313)
  • Fix tooltip clipped by viewport when toolbar is near the bottom of the page (#1150)

4.11.7

🚀 New Feature

  • Implement custom highlight styling for search results (#1343)
  • Add backSpaceAfterDelete event triggered after backspace operations
  • Add Dom.findFirstMatchedNode() method for retrieving first matched node in DOM tree

💅 Polish

  • Improve cursor positioning in wrapNodes plugin after backspace
  • Improve readability of selection marker queries and add focus condition check

🏠 Internal

  • Enhance test coverage for undo/redo, backspace, search, and other plugins

4.11.6

🏠 Internal

  • Release workflow now populates GitHub Release notes from CHANGELOG.md instead of relying on auto-generated notes

4.11.5

🚀 New Feature

  • ProgressBar.showFileUploadAnimation(from?, to?) — animated file icon that flies from a given point and fades out. Coordinates are relative to the editor container. Both from and to are optional with sensible defaults. The animation is automatically cleaned up on destruct().
    const editor = Jodit.make('#editor')
    jodit.progressbar.showFileUploadAnimation();
    

4.11.4

💥 Breaking Change

  • .jodit-icon transform-origin changed from 0 0 !important to var(--jd-icon-transform-origin) (default center), and the !important flag was removed. If your layout depends on the old top-left origin, restore it via CSS:
    :root {
        --jd-icon-transform-origin: 0 0 !important;
    }
    

🚀 New Feature

  • IUIIconState now supports scale property — when set, applies transform: scale(...) to the SVG icon element, overriding the CSS variable

  • IControlType.icon now accepts string | IUIIconState — allows setting icon name, fill, iconURL, and scale directly from toolbar button config

    Per-button scale example:

    Jodit.make('#editor', {
        buttons: Jodit.atom([
            'bold',
            {
                name: 'big-italic',
                icon: { name: 'italic', fill: '', iconURL: '', scale: 1.5 },
                tooltip: 'Italic (large icon)'
            },
            'underline'
        ])
    });
    
  • CSS custom properties --jd-icon-transform-origin and --jd-icon-transform-scale for global icon scaling. Override them to resize all editor icons at once. Per-button scale in IUIIconState takes priority over the CSS variable.

    Global scale override via CSS:

    :root {
        --jd-icon-transform-scale: 1.3;
        --jd-icon-transform-origin: center;
    }
    

4.11.2

💥 Breaking Change

  • cleanHTML.denyTags default changed from 'script' to 'script,iframe,object,embed' — iframes, objects, and embeds are now blocked by default
  • cleanHTML.removeOnError is deprecated in favor of cleanHTML.removeEventAttributes — all on* event handler attributes (onerror, onclick, onload, onmouseover, etc.) are now removed by default, not just onerror
  • cleanHTML.safeLinksTarget is now true by default — links with target="_blank" automatically get rel="noopener noreferrer"
  • cleanHTML.sandboxIframesInContent is now true by default — all <iframe> elements in editor content get sandbox="" attribute
  • cleanHTML.convertUnsafeEmbeds is now ['object', 'embed'] by default — listed elements are converted to sandboxed <iframe>

🏠 Internal

  • Add Statoscope for webpack bundle size analysis and build comparison
  • refactor: replace setAttribute and removeAttribute with attr helper in multiple files

🚀 New Feature

  • New option cleanHTML.removeEventAttributes — removes all on* event handler attributes for comprehensive XSS protection (onerror, onclick, onload, onmouseover, onfocus, etc.)
  • New option cleanHTML.safeLinksTarget — automatically adds rel="noopener noreferrer" to target="_blank" links to prevent window.opener attacks
  • New option cleanHTML.allowedStyles — whitelist of allowed CSS properties in style attributes, prevents CSS injection attacks (e.g. data exfiltration via background-image: url(...))
  • New option cleanHTML.sanitizer — hook for external sanitizer integration (e.g. DOMPurify). Called before Jodit's built-in sanitization
  • New option cleanHTML.sandboxIframesInContent — adds sandbox="" to all <iframe> in editor content
  • New option cleanHTML.convertUnsafeEmbeds (false | string[]) — converts listed tags to sandboxed <iframe>, customizable list

📝 Documentation

  • New comprehensive security guide: docs/security.md covering XSS protection, CSP, Trusted Types, HTML Sanitizer API, server-side sanitization, and hardened configuration examples

4.10.1

💥 Breaking Change

  • Fix custom cell popup buttons not working when referenced by string name (e.g. popup: { cells: Jodit.atom(['valign', 'deleteTable', ...]) }) #1328
  • Rename cell popup button deletedeleteTable to avoid conflict with document.execCommand('delete')

4.9.18

🐛 Bug Fix

  • Fix table column operations (insert before/after, delete) affecting wrong column when cells are merged #1334
  • Fix Browse button text clipped in image popup when filebrowser is configured #1318

💅 Polish

  • Make form inputs stretch to full width inside UIBlock (link popup, image popup)

4.9.17

🐛 Bug Fix

4.9.16

🏠 Internal

  • Downgrade Node.js version in .nvmrc to 22

4.9.15

🐛 Bug Fix

  • Enhance image editor and file browser functionality with new path handling and update tests

4.9.14

🐛 Bug Fix

  • Enhance image editor functionality with 'Save as' prompt and refactor button definitions

4.9.12

🚀 New Feature

  • Enhance accessibility by adding role attributes to UI elements and updating related tests

4.9.11

🚀 New Feature

  • The getRole():string method has been added to UIElement. This allows you to set container roles for accessibility.
  • The UIGroup role is set to list.

4.9.7

🚀 New Feature

  • feat: add aria-label handling to UIButton and corresponding tests

4.9.1

🏠 Internal

feat: Bump version to 4.9.0 and add new dependency

refactor: Enhance component decorators with component registry and retrieval functions

refactor: Move getPropertyDescriptor utility to a shared location

refactor: Improve DOM utility functions and introduce isMarker method in Dom class

refactor: Update lazy-walker to use specific autobind decorator

refactor: Refactor observable to use shared getPropertyDescriptor utility

refactor: Update global event emitter to use a dedicated instance

refactor: Deprecate isAbort in favor of isAbortError

refactor: Clean up attribute utility imports

refactor: Simplify error handling utilities

refactor: Update selector utility imports for consistency

refactor: Add getPropertyDescriptor utility to shared utils

refactor: Enhance plugin system to accept a getContainer function

refactor: Update selection style transactions to use new constants

refactor: Refactor button component to utilize new component registry

refactor: Update UI element to support closest method for component retrieval

refactor: Clean up toolbar button and collection imports

fix: Update about plugin to correctly display license information

feat: Introduce global event emitter instance

feat: Create utility functions for file browser builders

4.8.8

🏠 Internal

  • feat: add issue templates for bug reports and feature requests

4.8.8

🏠 Internal

  • fix: ensure tags are ignored on push events in tests workflow

4.8.6

🏠 Internal

  • refactor: reorganize workflow jobs to separate linting and building steps

4.8.3

🏠 Internal

  • feat: enhance editor functionality with MutationObserver and refactor initialization methods

4.8.1

🚀 New Feature

  • AsyncStorage API with IndexedDB support
    • Added AsyncStorage class for asynchronous storage operations
    • Implemented IndexedDBProvider for persistent browser storage with async API
    • Support for multiple storage strategies: indexedDB, localStorage, sessionStorage, and in-memory fallback
    • Comprehensive test coverage for all storage providers and async operations
    • canUseIndexedDB() utility function to check IndexedDB availability

🏠 Internal

  • Enhanced storage system
    • Refactored storage providers to support both sync and async interfaces
    • Added workplace slots layout system for improved editor structure
    • Comprehensive test suites for storage functionality (storage.test.js, async-storage.test.js)
    • Added slot system tests (slots.test.js) for UI layout validation
    • Improved CSS variable handling for slot dimensions
    • Updated build configuration to use esbuild for ESM minification

🐛 Bug Fix

  • Fixed IndexedDB store name handling in AsyncStorage
    • Correctly construct database names with suffix for proper isolation
    • Use consistent keyValueStore as the object store name

4.7.6

💥 Breaking Change

  • @autobind decorator now only supports methods, not classes
    • Replaced external autobind-decorator dependency with internal implementation
    • The old package is no longer maintained (last release was 7 years ago)
    • Migration Option 1 (Recommended): Apply @autobind to individual methods:
      // Before (no longer supported):
      @autobind
      class MyClass {
          method1() { }
          method2() { }
      }
      
      // After:
      class MyClass {
          @autobind
          method1() { }
      
          @autobind
          method2() { }
      }
      
    • Migration Option 2 (If you need class-level binding): Install and use the original package directly:
      npm install autobind-decorator
      
      import autobind from 'autobind-decorator';
      
      @autobind
      class MyClass {
          method1() { }
          method2() { }
      }
      
      Note: autobind-decorator package is no longer maintained, but it still works if you need class-level binding.
    • Internal affected files: data-provider.ts, resize-handler.ts, size.ts, recognize-manager.ts

4.7.5

🚀 New Feature

  • Added method uploader.customUploadFunction. This method can be used to replace the function of uploading files
    Jodit.make('#editor', {
    	uploader: {
    		customUploadFunction: (requestData, showProgress) =>
    			fetch(requestData).then(res => {
    				showProgress(100);
    				return res.json();
    			})
    	}
    });
    

4.7.1

💥 Breaking Change

  • For es5 build, polyfills are not included by default anymore. You can include them manually by importing jodit/es5/polyfills.min.js
  • Use swc-loader for build instead of ts-loader for better performance and smaller bundle size.

🏠 Internal

 @eslint/compat                      ^1.3.2  →    ^1.4.0
 @eslint/js                         ^9.35.0  →   ^9.38.0
 @playwright/test                   ^1.55.1  →   ^1.56.1
 @types/node                        ^24.5.1  →   ^24.9.1
 @typescript-eslint/eslint-plugin   ^8.44.0  →   ^8.46.2
 @typescript-eslint/parser          ^8.44.0  →   ^8.46.2
 chai                                ^6.0.1  →    ^6.2.0
 core-js                            ^3.45.1  →   ^3.46.0
 cross-env                          ^10.0.0  →   ^10.1.0
 dotenv                             ^17.2.2  →   ^17.2.3
 eslint                             ^9.35.0  →   ^9.38.0
 eslint-plugin-mocha                ^11.1.0  →   ^11.2.0
 less                                ^4.4.1  →    ^4.4.2
 mocha                              ^11.7.2  →   ^11.7.4
 stylelint                         ^16.24.0  →  ^16.25.0
 stylelint-config-standard          ^39.0.0  →   ^39.0.1
 tsx                                ^4.20.5  →   ^4.20.6
 typescript                          ^5.9.2  →    ^5.9.3
 webpack                            5.101.3  →   5.102.1
 webpack-dev-middleware              ^7.4.3  →    ^7.4.5

4.6.18

🐛 Bug Fix

  • Enhance class name handling in link plugin
  • Improved appearance of the multiple choice select

4.6.17

🐛 Bug Fix

  • Fixed issue with adding class names to links when multiple selection options were involved.
  • Corrected the logic for selecting multiple class names from a dropdown.
  • Ensured that links are created with all selected class names applied.
  • Updated tests to verify the correct behavior of link creation with multiple class names.

4.6.16

🐛 Bug Fix

  • blank lines are being inserted#1294

4.6.15

🚀 New Feature and 💥 Breaking Change

  • Added table.splitBlockOnInsertTable option to control table insertion behavior (#1295)
    • When true (default): splits the current block when inserting a table
    • When false: inserts table after the current block without splitting it

4.6.14

  • Add lineHeight support to copy-format plugin and update tests

4.6.13

🐛 Bug Fix

  • Fixed HTML structure destruction when applying inline styles to partial text selections within block elements
    • Prevented block elements (divs, paragraphs) from being split into multiple fragments when applying inline styles
    • Modified style application to create proper span wrappers inside existing elements instead of extracting parts
    • Preserves block element structure while allowing style application (PR #1284)

4.6.12

💥 Breaking Change

Remove reconcileArrays functionality and associated tests

4.6.7

🚀 New Feature

  • Added ability to insert UI elements at specific index positions in UIGroup using the append method

    • group.append(element, 0) - inserts at the beginning
    • group.append(element, index) - inserts at specific position
    • Maintains backward compatibility with existing append(element, distElement) usage
  • Added array reconciliation utilities in core/helpers/array

    • reconcileArrays - compares two arrays and returns differences (added, removed, kept, moved items)
    • applyArrayReconciliation - applies reconciliation patches to transform one array into another
    • Supports both primitive arrays and object arrays with custom key functions
    • Useful for efficient list updates and state management

4.6.6

🏠 Internal

  • Updated Playwright version to 1.55.0
  • Updated screenshot snapshots for message and link popup tests

4.6.5

🏠 Internal

  • Translation improvements and updates

4.6.4

🏠 Internal

  • Refactor translation files for improved readability and consistency
  • Added missing translations and language updates

4.6.3

🏠 Internal

  • Community contributions and localization improvements

4.6.2

🏠 Internal

  • When the option is turned on extraPlugins. If the plugin module does not find the desired plugin, then it tries to load it from the same folder where the plugin itself. For example, if you connect the Jodit script from ./node_moudules/jodit/es2018/jodit.js and you have a plugin ./node_moudules/jodit/es2018/plugins/my-plugin/

    Jodit.make ('#Editor', {
      extraPlugins: ['my-plugin'] // Will Be Loaded from ./node_modules/jodit/plugins/my-plugin/my-plugin.js
    });
    `` `
    
    But now if you connect Jodit from `./node_moudules/jodit/es2018/jodit.min.js`
    then the plugin will be loaded from `./node_modules/jodit/es2018/plugins/my-plugin/my-plugin.min.js`
    
    ```js
    Jodit.make ('#Editor', {
      extraPlugins: ['my-plugin'] // Will Be Loaded from ./node_modules/jodit/plugins/my-plugin/my-plugin.min.js
    });
    `` `
    

4.6.1

💥 Breaking Change

  • ESM assembly uses the flag fat_mode = true

Before in ESM build:

console.log(Jodit.constants.FAT_MODE); // false`
console.log(Jodit.fatMode); // false`

Now:

console.log(Jodit.constants.FAT_MODE); // true`
console.log(Jodit.fatMode); // true`

4.5.20

🏠 Internal

 @eslint/eslintrc                     ^3.3.0  →     ^3.3.1
 @eslint/js                          ^9.22.0  →    ^9.23.0
 @playwright/test                    ^1.51.0  →    ^1.51.1
 @swc/core                           ^1.11.8  →   ^1.11.12
 @types/node                       ^22.13.10  →  ^22.13.11
 @typescript-eslint/eslint-plugin    ^8.26.1  →    ^8.27.0
 @typescript-eslint/parser           ^8.26.1  →    ^8.27.0
 axios                                ^1.8.2  →     ^1.8.4
 eslint                              ^9.22.0  →    ^9.23.0
 stylelint                          ^16.15.0  →   ^16.16.0

4.5.19

🏠 Internal

 @eslint/compat                      ^1.2.6  →     ^1.2.7
 @eslint/eslintrc                    ^3.2.0  →     ^3.3.0
 @eslint/js                         ^9.20.0  →    ^9.22.0
 @playwright/test                   ^1.50.1  →    ^1.51.0
 @swc/core                         ^1.10.16  →    ^1.11.8
 @types/node                       ^22.13.4  →  ^22.13.10
 @typescript-eslint/eslint-plugin   ^8.24.0  →    ^8.26.1
 @typescript-eslint/parser          ^8.24.0  →    ^8.26.1
 autoprefixer                      ^10.4.20  →   ^10.4.21
 axios                               ^1.7.9  →     ^1.8.2
 core-js                            ^3.40.0  →    ^3.41.0
 css-minimizer-webpack-plugin        ^7.0.0  →     ^7.0.2
 eslint                             ^9.20.1  →    ^9.22.0
 eslint-config-prettier             ^10.0.1  →    ^10.1.1
 globals                           ^15.15.0  →    ^16.0.0
 postcss                            >=8.5.2  →    >=8.5.3
 prettier                            ^3.5.1  →     ^3.5.3
 stylelint                         ^16.14.1  →   ^16.15.0
 terser-webpack-plugin              ^5.3.11  →    ^5.3.14
 tsx                                ^4.19.2  →    ^4.19.3
 typescript                          ^5.7.3  →     ^5.8.2

4.5.17

🚀 New Feature

  • In Readonly mode, the ability to disable navigation by links has been added. By default, the option is enabled.
const editor = Jodit.make('#editor', {
	readonly: true,
	link: {
		preventReadOnlyNavigation: true
	}
});

4.5.12

🏠 Internal

 @eslint/compat                      ^1.2.3  →    ^1.2.6
 @eslint/js                         ^9.16.0  →   ^9.20.0
 @playwright/test                   ^1.49.0  →   ^1.50.1
 @swc/core                         ^1.10.11  →  ^1.10.16
 @types/node                       ^22.10.1  →  ^22.13.4
 @typescript-eslint/eslint-plugin   ^8.16.0  →   ^8.24.0
 @typescript-eslint/parser          ^8.16.0  →   ^8.24.0
 axios                               ^1.7.8  →    ^1.7.9
 compression                         ^1.7.5  →    ^1.8.0
 core-js                            ^3.39.0  →   ^3.40.0
 dotenv                             ^16.4.5  →   ^16.4.7
 eslint                             ^9.16.0  →   ^9.20.1
 eslint-config-prettier              ^9.1.0  →   ^10.0.1
 eslint-plugin-prettier              ^5.2.1  →    ^5.2.3
 glob                               ^11.0.0  →   ^11.0.1
 globals                           ^15.12.0  →  ^15.15.0
 less                                ^4.2.1  →    ^4.2.2
 mocha                              ^10.8.2  →   ^11.1.0
 postcss                           >=8.4.49  →   >=8.5.2
 prettier                            ^3.4.1  →    ^3.5.1
 stylelint                         ^16.11.0  →  ^16.14.1
 stylelint-config-standard          ^36.0.1  →   ^37.0.0
 stylelint-prettier                  ^5.0.2  →    ^5.0.3
 terser-webpack-plugin              ^5.3.10  →   ^5.3.11
 ts-loader                           ^9.5.1  →    ^9.5.2
 typescript                          ^5.7.2  →    ^5.7.3
 webpack                             5.96.1  →    5.98.0
 webpack-cli                         ^5.1.4  →    ^6.0.1
 webpack-dev-server                  ^5.1.0  →    ^5.2.0

4.5.10

🏠 Internal

  • Shit of the Chai JS module to the browser because the developers decided not to support the assembly for browsers anymore

🚀 New Feature

const editor = Jodit.make('#editor');
editor.schedulePostTask(
	() => {
		console.log('Task 1');
	},
	{ priority: 'user-blocking' }
);

4.5.5

🚀 New Feature

  • Added the ability to add their html inserts to the plugin paste
Jodit.make('#editor', {
	events: {
		onCustomPasteHTMLOption: (action, html) => {
			if (action === 'custom') {
				const div = document.createElement('div');
				div.innerHTML = html;
				const spans = div.querySelectorAll('span');
				for (let i = 0; i < spans.length; i++) {
					const span = spans[i];
					const p = document.createElement('p');
					p.innerHTML = span.innerHTML;
					span.parentNode.replaceChild(p, span);
				}
				return div.innerHTML;
			}
		}
	},
	pasteHTMLActionList: [
		{
			text: 'Custom',
			value: 'custom'
		}
	]
});

4.5.4

🏠 Internal

  • ESM build is going to the ES2018 target, not ES2020. This is due to the fact that the ES2020 target is not supported by all browsers. The ES2018 target is supported by all modern browsers. If you need to support older browsers, you can use the ES5 build.

4.5.2

🚀 New Feature

  • Added plugins/all.js for ESM build
import { Jodit } from 'jodit/esm/index.js';
console.log(Jodit.plugins.size); // 21 See. https://github.com/xdan/jodit/blob/main/tools/utils/resolve-alias-imports.ts#L81
import 'jodit/esm/plugins/all.js';
console.log(Jodit.plugins.size); // 62 and more in the future

4.5.1

💥 Breaking Change

  • If the cleanHTML.allowTags option was set, then this did not affect cleanHTML.denyTags. Now if both options are set, then cleanHTML.denyTags will only be applied to those tags that are not indicated in cleanHTML.allowTags
Jodit.make('#editor', {
	cleanHTML: {
		allowTags: 'script,p', // Only Script and P tags will be allowed
		denyTags: 'script,img' // This option is completely ignored
	}
});

4.4.8

🐛 Bug Fix

  • Fixed an error when in Jodit in the line transfer mode BR, when the indent button pressed the element was removed

4.3.1

💥 Breaking Change

  • Added the popupRoot option for all IViewBased classes (Dialog, Jodit, FileBrowser). Allows you to specify the parental element of dialogs and popup windows.
  • If the option is not specified, then when creating a dialogue, there is a bypass of a tree, starting with the editor. If an element is found dialog or eny element with position: fixed or position: absolute, then it is used as a parent.
  • Also, shadowRoot can be used as a popupRoot

Those. Parent search priorities:

  1. popupRoot option
  2. shadowRoot option
  3. The closest element dialog or with style position: fixed or position: absolute
  4. document.body

This is necessary in cases where Jodit is displayed inside the dialog windows with a focus interception. For example, when inserting in [mui dialog] (https://mui.com/material-ui/react-dialog/)

If this is your situation, then in most cases you won't need to do anything, as Jodit will find the correct parent element on its own. But if your code logic was configured specifically to insert into document.body, then you will need to explicitly specify popupRoot: document.body

const editor = Jodit.make('#editor', {
	popupRoot: document.body
});

4.2.48

🐛 Bug Fix

🏠 Internal

  • Use typings for options in Jodti.make(element, options) method

Before:

class Jodit {
	static make(element: HTMLElement | string, options?: object): Jodit {
		//...
	}
}

After:

class Jodit {
	static make(
		element: HTMLElement | string,
		options?: DeepPartial<Config>
	): Jodit {
		//...
	}
}

4.2.45

  • Fixed bug with RTL mode when all dialogs were opened without RTL mode

4.2.44

🚀 New Feature

  • Added method Jodit.modules.Helpers.ConfigDeepFlatten it allows make plain object from prototype chain object.
const editor = Jodit.make('#editor', {
	image: {
		dialogWidth: 500
	}
});

console.log(editor.o.image.openOnDblClick); // true
// But you can't get all options in plain object
console.log(JSON.stringify(editor.o.image)); // {"dialogWidth":500}

const plain = Jodit.modules.Helpers.ConfigDeepFlatten(editor.o.image);
console.log(JSON.stringify(plain)); // {"dialogWidth":500, "openOnDblClick": true, "editSrc": true, ...}

🏠 Internal

  • Update dependencies
 @eslint/compat                      ^1.2.2  →    ^1.2.3
 @eslint/eslintrc                    ^3.1.0  →    ^3.2.0
 @eslint/js                         ^9.14.0  →   ^9.16.0
 @playwright/test                   ^1.48.2  →   ^1.49.0
 @types/mocha                       ^10.0.9  →  ^10.0.10
 @types/node                        ^22.8.7  →  ^22.10.1
 @typescript-eslint/eslint-plugin   ^8.12.2  →   ^8.16.0
 @typescript-eslint/parser          ^8.12.2  →   ^8.16.0
 axios                               ^1.7.7  →    ^1.7.8
 eslint                             ^9.14.0  →   ^9.16.0
 eslint-plugin-tsdoc                 ^0.3.0  →    ^0.4.0
 globals                           ^15.11.0  →  ^15.12.0
 less                                ^4.2.0  →    ^4.2.1
 postcss                           >=8.4.47  →  >=8.4.49
 prettier                            ^3.3.3  →    ^3.4.1
 stylelint                         ^16.10.0  →  ^16.11.0
 typescript                          ^5.6.3  →    ^5.7.2

4.2.42

🚀 New Feature

🐛 Bug Fix

4.2.41

🚀 New Feature

  • Related issue: The video plugin only support content from youtube and vimeo #1170 Added options video.defaultWidth, video.defaultHeight, and video.parseUrlToVideoEmbed to the video plugin. The parseUrlToVideoEmbed option allows you to add your own video parser.

    Jodit.make('#editor', {
    	buttons: 'video',
    	video: {
    		defaultWidth: 560, // Default: 400
    		defaultHeight: 315, // Default: 345
    		parseUrlToVideoEmbed: (url, size) => {
    			// Add your own video provider
    			if (/https:\/\/sitename\.com/.test(url)) {
    				return `<iframe width="${size.width}" height="${size.height}" src="${url}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`;
    			}
    
    			return Jodit.modules.Helpers.convertMediaUrlToVideoEmbed(
    				url,
    				size
    			);
    		}
    	},
    	controls: {
    		video: {
    			tooltip: 'Insert video'
    		}
    	}
    });
    

4.2.40

🐛 Bug Fix

4.2.39

🏠 Internal

  • Chai.js switched to ESM from version 5.0.0, which led to problems with tests inside browser. To solve the problem, we abandoned node_modules version and switched to jsdelivr+esm We are not removing the dependency yet, see ./test/tests/chai-loader.js

  • Update dependencies

 @eslint/compat                       ^1.2.0  →   ^1.2.2
 @eslint/js                          ^9.12.0  →  ^9.14.0
 @playwright/test                    ^1.48.0  →  ^1.48.2
 @types/karma                         ^6.3.8  →   ^6.3.9
 @types/node                       ^20.16.11  →  ^22.8.7
 @typescript-eslint/eslint-plugin     ^8.8.1  →  ^8.12.2
 @typescript-eslint/parser            ^8.8.1  →  ^8.12.2
 compression                          ^1.7.4  →   ^1.7.5
 core-js                             ^3.38.1  →  ^3.39.0
 eslint                              ^9.12.0  →  ^9.14.0
 mini-css-extract-plugin              ^2.9.1  →   ^2.9.2
 mocha                               ^10.7.3  →  ^10.8.2
 tslib                                ^2.7.0  →   ^2.8.1
 tsx                                 ^4.19.1  →  ^4.19.2
 webpack                              5.95.0  →   5.96.1

4.2.38

🐛 Bug Fix

  • Fixed behavior of form submit with its own validation

4.2.37

🐛 Bug Fix

4.2.35

🐛 Bug Fix

4.2.34

🐛 Bug Fix

4.2.33

🐛 Bug Fix

  • Fixed bug inside Search plugin with Highlight API. When selection was not cleared

4.2.32

🚀 New Feature

Jodit.make('#editor', {
	iframe: true,
	iframeSandbox: 'allow-scripts allow-same-origin'
});

🏠 Internal

  • Move to ESLint 9
  • Update dependencies
 @playwright/test                   ^1.45.0  →   ^1.48.0
 @types/mocha                       ^10.0.7  →   ^10.0.9
 @types/node                       ^20.14.9  →   ^22.7.5
 @types/yargs                      ^17.0.32  →  ^17.0.33
 @typescript-eslint/eslint-plugin   ^7.14.1  →    ^8.8.1
 @typescript-eslint/parser          ^7.14.1  →    ^8.8.1
 autoprefixer                      ^10.4.19  →  ^10.4.20
 axios                               ^1.7.2  →    ^1.7.7
 core-js                            ^3.37.1  →   ^3.38.1
 cssnano-preset-advanced             ^7.0.3  →    ^7.0.6
 eslint                             ^8.57.0  →   ^9.12.0
 eslint-plugin-import               ^2.29.1  →   ^2.31.0
 eslint-plugin-mocha                ^10.4.3  →   ^10.5.0
 eslint-plugin-prettier              ^5.1.3  →    ^5.2.1
 eslint-plugin-simple-import-sort   ^12.1.0  →   ^12.1.1
 glob                               ^10.4.2  →   ^11.0.0
 karma                               ^6.4.3  →    ^6.4.4
 mini-css-extract-plugin             ^2.9.0  →    ^2.9.1
 mocha                              ^10.5.1  →   ^10.7.3
 node-jq                             ^4.4.0  →    ^6.0.1
 postcss                           >=8.4.38  →  >=8.4.47
 prettier                            ^3.3.2  →    ^3.3.3
 stylelint                          ^16.6.1  →  ^16.10.0
 stylelint-prettier                  ^5.0.0  →    ^5.0.2
 tslib                               ^2.6.3  →    ^2.7.0
 typescript                          ^5.5.2  →    ^5.6.3
 webpack                             5.92.1  →    5.95.0
 webpack-dev-middleware              ^7.2.1  →    ^7.4.2
 webpack-dev-server                  ^5.0.4  →    ^5.1.0

4.2.28

🚀 New Feature

Jodit.make('#editor', {
	countTextSpaces: true
});

🐛 Bug Fix

🏠 Internal

  • Use node 20 for build
  • Update dependencies
 @playwright/test                   ^1.43.1  →   ^1.45.0
 @types/mocha                       ^10.0.6  →   ^10.0.7
 @types/node                       ^20.12.5  →  ^20.14.9
 @typescript-eslint/eslint-plugin    ^7.5.0  →   ^7.14.1
 @typescript-eslint/parser           ^7.5.0  →   ^7.14.1
 axios                               ^1.6.8  →    ^1.7.2
 core-js                            ^3.36.1  →   ^3.37.1
 css-loader                          ^7.0.0  →    ^7.1.2
 css-minimizer-webpack-plugin        ^6.0.0  →    ^7.0.0
 cssnano-preset-advanced             ^6.1.2  →    ^7.0.3
 eslint-plugin-mocha                ^10.4.1  →   ^10.4.3
 eslint-plugin-simple-import-sort   ^12.0.0  →   ^12.1.0
 eslint-plugin-tsdoc                ^0.2.17  →    ^0.3.0
 glob                              ^10.3.12  →   ^10.4.2
 mini-css-extract-plugin             ^2.8.1  →    ^2.9.0
 mocha                              ^10.4.0  →   ^10.5.1
 node-jq                             ^4.3.1  →    ^4.4.0
 prettier                            ^3.2.5  →    ^3.3.2
 style-loader                        ^3.3.4  →    ^4.0.0
 stylelint                          ^16.3.1  →   ^16.6.1
 stylelint-config-standard          ^36.0.0  →   ^36.0.1
 tslib                               ^2.6.2  →    ^2.6.3
 typescript                          ^5.4.5  →    ^5.5.2
 webpack                             5.91.0  →    5.92.1

4.2.26

🐛 Bug Fix

4.2.25

🚀 New Feature

4.2.22

🐛 Bug Fix

4.2.21

🏠 Internal

  • Improved appearance of tabs
  • Fixed a bug when hovering over a button. The tooltip sometimes did not disappear

4.2.19

  • Fixed the lag between setting the activity to a list item when opening it.

4.2.18

🏠 Internal

4.2.17

🏠 Internal

  • Removed conversion of list arrays into objects when creating a button in the toolbar. Previously the code looked like:

    Jodit.make('#editor', {
    	constrols: {
    		lineHeight: {
    			list: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 2]
    		}
    	}
    });
    

    was implicitly transformed into an object of the form:

    Jodit.make('#editor', {
    	constrols: {
    		lineHeight: {
    			list: {
    				1: '1',
    				2: '2',
    				1.1: '1.1',
    				1.2: '1.2',
    				1.3: '1.3',
    				1.4: '1.4',
    				1.5: '1.5'
    			}
    		}
    	}
    });
    

    Thus, due to the nature of integer keys, the order of the elements was lost. Now such a transformation does not occur. In your code you clearly need to check what came into list and if it is an array, then use it as is.

    Jodit.make('#editor', {
      constrols: {
        lineHeight: {
          list: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 2],
          update(editor: IJodit, button): boolean {
            if (Array.isArray(button.control)) {
              // Work with array
            }
          }
        }
      }
    });
    

🐛 Bug Fix

4.2.13

🐛 Bug Fix

4.2.8

🚀 New Feature

  • Controls have a new field isVisible(editor: IJodit): boolean, which allows you to completely hide the button in some situations.
Jodit.make('#editor', {
	controls: {
		undo: {
			isVisible(editor: IJodit): boolean {
				return editor.history.canUndo();
			}
		}
	}
});

4.2.1

🐛 Bug Fix

4.1.12

💥 Breaking Change

  • Removed the default export from the watch decorator. We refrain from using default exports in this project (refer to CONTRIBUTING.md for more details).

Before:

import watch, { watch as watch2 } from 'jodit/core/decorators/watch/watch';

Now only:

import { watch } from 'jodit/core/decorators/watch/watch';

🐛 Bug Fix

4.1.11

  • Fixed a bug within the FileBrowser module. The issue was due to the import order; the Ajax configuration was applied after the module had been initialized.

4.1.9

  • Added AbortError to the Jodit.modules namespace. This is a custom error that is thrown when the user cancels the operation.
const jodit = Jodit.make('#editor');
jodit.async
	.promise((res, rej) => fetch('./test.php').then(res).catch(rej))
	.catch(error => {
		if (Jodit.modules.Helpers.isAbortError(error)) {
			console.log('Operation was aborted');
		}
	});
jodit.destruct();

4.1.7

4.1.1

🏠 Internal

  • Update dependencies

@tsconfig/node18                    ^18.2.2  →   ^18.2.4
@types/node                       ^20.11.25  →  ^20.12.2
@typescript-eslint/eslint-plugin     ^7.1.1  →    ^7.5.0
@typescript-eslint/parser            ^7.1.1  →    ^7.5.0
autoprefixer                       ^10.4.18  →  ^10.4.19
axios                                ^1.6.7  →    ^1.6.8
core-js                             ^3.36.0  →   ^3.36.1
cssnano-preset-advanced              ^6.1.0  →    ^6.1.2
eslint-plugin-mocha                 ^10.4.0  →   ^10.4.1
glob                               ^10.3.10  →  ^10.3.12
mocha                               ^10.3.0  →   ^10.4.0
open                                ^10.0.4  →   ^10.1.0
postcss                            >=8.4.35  →  >=8.4.38
stylelint                           ^16.2.1  →   ^16.3.1
typescript                           ^5.4.2  →    ^5.4.3
webpack                              5.90.3  →    5.91.0
webpack-dev-middleware               ^7.0.0  →    ^7.2.0
webpack-dev-server                   ^5.0.2  →    ^5.0.4
  • Update dependencies
@types/node                       ^20.10.7  →  ^20.11.25
@typescript-eslint/eslint-plugin   ^6.18.0  →     ^7.1.1
@typescript-eslint/parser          ^6.18.0  →     ^7.1.1
autoprefixer                      ^10.4.16  →   ^10.4.18
axios                               ^1.6.5  →     ^1.6.7
core-js                            ^3.35.0  →    ^3.36.0
css-loader                          ^6.8.1  →    ^6.10.0
css-minimizer-webpack-plugin        ^5.0.1  →     ^6.0.0
cssnano-preset-advanced             ^6.0.3  →     ^6.1.0
eslint                             ^8.56.0  →    ^8.57.0
eslint-plugin-mocha                ^10.2.0  →    ^10.4.0
eslint-plugin-prettier              ^5.1.2  →     ^5.1.3
karma                               ^6.4.2  →     ^6.4.3
karma-firefox-launcher              ^2.1.2  →     ^2.1.3
less-loader                        ^11.1.4  →    ^12.2.0
mini-css-extract-plugin             ^2.7.6  →     ^2.8.1
mocha                              ^10.2.0  →    ^10.3.0
node-jq                             ^4.2.2  →     ^4.3.1
open                               ^10.0.3  →    ^10.0.4
postcss                           >=8.4.33  →   >=8.4.35
postcss-loader                      ^7.3.4  →     ^8.1.1
prettier                            ^3.1.1  →     ^3.2.5
style-loader                        ^3.3.3  →     ^3.3.4
stylelint                          ^16.1.0  →    ^16.2.1
typescript                          ^5.3.3  →     ^5.4.2
webpack                             5.89.0  →     5.90.3
webpack-dev-server                 ^4.15.1  →     ^5.0.2
webpack-hot-middleware             ^2.26.0  →    ^2.26.1

4.0.15

  • Fixed bug in beforeInit hook. If the hook returned a promise, and the editor was destroyed after that, then after resolving the promise, the editor continued the initialization procedure

4.0.8

  • Fixed a bug in the plugins module when extra plugins did not cause the editor to be redrawn after initialization

4.0.7

4.0.2

4.0.1

4.0.0-beta.121

💥 Breaking Change

  • All static methods of the Jodit.modules.Table module have been removed and replaced with methods of an instance of the Table class with the same name.

    const jodit = Jodit.make('#editor');
    
    // Before
    Jodit.modules.Table.mergeSelected(jodit.editor.firstChild, jodit);
    
    // Now
    jodit.getInstance('Table').mergeSelected(jodit.editor.firstChild);
    
  • .jodit-filebrowser class prefix was renamed to .jodit-file-browser

  • CSS key --color-background-filebrowser-folders was removed from global scope.

🐛 Bug Fix

🏠 Internal

  • Update dependencies

     stylelint-config-idiomatic-order    v9.0.0  →   v10.0.0
     stylelint-config-standard          ^34.0.0  →   ^36.0.0
     stylelint-prettier                  ^4.1.0  →    ^4.4.0
     terser-webpack-plugin               ^5.3.9  →   ^5.3.10
     ts-node                            ^10.9.1  →   ^10.9.2
     typescript                          ^5.3.2  →    ^5.3.3
     webpack-dev-middleware              ^6.1.1  →    ^7.0.0
     webpack-hot-middleware             ^2.25.4  →   ^2.26.0
    

🚀 New Feature

  • The Jodit.getInstance method can accept a module constructor instead of its name:

    const jodit = Jodit.make('#editor');
    const table = jodit.getInstance(Jodit.modules.Table);
    const table2 = jodit.getInstance('Table'); // It still works
    console.log(table === table2); // true
    

4.0.0-beta.119

4.0.0-beta.118

🐛 Bug Fix

🏠 Internal

  • Fixed colors for selected toolbar elements in the dark theme

4.0.0-beta.117

🐛 Bug Fix

4.0.0-beta.108

🐛 Bug Fix

🏠 Internal

@types/ace                         ^0.0.50  →   ^0.0.52
@types/fs-extra                    ^11.0.3  →   ^11.0.4
@types/karma                        ^6.3.6  →    ^6.3.8
@types/node                        ^20.8.7  →  ^20.10.3
@types/postcss-css-variables       ^0.18.2  →   ^0.18.3
@types/yargs                      ^17.0.29  →  ^17.0.32
@typescript-eslint/eslint-plugin    ^6.8.0  →   ^6.13.2
@typescript-eslint/parser           ^6.8.0  →   ^6.13.2
axios                               ^1.5.1  →    ^1.6.2
core-js                            ^3.33.1  →   ^3.34.0
eslint                             ^8.52.0  →   ^8.55.0
eslint-config-prettier              ^9.0.0  →    ^9.1.0
eslint-plugin-import               ^2.28.1  →   ^2.29.0
node-jq                             ^4.0.1  →    ^4.2.2
postcss                           >=8.4.31  →  >=8.4.32
prettier                            ^3.0.3  →    ^3.1.0
stylelint-prettier                  ^4.0.2  →    ^4.1.0
ts-loader                           ^9.5.0  →    ^9.5.1
typescript                          ^5.2.2  →    ^5.3.2

4.0.0-beta.108

  • Fixed a bug in the UITextArea UI component. Instead of adding a textarea element, it was incorrectly adding an input element.

4.0.0-beta.107

🚀 New Feature

4.0.0-beta.97

🏠 Internal

  • Calls to setTimout without the async module have been removed from autotests, and most of the asynchronous tests have been rewritten from done to async/await

4.0.0-beta.96

💥 Breaking Change

  • Removed Jodit.modules.Helpers.val method

4.0.0-beta.95

🐛 Bug Fix

  • Fixed the logic of the file upload module. When HTTP errors were simply ignored.

4.0.0-beta.93

🐛 Bug Fix

  • Fixed a bug with the editor.selection.setCursorIn(box) method, which could set the cursor inside a
    .

4.0.0-beta.91

🐛 Bug Fix

@types/ace                         ^0.0.49  →   ^0.0.50
@types/fs-extra                    ^11.0.2  →   ^11.0.3
@types/karma                        ^6.3.5  →    ^6.3.6
@types/node                        ^20.8.3  →   ^20.8.7
@types/postcss-css-variables       ^0.18.1  →   ^0.18.2
@types/yargs                      ^17.0.28  →  ^17.0.29
@typescript-eslint/eslint-plugin    ^6.7.4  →    ^6.8.0
@typescript-eslint/parser           ^6.7.4  →    ^6.8.0
core-js                            ^3.33.0  →   ^3.33.1
eslint                             ^8.51.0  →   ^8.52.0
eslint-plugin-prettier              ^5.0.0  →    ^5.0.1
lint-staged                        ^14.0.1  →   ^15.0.2
stylelint                         ^15.10.3  →  ^15.11.0
webpack                             5.88.2  →    5.89.0

4.0.0-beta.89

🚀 New Feature

  • Improved UX of dialog boxes. Added two options closeOnEsc defaulting to true and closeOnClickOverlay defaulting to false.
    Jodit.make('#editor', {
    	dialog: {
    		closeOnEsc: true,
    		closeOnClickOverlay: false
    	}
    });
    // or
    const editor = Jodit.make('#editor');
    editor.alert('Hello world'); // closeOnEsc = true, closeOnClickOverlay = true
    editor
    	.dlg({
    		closeOnEsc: false,
    		closeOnClickOverlay: true
    	})
    	.open();
    

4.0.0-beta.88

🐛 Bug Fix

4.0.0-beta.78

  • Update
 @types/ace                         ^0.0.48  →   ^0.0.49
 @types/fs-extra                    ^11.0.1  →   ^11.0.2
 @types/karma                        ^6.3.4  →    ^6.3.5
 @types/node                        ^20.5.7  →   ^20.8.3
 @types/postcss-css-variables       ^0.18.0  →   ^0.18.1
 @types/yargs                      ^17.0.24  →  ^17.0.28
 @typescript-eslint/eslint-plugin    ^6.5.0  →    ^6.7.4
 @typescript-eslint/parser           ^6.5.0  →    ^6.7.4
 autoprefixer                      ^10.4.15  →  ^10.4.16
 axios                               ^1.5.0  →    ^1.5.1
 chai                                ^4.3.8  →   ^4.3.10
 core-js                            ^3.32.1  →   ^3.33.0
 eslint                             ^8.48.0  →   ^8.51.0
 eslint-plugin-mocha                ^10.1.0  →   ^10.2.0
 glob                               ^10.3.3  →  ^10.3.10
 postcss                           >=8.4.28  →  >=8.4.31
 prettier                            ^3.0.2  →    ^3.0.3
 ts-loader                           ^9.4.4  →    ^9.5.0

4.0.0-beta.78

  • Update
 @types/karma                        ^6.3.3  →    ^6.3.4
 @types/node                        ^20.1.0  →   ^20.5.0
 @typescript-eslint/eslint-plugin   ^5.59.2  →    ^6.4.0
 @typescript-eslint/parser          ^5.59.2  →    ^6.4.0
 autoprefixer                      ^10.4.14  →  ^10.4.15
 core-js                            ^3.30.2  →   ^3.32.0
 css-loader                          ^6.7.3  →    ^6.8.1
 css-minimizer-webpack-plugin        ^5.0.0  →    ^5.0.1
 eslint                             ^8.40.0  →   ^8.47.0
 eslint-config-prettier              ^8.8.0  →    ^9.0.0
 eslint-plugin-import               ^2.27.5  →   ^2.28.0
 eslint-plugin-prettier              ^4.2.1  →    ^5.0.0
 glob                               ^10.2.2  →   ^10.3.3
 less                                ^4.1.3  →    ^4.2.0
 less-loader                        ^11.1.0  →   ^11.1.3
 lint-staged                        ^13.2.2  →   ^14.0.0
 mini-css-extract-plugin             ^2.7.5  →    ^2.7.6
 node-jq                             ^2.3.5  →    ^4.0.1
 postcss                           >=8.4.23  →  >=8.4.27
 postcss-loader                      ^7.3.0  →    ^7.3.3
 prettier                            ^2.8.8  →    ^3.0.1
 style-loader                        ^3.3.2  →    ^3.3.3
 stylelint                          ^15.6.1  →  ^15.10.2
 stylelint-config-standard          ^33.0.0  →   ^34.0.0
 stylelint-prettier                  ^3.0.0  →    ^4.0.2
 synchronous-promise                 2.0.15  →    2.0.17
 terser-webpack-plugin               ^5.3.8  →    ^5.3.9
 ts-loader                           ^9.4.2  →    ^9.4.4
 tslib                               ^2.5.0  →    ^2.6.1
 typescript                          ^5.0.4  →    ^5.1.6
 webpack                             5.82.0  →    5.88.2
 webpack-cli                         ^5.1.0  →    ^5.1.4
 webpack-dev-middleware              ^6.1.0  →    ^6.1.1
 webpack-dev-server                 ^4.15.0  →   ^4.15.1
 webpack-hot-middleware             ^2.25.3  →   ^2.25.4

4.0.0-beta.77

🐛 Bug Fix

🚀 New Feature

4.0.0-beta.52

💥 Breaking Change

  • Removed deprecated selection.applyStyle method

  • Change Creates. Sandbox signature to return body,iframe tuple

  • In the plugin system, the requirement field has been removed from instances, only the field in the constructor has been left

    class somePlugin extends Jodit.modulules.Plugin {
    	static requires = ['hotkeys']; // It still works
    	requires = ['hotkeys']; // Now it does not work
    }
    
  • Deprecated were removed

    • Dom.isTag does not support array
    • Select.applyStyle method was removed
    • history.observer was removed
    • editorCssClass removed
  • wrapNodes.exclude changed from array to set

  • allowResizeTags changed from array to set

  • resizer.useAspectRatio changed from array to set

  • All css variables renamed to kebab-case

4.0.0-beta.42

  • Remove all languages from lang/index.js for ESM build
  • Only base plugins list in plugins/index.js for ESM build
  • Remove polyfills from ESM build
  • Remove composer.json

4.0.0-beta.10

@types/node                       ^18.15.12  →  ^20.1.0
@typescript-eslint/eslint-plugin    ^5.59.0  →  ^5.59.2
@typescript-eslint/parser           ^5.59.0  →  ^5.59.2
axios                                ^1.3.6  →   ^1.4.0
core-js                             ^3.30.1  →  ^3.30.2
cssnano-preset-advanced              ^6.0.0  →   ^6.0.1
eslint                              ^8.38.0  →  ^8.40.0
glob                                ^10.2.1  →  ^10.2.2
karma                                ^6.4.1  →   ^6.4.2
lint-staged                         ^13.2.1  →  ^13.2.2
open                                 ^8.4.2  →   ^9.1.0
postcss-loader                       ^7.2.4  →   ^7.3.0
prettier                             ^2.8.7  →   ^2.8.8
puppeteer                          ^19.10.0  →  ^20.1.1
stylelint                           ^15.5.0  →  ^15.6.1
terser-webpack-plugin                ^5.3.7  →   ^5.3.8
webpack                              5.80.0  →   5.82.0
webpack-cli                          ^5.0.1  →   ^5.1.0
webpack-dev-middleware               ^6.0.2  →   ^6.1.0
webpack-dev-server                  ^4.13.3  →  ^4.15.0
yargs                               ^17.7.1  →  ^17.7.2

4.0.0.beta-0

💥 Breaking Change

  • !!! Build files removed from repository and only available in npm package !!!
  • !!! bowers.json was removed !!!
  • server.js was removed
  • All build js files was rewritten to typescript
  • build-system was renamed as tools
  • Removed exludeLangs build option. Instead use --includeLanguages=en option.
  • Default target for build was changed to es2015
  • Build in es2018 target was removed, instead es2021 was added
  • Event getIcon was removed. Use option getIcon instead
Jodit.make('#editor', {
	getIcon: (name: string, clearName: string) => {
		if (name === 'bold') {
			return '<svg>...</svg>';
		}

		return null;
	}
});
  • Removed errorMessage event. Use module.messages instead

    Jodit.make('#editor').message.info('Hello world');
    

🚀 New Feature

  • Added Jodit.modules.Dom.isList method
  • Added Jodit.modules.Dom.isLeaf method
  • Added plugin delete for correct delete content with command delete

🏠 Internal

@types/node                       ^18.13.0  →  ^18.15.12
@typescript-eslint/eslint-plugin   ^5.50.0  →    ^5.59.0
@typescript-eslint/parser          ^5.50.0  →    ^5.59.0
autoprefixer                      ^10.4.13  →   ^10.4.14
axios                               ^1.3.3  →     ^1.3.6
core-js                            ^3.28.0  →    ^3.30.1
css-minimizer-webpack-plugin        ^4.2.2  →     ^5.0.0
cssnano-preset-advanced             ^5.3.9  →     ^6.0.0
eslint                             ^8.34.0  →    ^8.38.0
eslint-config-prettier              ^8.6.0  →     ^8.8.0
expect-mocha-image-snapshot         ^3.0.1  →    ^3.0.13
glob                                ^8.1.0  →    ^10.2.1
karma-chrome-launcher               ^3.1.1  →     ^3.2.0
lint-staged                        ^13.1.2  →    ^13.2.1
mini-css-extract-plugin             ^2.7.2  →     ^2.7.5
postcss                           >=8.4.21  →   >=8.4.23
postcss-css-variables              ^0.18.0  →    ^0.19.0
postcss-loader                      ^7.0.2  →     ^7.2.4
prettier                            ^2.8.4  →     ^2.8.7
puppeteer                          ^19.7.0  →   ^19.10.0
style-loader                        ^3.3.1  →     ^3.3.2
stylelint                          ^15.1.0  →    ^15.5.0
stylelint-config-standard          ^30.0.1  →    ^33.0.0
stylelint-prettier                  ^2.0.0  →     ^3.0.0
terser-webpack-plugin               ^5.3.6  →     ^5.3.7
tsc-alias                           ^1.8.2  →     ^1.8.5
typescript                          ^4.9.5  →     ^5.0.4
webpack                             5.76.0  →     5.80.0
webpack-dev-middleware              ^6.0.1  →     ^6.0.2
webpack-dev-server                 ^4.11.1  →    ^4.13.3
yargs                              ^17.6.2  →    ^17.7.1

3.24.6

🏠 Internal

  • Jodit.modules.Helpers.htmlspecialchars marked as deprecated. Instead use Jodit.modules.Helpers.stripTags
  • Jodit.modules.Helpers.stripTags added third argument for excluding tags
Jodit.modules.Helpers.stripTags(
	'<p>test <strong>po<br/>p</strong><br/>stop <em>lop</em><br/></p>',
	document,
	new Set(['p', 'br'])
);
// <p>test po<br>p<br>stop lop<br></p>
  • Inside safeMode will init only safePluginsList plugins. It used to init extraPlugins too.
  • size plugin was added in default safePluginsList
const editor = Jodit.make('#editor', {
	safeMode: true,
	safePluginsList: ['enter', 'backspace']
});
console.log(editor.__plugins); // only 'enter', 'backspace'

3.24.5

🐛 Bug Fix

🏠 Internal

core-js                             ^3.27.2  →   ^3.28.0
@types/node                       ^18.11.19  →  ^18.13.0
axios                                ^1.3.2  →    ^1.3.3
eslint                              ^8.33.0  →   ^8.34.0
karma-sourcemap-loader               ^0.3.8  →    ^0.4.0
lint-staged                         ^13.1.0  →   ^13.1.2
open                                 ^8.4.0  →    ^8.4.1
prettier                             ^2.8.3  →    ^2.8.4
puppeteer                           ^19.6.3  →   ^19.7.0
stylelint                          ^14.16.1  →   ^15.1.0
stylelint-config-prettier            ^9.0.4  →    ^9.0.5
stylelint-config-standard           ^29.0.0  →   ^30.0.1
synchronous-promise                  2.0.15  →    2.0.17

3.24.4

💥 Breaking Change

  • Options to hide the functionality of editing directories and files filebrowser.createNewFolder, filebrowser.editImage, filebrowser.deleteFolder,filebrowser.renameFolder,filebrowser.moveFolder,filebrowser.moveFile were marked as deprecated.
  • Instead added filebrowser.permissionsPresets: Partial<IPermissions> option.

Before:

Jodit.make('#editor', {
	filebrowser: {
		createNewFolder: false,
		deleteFolder: false,
		renameFolder: false,
		moveFolder: false,
		moveFile: false,
		editImage: false,
		ajax: {
			url: 'https://xdsoft.net/jodit/finder/'
		}
	}
});

Now

Jodit.make('#editor', {
	filebrowser: {
		permissionsPresets: {
			allowFiles: false,
			allowFileMove: false,
			allowFileUpload: false,
			allowFileUploadRemote: false,
			allowFileRemove: false,
			allowFileRename: false,
			allowFolders: false,
			allowFolderCreate: false,
			allowFolderMove: false,
			allowFolderRemove: false,
			allowFolderRename: false,
			allowImageResize: false,
			allowImageCrop: false
		},
		ajax: {
			url: 'https://xdsoft.net/jodit/finder/'
		}
	}
});

3.24.3

🏠 Internal

 core-js                            ^3.26.1  →    ^3.27.2
 @types/node                       ^18.11.9  →  ^18.11.19
 @typescript-eslint/eslint-plugin   ^5.45.0  →    ^5.50.0
 @typescript-eslint/parser          ^5.45.0  →    ^5.50.0
 axios                               ^1.2.0  →     ^1.3.2
 css-loader                          ^6.7.2  →     ^6.7.3
 eslint                             ^8.28.0  →    ^8.33.0
 eslint-config-prettier              ^8.5.0  →     ^8.6.0
 eslint-plugin-import               ^2.26.0  →    ^2.27.5
 expect-mocha-image-snapshot        ^2.0.14  →     ^3.0.1
 glob                                ^8.0.3  →     ^8.1.0
 husky                               ^8.0.2  →     ^8.0.3
 lint-staged                        ^13.0.4  →    ^13.1.0
 mini-css-extract-plugin             ^2.7.0  →     ^2.7.2
 mocha                              ^10.1.0  →    ^10.2.0
 nock                               ^13.2.9  →    ^13.3.0
 postcss                           >=8.4.19  →   >=8.4.21
 postcss-loader                      ^7.0.1  →     ^7.0.2
 prettier                            ^2.8.0  →     ^2.8.3
 puppeteer                          ^19.3.0  →    ^19.6.3
 stylelint                         ^14.15.0  →   ^14.16.1
 synchronous-promise                 2.0.15  →     2.0.17
 ts-loader                           ^9.4.1  →     ^9.4.2
 tsc-alias                           ^1.7.1  →     ^1.8.2
 tslib                               ^2.4.1  →     ^2.5.0
 typescript                          ^4.9.3  →     ^4.9.5
 webpack-cli                         ^5.0.0  →     ^5.0.1

3.24.2

🚀 New Feature

3.24.1

💥 Breaking Change

  • Constant array MAY_BE_REMOVED_WITH_KEY was replaced on set INSEPARABLE_TAGS

🚀 New Feature

  • Method Select.applyStyle marked as deprecated. Use Select.commitStyle instead.

Before:

jodit.select.applyStyle(
	{ color: red },
	{
		element: 'strong'
	}
);

Now:

jodit.s.commitStyle({
	element: 'strong',
	attributes: {
		style: {
			color: 'red'
		}
	}
});
  • In the options of the Select.commitStyle method, the attributes property has been added, which allows you to also set attributes when applying a style.
jodit.s.commitStyle({
	element: 'a',
	attributes: {
		href: 'https://stename.ru'
	}
});

Wraps the selected text into a link with the specified address.

  • When inserting a url, if the text is selected, it will automatically be replaced with a link

  • In Tab plugin allow use shift+tab for lists

🐛 Bug Fix

🏠 Internal

  • Fixed deletion of the asserts function from the production code, instead of regular expressions, transformers are used****

3.23.3

🚀 New Feature

  • Added option IControlType.childExec Allows you to set a separate handler for list items
Jodit.make('.editor', {
	buttons: [
		{
			name: 'add-date',
			iconURL: 'stuf/dummy.png',
			list: {
				options: 'Open options'
			},
			exec(editor, current, control) {
				editor.s.insertHTML(new Date().toString());
			},
			childExec(editor, current, control) {
				if (control.args[0] === 'options') {
					editor.alert('Options');
				}
			}
		}
	]
});

3.23.2

🐛 Bug Fix

🏠 Internal

  • Deleted ajax.dataType option, because it was not used

3.23.1

💥 Breaking Change

  • Remove IJodit from first argument of Ajax constructor.

🚀 New Feature

  • The focus method and the isFocused property have been added to the IJodit interface. These are just aliases for the same methods and properties of the Select module.
const editor = Jodit.make('#editor');
editor.focus();
  • The IJodit.fetch method has been added to the IJodit interface, which is similar in signature to the fetch method in the browser
const editor = Jodit.make('#editor');
const data = await editor.fetch('https://somesite.com?type=json');

🐛 Bug Fix

  • Fixed error when using superscript and subscript commands. If the cursor was inside sub or sup tags, then nothing happened.
  • Fixed a bug in the placeholder plugin when indent styles were set for the edit area, they were not taken into account in the positioning of the placeholder. As a result, it was shifted relative to the focus.

3.22.1

💥 Breaking Change

  • ISnapshot.isBlocked - is readonly now
  • IHistory.snapshot - is readonly now
  • IHistory.processChanges and IHistory.upTick were removed.
  • Instead of IHistory.snapshot.isBlocked=true...IHistory.snapshot.isBlocked=false should be used IHistory.snapshot.transaction(() => {...})
  • IJodit.registerCommand<C extends string> - is generic now
  • IJodit.getNativeEditorValue - marked as internal, please do not use it in your code
  • To class .jodit-container was added background-color: var(--color-background-light-gray);
  • To class .jodit-workplace was added background-color: var(--color-background-default);
  • Selection markers now are marked as temporary with Dom.markTemporary
  • Search plugin move selection to the next found element after replacing. See bug fix section
  • WrapNodes plugin added emptyBlockAfterInit=true option. After the editor is initialized, if it is empty, an empty block will be added to it.

🐛 Bug Fix

🏠 Internal

core-js                            ^3.25.5  →   ^3.26.0
@types/node                       ^18.11.0  →  ^18.11.9
@typescript-eslint/eslint-plugin   ^5.40.0  →   ^5.42.0
@typescript-eslint/parser          ^5.40.0  →   ^5.42.0
autoprefixer                      ^10.4.12  →  ^10.4.13
cssnano-preset-advanced             ^5.3.8  →    ^5.3.9
eslint                             ^8.25.0  →   ^8.26.0
puppeteer                          ^19.0.0  →   ^19.2.1
replace                             ^1.2.1  →    ^1.2.2
tslib                               ^2.4.0  →    ^2.4.1
yargs                              ^17.6.0  →   ^17.6.1

3.21.5

3.21.4

🐛 Bug Fix

🏠 Internal

@types/node ^18.8.3 → ^18.11.0 axios ^1.1.2 → ^1.1.3 css-minimizer-webpack-plugin ^4.2.1 → ^4.2.2 mocha ^10.0.0 → ^10.1.0 postcss >=8.4.17 → >=8.4.18 puppeteer ^18.2.1 → ^19.0.0 stylelint ^14.13.0 → ^14.14.0 stylelint-config-standard ^28.0.0 → ^29.0.0

3.21.1

💥 Breaking Change

  • Filebrowser adds a timestamp to the image preview url, now it will be the same as the server returned the changed field in the response. This is necessary for better caching in the browser.
  • cleanHTML.denyTags default equal script Those. script tags are disabled by default. If you need them then turn off this rule:
Jodit.make('#editor', {
	cleanHTML: {
		denyTags: false
	}
});
  • The order of the hotkeys plugin keys has been changed to a more popular one. It used to be: b+meta, b+ctrl Now: meta+b, ctrl+b This is expressed in the installation of handlers for keyboard shortcuts:
Jodit.make('#editor', { disablePlugins: ['bold'] }).e.on('meta+b', () => {
	alert('Do smth with text');
	return false;
});

🏠 Internal

  • Remove assert calls from production build.
  • Update deps
core-js                            ^3.24.1  →   ^3.25.5
@types/node                        ^18.7.3  →   ^18.8.3
@typescript-eslint/eslint-plugin   ^5.33.0  →   ^5.39.0
@typescript-eslint/parser          ^5.33.0  →   ^5.39.0
autoprefixer                       ^10.4.8  →  ^10.4.12
axios                              ^0.27.2  →    ^1.1.2
css-minimizer-webpack-plugin        ^4.0.0  →    ^4.2.1
eslint                             ^8.22.0  →   ^8.25.0
eslint-plugin-tsdoc                ^0.2.16  →   ^0.2.17
express                            ^4.18.1  →   ^4.18.2
karma                               ^6.4.0  →    ^6.4.1
less-loader                        ^11.0.0  →   ^11.1.0
postcss                           >=8.4.16  →  >=8.4.17
puppeteer                          ^17.0.0  →   ^18.2.1
stylelint                         ^14.10.0  →  ^14.13.0
stylelint-config-idiomatic-order    v8.1.0  →    v9.0.0
stylelint-config-standard          ^27.0.0  →   ^28.0.0
synchronous-promise                ^2.0.15  →   ^2.0.16
terser-webpack-plugin               ^5.3.4  →    ^5.3.6
ts-loader                           ^9.3.1  →    ^9.4.1
typescript                          ^4.8.2  →    ^4.8.4
webpack                             5.73.0  →    5.74.0
webpack-dev-server                  ^4.9.3  →   ^4.11.1
webpack-hot-middleware             ^2.25.1  →   ^2.25.2
yargs                              ^17.5.1  →   ^17.6.0

3.20.4

🏠 Internal

  • Move error-messages functionality to messages module.
  • Improved appearance of popup messages in the messages module.

🐛 Bug Fix

  • Fixed a bug in the limit plugin. When the limit was reached, he checked the limits strictly, when entering from the keyboard. Therefore, every time I change the input focus.
  • Events are added to the same plugin when limits are reached. More details can be found in the documentation limit

3.20.3

🏠 Internal

  • En lang is loaded as is
  • Fix types generation:
    • Remove styles
    • Replace aliases

🐛 Bug Fix

3.20.2

🏠 Internal

  • Tooltip plugin functionality moved to ui/button/tooltip so that it can be used not only with the editor

🐛 Bug Fix

  • Fixed bug in add-new-line in iframe-mode

3.20.1

🚀 New Feature

  • Removed Panel and IPanel
  • Made IDlgs and Dlgs traits
  • Added @derive decorator
  • Mods/Elms/Dlgs traits now uses with @derive
  • Added dtd plugin. Read more

🏠 Internal

🐛 Bug Fix

3.19.5

🚀 New Feature

🐛 Bug Fix

3.19.4

🚀 New Feature

Jodit.make('#editor', {
	uploader: {
		url: 'https://sitename.net/jodit/connector/index.php?action=fileUpload',
		getDisplayName: (_, name) => 'File:' + name
	}
});
  • Added cleanHTML.useIframeSandbox:boolean option(default: false). Use iframe[sandbox] to paste HTML code into the editor to check it for safety. Allows you not to run scripts and handlers, but it works much slower

🐛 Bug Fix

3.19.3

🐛 Bug Fix

  • Quick fix bug with webpack output.clean=true.

3.19.2

🐛 Bug Fix

  • Big bugfix in es2021 version, sideEffect cut all styles and configs

3.19.1

🏠 Internal

  • Plugin icons moved to their respective plugins
  • Used plugin webpack.ids.DeterministicModuleIdsPlugin for more reliable sharing of exported module names between builds. Now you can include plugins from 'es5' in the assembly for 'es2021.en'.
  • Deps
     @types/node                       ^17.0.36  →  ^17.0.41
     @typescript-eslint/eslint-plugin   ^5.27.0  →   ^5.27.1
     @typescript-eslint/parser          ^5.27.0  →   ^5.27.1
     cssnano-preset-advanced             ^5.3.6  →    ^5.3.7
     eslint                             ^8.16.0  →   ^8.17.0
     lint-staged                        ^12.4.3  →   ^13.0.0
     terser-webpack-plugin               ^5.3.1  →    ^5.3.3
     typescript                          ^4.7.2  →    ^4.7.3
     webpack                            ^5.72.1  →   ^5.73.0
     webpack-dev-server                  ^4.9.0  →    ^4.9.2
     core-js                            ^3.22.7  →   ^3.22.8
    

3.18.7

🚀 New Feature

🐛 Bug Fix

3.18.6

🚀 New Feature

3.18.5

💥 Breaking Change

  • Added default table style to createAttributes option:
Jodit.defaultOptions.createAttributes = {
	table: {
		style: 'border-collapse:collapse;width: 100%;'
	}
};

🐛 Bug Fix

3.18.4

🚀 New Feature

  • Added option uploader.processFileName - The method can be used to change the name of the uploaded file
Jodit.make('#editor', {
	uploader: {
		url: 'some-connector.php',
		processFileName: (key, file, name) => {
			return [key, file, 'some-prefix_' + name];
		}
	}
});
  • Fixed file naming error when uploading to server

3.18.3

🐛 Bug Fix

  • Fixed a bug where pressing Esc did not close the dialog

3.18.2

💥 Breaking Change

The on/one/off methods of the Jodit Event System have been greatly simplified:

instead:

editor.e.on(
	'click',
	() => {
		alert('Clicked!');
	},
	undefined,
	true
);

Now:

editor.e.on(
	'click',
	() => {
		alert('Clicked!');
	},
	{
		top: true
	}
);

Also, the methods now support an array of events:

editor.e.on('click mousedown mouseup', () => {
	alert('Some event!');
});
editor.e.on(['click', 'mousedown', 'mouseup'], () => {
	alert('Some event!');
});

🚀 New Feature

🐛 Bug Fix

🏠 Internal

  • Instead of a self-written truncated polyfill for Array.from, the core-js module is used

  • Moved the test files to the appropriate directories

  • Update deps

     @types/node                       ^17.0.23  →  ^17.0.31
     @typescript-eslint/eslint-plugin   ^5.19.0  →   ^5.22.0
     @typescript-eslint/parser          ^5.19.0  →   ^5.22.0
     autoprefixer                       ^10.4.4  →   ^10.4.7
     axios                              ^0.26.1  →   ^0.27.2
     eslint                             ^8.13.0  →   ^8.14.0
     express                            ^4.17.3  →   ^4.18.1
     karma                              ^6.3.17  →   ^6.3.19
     lint-staged                        ^12.3.7  →   ^12.4.1
     mocha                               ^9.2.2  →   ^10.0.0
     postcss                           >=8.4.12  →  >=8.4.13
     stylelint                          ^14.6.1  →   ^14.8.2
     ts-loader                           ^9.2.8  →    ^9.3.0
     tslib                               ^2.3.1  →    ^2.4.0
     typescript                          ^4.6.3  →    ^4.6.4
     webpack-dev-server                  ^4.8.1  →    ^4.9.0
     core-js                            ^3.21.1  →   ^3.22.4
    

3.17.1

💥 Breaking Change

Some minifier configurations do not correctly handle inheritance in the component decorator, we added some helper code earlier to make this work correctly. We tried to determine belonging by the name of the component and not by its constructor or prototype. Because in some build system(ex. create-react-app):

@component
class A extends Component {
	className() {
		return 'A';
	}
}
const a = new A();
a instanceof Component; // false - only in some cases
elm.className() === A.prototype.className(); // true

In most cases, this entailed new bugs, so in 3.17 we decided to remove this heuristic. If something broke in your assembly, please create an issue on github.

🐛 Bug Fix

const editor = Jodit.make('#editor');
editor.s.insertHTML('test', false);

🏠 Internal

  • Update
@typescript-eslint/eslint-plugin  ^5.16.0  →  ^5.19.0
@typescript-eslint/parser         ^5.16.0  →  ^5.19.0
cssnano-preset-advanced            ^5.3.1  →   ^5.3.3
eslint                            ^8.12.0  →  ^8.13.0
eslint-plugin-tsdoc               ^0.2.14  →  ^0.2.16
prettier                           ^2.6.1  →   ^2.6.2
webpack                           ^5.70.0  →  ^5.72.0
webpack-dev-server                 ^4.7.4  →   ^4.8.1
yargs                             ^17.4.0  →  ^17.4.1

3.16.6

🐛 Bug Fix

3.16.5

🚀 New Feature

  • imageProcessor.replaceDataURIToBlobIdInView The imageProcessor plugin has added the functionality of replacing data-uri objects in the src of images with blob-url. This allows you to more conveniently work with an HTML document without loading the processor. Checks if the imageProcessor.replaceDataURIToBlobIdInView option is enabled then converts image src which has data:base64 to blob-object-uri

In this case, Jodit.value returns images with data-uri. And original textarea itself does the reverse replacement take place.

const editor = Jodit.make('#editor', {
	imageProcessor: {
		replaceDataURIToBlobIdInView: true // This is the default value, but for examples we set it
	}
});

editor.value =
	'<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII="/></p>';
console.log(editor.value); // <p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII="/></p>
console.log(editor.getElementValue()); // '<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII="/></p>'
console.log(editor.getNativeEditorValue()); // <p><img src="blob:http://localhost:2000/03377cf0-6260-4351-82ad-8a8901ea104f"></p>
  • Method Jodit.setElementValue marked us deprecated and will be removed in next major release.

🏠 Internal

  • Update
@types/node                       ^17.0.21  →  ^17.0.23
@typescript-eslint/eslint-plugin   ^5.14.0  →   ^5.16.0
@typescript-eslint/parser          ^5.14.0  →   ^5.16.0
autoprefixer                       ^10.4.2  →   ^10.4.4
cssnano-preset-advanced             ^5.2.4  →    ^5.3.1
eslint                             ^8.11.0  →   ^8.12.0
lint-staged                        ^12.3.5  →   ^12.3.7
postcss                            >=8.4.8  →  >=8.4.12
prettier                            ^2.5.1  →    ^2.6.1
stylelint                          ^14.5.3  →   ^14.6.1
typescript                          ^4.6.2  →    ^4.6.3
yargs                              ^17.3.1  →   ^17.4.0

3.16.4

🐛 Bug Fix

3.16.3

  • Fixed composition wait and debounce decorators

3.16.2

🐛 Bug Fix

3.16.1

🚀 New Feature

  • Added spellcheck plugin.
  • Added Config.pasteHTMLActionList and Config.pasteFromWordActionList options https://github.com/xdan/jodit/issues/802.
  • Added Jodit.synchronizeValues() method. The method synchronizes the WYSIWYG values of the editor
  • and the original input field. The method works through Async.throttle.
  • Added a new class for working with DOM without blocking the main thread LazyWalker
  • Search engine replace on LazyWalker
  • CleanHTML plugin engine replace on LazyWalker
  • Search plugin now highlights all found options https://github.com/xdan/jodit/issues/798
  • Added Jodit.constants https://github.com/xdan/jodit/issues/806

💥 Breaking Change

  • Renamed wrap-text-nodes plugin to wrap-nodes
  • Option spellcheck = false by default. This is due to the fact that the built-in spell check slows down the editor very much on large tests.
  • Enabled @typescript-eslint/explicit-function-return-type in eslint

🐛 Bug Fix

🏠 Internal

  • clean-html plugin now works via requestIdleCallback and doesn't slow down the browser

3.15.3

💥 Breaking Change

  • Observer module renamed to History, accessed via Jodit.history
  • Jodit.observer field deprecated and will be removed in future releases
  • Changed to history in observer settings. The observer field has been deprecated.
  • Removed stack field from History class (former Observer).
  • Separated default editor timeout and history.timeout. Now the second setting is just for history. Timeouts for all asynchronous operations in Jodit now apply the defaultTimeout setting

Before:

const editor = Jodit.make({
	observer: {
		timeout: 122,
		maxHistoryLength: 100
	}
});
console.log(editor.defaultTimeout); // 122
editor.observer.stack.clear();

Now:

const editor = Jodit.make({
	defaultTimeout: 122,
	history: {
		timeout: 1000,
		maxHistoryLength: 100
	}
});
console.log(editor.defaultTimeout); // 122
editor.history.clear();

🐛 Bug Fix

3.15.2

3.15.1

🚀 New Feature

🏠 Internal

  • The Dom.isNode method now uses Duck Typing instead of inctanceof, this seems to be enough
  • Update @types/node ^17.0.18 → ^17.0.21 @typescript-eslint/eslint-plugin ^5.12.0 → ^5.13.0 @typescript-eslint/parser ^5.12.0 → ^5.13.0 cssnano-preset-advanced ^5.1.12 → ^5.2.1 eslint ^8.9.0 → ^8.10.0 eslint-config-prettier ^8.4.0 → ^8.5.0 karma ^6.3.16 → ^6.3.17 mini-css-extract-plugin ^2.5.3 → ^2.6.0 postcss >=8.4.6 → >=8.4.7 stylelint ^14.5.1 → ^14.5.3 ts-loader ^9.2.6 → ^9.2.7 typescript ^4.5.5 → ^4.6.2 webpack ^5.69.1 → ^5.70.0

3.14.2

🚀 New Feature

  • Added an experimental module for working with VDom<->Dom, an attempt to switch to this technology in the editor

🏠 Internal

  • @types/node ^17.0.15 → ^17.0.18
  • @typescript-eslint/eslint-plugin ^5.10.2 → ^5.12.0
  • @typescript-eslint/parser ^5.10.2 → ^5.12.0
  • axios ^0.25.0 → ^0.26.0
  • cssnano-preset-advanced ^5.1.11 → ^5.1.12
  • eslint ^8.8.0 → ^8.9.0
  • eslint-config-prettier ^8.3.0 → ^8.4.0
  • express ^4.17.2 → ^4.17.3
  • karma ^6.3.15 → ^6.3.16
  • lint-staged ^12.3.3 → ^12.3.4
  • mocha ^9.2.0 → ^9.2.1
  • stylelint ^14.3.0 → ^14.5.1
  • stylelint-config-standard ^24.0.0 → ^25.0.0
  • webpack ^5.68.0 → ^5.69.1
  • core-js ^3.21.0 → ^3.21.1

3.14.1

🏠 Internal

💥 Breaking Change

  • Changed the positions of some buttons on different resolutions for greater density
  • Disabled the ability to drag and drop elements on mobile devices as it affected page scrollability

🐛 Bug Fix

3.13.5

🐛 Bug Fix

3.13.4

🚀 New Feature

  • Plugin for setting line spacing

🐛 Bug Fix

3.13.2

🚀 New Feature

  • Added a plugin to handle pressing the Tab key, it added the functionality of processing a keystroke inside the UL/li element and allows you to add tree-like lists.
  • Added static Jodit.isJoditAssigned method: Checks if the element has already been initialized when for Jodit
const area = document.getElementById('editor');
(Jodit.make(area) === Jodit.make(area)) === Jodit.make(area);
console.log(Jodit.isJoditAssigned(area)); // true
const editor = Jodit.make(area);
editor.destruct();
console.log(Jodit.isJoditAssigned(area)); // false

🐛 Bug Fix

3.13.1

💥 Breaking Change

  • ObserveObject removed
  • Added observable function which makes object observable. In this case, the function returns the same object.
const obj = {
	a: 1,
	b: {
		c: 5
	}
};

const obsObj = Jodit.modules.observable(obj);
console.log(obj === obsObj); // true
obsObj.on('change', () => {
	console.log('Object changed');
});
obsObj.on('change.a', () => {
	console.log('Key a changed');
});
obsObj.on('change.b.c', () => {
	console.log('Key b.c changed');
});

obj.a = 6;
// Object changed
// Key a changed

obj.b = { c: 6 };
// Object changed

obj.b.c = 8;
// Object changed
// Key b.c changed

🐛 Bug Fix

  • Fixed autotest in Chrome on Windows

3.12.5

🚀 New Feature

  • Added options safeMode:boolean and safePluginsList:string[] for debugging
Jodit.make('#editor', {
	safeMode: true,
	safePluginsList: ['about']
});

Only one plugin will be activated. Convenient for debugging and your plugins, you can turn off all the others.

🐛 Bug Fix

  • Fixed a bug due to which Jodit did not work in ie11, + added a polyfill for the iterator

3.12.3

🚀 New Feature

  • Added monospace button in format list https://github.com/xdan/jodit/issues/767
  • In plugin paste added memorizeChoiceWhenPasteFragment option: when the user inserts a piece of HTML, the plugin will ask - How to insert it. If after that user insert the same fragment again, the previous option will be used without extra question.

memorizeChoiceWhenPasteFragment = false, by default, it is Breaking change

3.12.1

💥 Breaking Change

  • ObserveObject renamed to ObservableObject
const obj = { a: 1, b: 2 };
const observed = Jodit.modules.ObservableObject.create(obj);

observed.on('change', (oldV, newV) => console.log(oldV, newV));
observed.a = 5;

🐛 Bug Fix

🚀 New Feature

  • In addition to the preinstalled editors, the source plugin adds the ability to use its own implementation. You can read more in the documentation

3.11.2

🐛 Bug Fix

  • Fixed a bug when resizing images whose size was specified in the style attribute - the size did not change

3.11.1

💥 Breaking Change

  • Plugin Delete renamed to Backspace. And it is highly refractory.

🚀 New Feature

  • Open localhost in browser on npm start
  • Added Async.prototype.delay method
await editor.async.delay(1000);
alert('Alert after 1s');
  • Added Ajax.options.responseType option XMLHttpRequestResponseType
  • Added Response.prototype.blob() method
const ajax = new Jodit.modules.Ajax({ responseType: 'blob' });
await ajax.send().then(resp => resp.blob());

🐛 Bug Fix

3.10.2

💥 Breaking Change

  • The hotkeys have been castled in the Delete plugin: Was:
const hotkeys = {
	delete: ['delete', 'cmd+backspace'],
	deleteWord: ['ctrl+delete', 'cmd+alt+backspace', 'ctrl+alt+backspace'],
	backspace: ['backspace'],
	backspaceWord: ['ctrl+backspace']
};

But the setting was called incorrectly, when the combination was pressed, not one word was deleted, but a whole sentence. Now added one more setting:

const hotkeys = {
	delete: ['delete', 'cmd+backspace'],
	deleteWord: ['ctrl+delete', 'cmd+alt+backspace', 'ctrl+alt+backspace'],
	deleteSentence: ['ctrl+shift+delete', 'cmd+shift+delete'],
	backspace: ['backspace'],
	backspaceWord: ['ctrl+backspace'],
	backspaceSentence: ['ctrl+shift+backspace', 'cmd+shift+backspace']
};

🐛 Bug Fix

  • fixed sync between WYSIWYG and source editor

3.10.1

💥 Breaking Change

  • Update TypeScript@4.5.2
  • In IJodit.getEditorValue added second argument for using with afterGetValueFromEditor event. You can see example in source plugin.
  • In UIButton state.status changed to state.variant
  • beforeClose event can prevent closing the dialog
const dialog = new Jodit.modules.Dialog();
dialog.setContent('Hello world!').open();
dialog.e.on('beforeClose', () => confirm('Are you sure?'));

🐛 Bug Fix

  • fix: Proxy blur event to parent triggered on the ACE editor

3.9.5

🚀 New Feature

const editor = Jodit.make('#editor', {
	preset: 'inline',
	popup: {
		toolbar: Jodit.atom(['bold', 'italic', 'image'])
	}
});
editor.s.focus();

editor.toolbar.showInline();
// or
editor.e.fire('showInlineToolbar');

Also added ToolbarCollection.hide and ToolbarCollection.show methods.

const editor = Jodit.make('#editor');
editor.toolbar.hide();
editor.toolbar.show();
  • Allow use prototype as component name
console.log(Jodit.modules.UIButton.getFullElName('element')); // jodit-ui-button__element
console.log(Jodit.modules.UIButton.componentName); // jodit-ui-button
interface IFileBrowserOptions {
	saveStateInStorage:
		| false
		| {
				storeLastOpenedFolder?: boolean;
				storeView?: boolean;
				storeSortBy?: boolean;
		  };
}

By default:

opt = {
	saveStateInStorage: {
		storeLastOpenedFolder: true,
		storeView: true,
		storeSortBy: true
	}
};

Disable it:

Jodit.make('#editor', {
	filebrowser: {
		saveStateInStorage: false
	}
});

// or

Jodit.make('#editor', {
	filebrowser: {
		saveStateInStorage: {
			storeLastOpenedFolder: false
		}
	}
});
  • Spacer in Button Toolbar In addition to the | metacharacters and \n which stand for separator and newline, the --- metacharacter has appeared, which allows you to add a spacer element which pushes all buttons behind the spacer to the right side of the toolbar and creates space in the middle.
Jodit.make('#editor', {
	buttons: [
		'source',
		'bold',
		'|',
		'---',
		'|',
		'brush',
		'about',
		'\n',
		'italic'
	]
});

3.9.4

🚀 New Feature

  • Changed style resize rectangle for resize image or table
  • Added link POWERED BY JODIT in statusbar
  • Changed icon for resize handle in the bottom right corner

🐛 Bug Fix