UNPKG

jodit

Version:

Jodit is an awesome and useful wysiwyg editor with filebrowser

1,490 lines (1,076 loc) 172 kB
# Changelog > **Tags:** > > - :boom: [Breaking Change] > - :rocket: [New Feature] > - :bug: [Bug Fix] > - :memo: [Documentation] > - :house: [Internal] > - :nail_care: [Polish] ## 4.12.0 #### :rocket: 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: ```js // 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' } } }); ``` #### :house: 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 #### :house: Internal - Add data-ref attributes to image buttons in UIImageMainTab ## 4.11.14 #### :rocket: 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`. ```js 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(); } ``` #### :memo: 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 #### :rocket: New Feature - Add `link.openInNewTabCheckboxDefaultChecked` option to set default state of "Open in new tab" checkbox when inserting a new link ([#1289](https://github.com/xdan/jodit/issues/1289)) #### :bug: Bug Fix - Fix pasting table into table cell creating invalid nesting and trailing empty paragraph ([#1314](https://github.com/xdan/jodit/issues/1314)) - Fix font size module misbehavior in pt mode: duplicated unit display, incorrect active state, and wrong px/pt conversion ([#1197](https://github.com/xdan/jodit/issues/1197)) - Fix focus competition between multiple editor instances in Source mode ([#1313](https://github.com/xdan/jodit/issues/1313)) - Fix tooltip clipped by viewport when toolbar is near the bottom of the page ([#1150](https://github.com/xdan/jodit/issues/1150)) ## 4.11.7 #### :rocket: New Feature - Implement custom highlight styling for search results ([#1343](https://github.com/xdan/jodit/issues/1343)) - Add `backSpaceAfterDelete` event triggered after backspace operations - Add `Dom.findFirstMatchedNode()` method for retrieving first matched node in DOM tree #### :nail_care: Polish - Improve cursor positioning in `wrapNodes` plugin after backspace - Improve readability of selection marker queries and add focus condition check #### :house: Internal - Enhance test coverage for undo/redo, backspace, search, and other plugins ## 4.11.6 #### :house: Internal - Release workflow now populates GitHub Release notes from CHANGELOG.md instead of relying on auto-generated notes ## 4.11.5 #### :rocket: 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()`. ```js const editor = Jodit.make('#editor') jodit.progressbar.showFileUploadAnimation(); ``` ## 4.11.4 #### :boom: 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: ```css :root { --jd-icon-transform-origin: 0 0 !important; } ``` #### :rocket: 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: ```javascript 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: ```css :root { --jd-icon-transform-scale: 1.3; --jd-icon-transform-origin: center; } ``` ## 4.11.2 #### :boom: 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>` #### :house: Internal - Add Statoscope for webpack bundle size analysis and build comparison - refactor: replace setAttribute and removeAttribute with attr helper in multiple files #### :rocket: 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 #### :memo: 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 #### :boom: Breaking Change - Fix custom cell popup buttons not working when referenced by string name (e.g. `popup: { cells: Jodit.atom(['valign', 'deleteTable', ...]) }`) [#1328](https://github.com/xdan/jodit/issues/1328) - Rename cell popup button `delete` → `deleteTable` to avoid conflict with `document.execCommand('delete')` ## 4.9.18 #### :bug: Bug Fix - Fix table column operations (insert before/after, delete) affecting wrong column when cells are merged [#1334](https://github.com/xdan/jodit/issues/1334) - Fix Browse button text clipped in image popup when filebrowser is configured [#1318](https://github.com/xdan/jodit/issues/1318) #### :nail_care: Polish - Make form inputs stretch to full width inside UIBlock (link popup, image popup) ## 4.9.17 #### :bug: Bug Fix - Fix for https://github.com/jodit/jodit-react/issues/319 ## 4.9.16 #### :house: Internal - Downgrade Node.js version in .nvmrc to 22 ## 4.9.15 #### :bug: Bug Fix - Enhance image editor and file browser functionality with new path handling and update tests ## 4.9.14 #### :bug: Bug Fix - Enhance image editor functionality with 'Save as' prompt and refactor button definitions ## 4.9.12 #### :rocket: New Feature - Enhance accessibility by adding role attributes to UI elements and updating related tests ## 4.9.11 #### :rocket: 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 #### :rocket: New Feature - feat: add aria-label handling to UIButton and corresponding tests ## 4.9.1 #### :house: 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 #### :house: Internal - feat: add issue templates for bug reports and feature requests ## 4.8.8 #### :house: Internal - fix: ensure tags are ignored on push events in tests workflow ## 4.8.6 #### :house: Internal - refactor: reorganize workflow jobs to separate linting and building steps ## 4.8.3 #### :house: Internal - feat: enhance editor functionality with MutationObserver and refactor initialization methods ## 4.8.1 #### :rocket: 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 #### :house: 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: 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 #### :boom: 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: ```typescript // 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: ```bash npm install autobind-decorator ``` ```typescript 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 #### :rocket: New Feature - Added method `uploader.customUploadFunction`. This method can be used to replace the function of uploading files ```javascript Jodit.make('#editor', { uploader: { customUploadFunction: (requestData, showProgress) => fetch(requestData).then(res => { showProgress(100); return res.json(); }) } }); ``` ## 4.7.1 #### :boom: 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. #### :house: 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: Bug Fix - Enhance class name handling in link plugin - Improved appearance of the multiple choice select ## 4.6.17 #### :bug: 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: Bug Fix - blank lines are being inserted[#1294](https://github.com/xdan/jodit/issues/1294) ## 4.6.15 #### :rocket: New Feature and :boom: Breaking Change - Added `table.splitBlockOnInsertTable` option to control table insertion behavior ([#1295](https://github.com/xdan/jodit/issues/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: 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 #### :boom: Breaking Change Remove reconcileArrays functionality and associated tests ## 4.6.7 #### :rocket: 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 #### :house: Internal - Updated Playwright version to 1.55.0 - Updated screenshot snapshots for message and link popup tests ## 4.6.5 #### :house: Internal - Translation improvements and updates ## 4.6.4 #### :house: Internal - Refactor translation files for improved readability and consistency - Added missing translations and language updates ## 4.6.3 #### :house: Internal - Community contributions and localization improvements ## 4.6.2 #### :house: 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/` ````js 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 #### :boom: Breaking Change - ESM assembly uses the flag fat_mode = true Before in ESM build: ```js console.log(Jodit.constants.FAT_MODE); // false` console.log(Jodit.fatMode); // false` ``` Now: ```js console.log(Jodit.constants.FAT_MODE); // true` console.log(Jodit.fatMode); // true` ``` ## 4.5.20 #### :house: 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 #### :house: 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 ### :rocket: New Feature - In Readonly mode, the ability to disable navigation by links has been added. By default, the option is enabled. ```js const editor = Jodit.make('#editor', { readonly: true, link: { preventReadOnlyNavigation: true } }); ``` ## 4.5.12 #### :house: 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 #### :house: Internal - Shit of the Chai JS module to the browser because the developers decided not to support the assembly for browsers anymore ### :rocket: New Feature - Added API launching tasks for schedule with a reference on https://wicg.github.io/scheduling-apis/ - [LazyWalker](https://xdsoft.net/jodit/docs/modules/dom.html#lazywalker) module now uses the new API for scheduling tasks ```js const editor = Jodit.make('#editor'); editor.schedulePostTask( () => { console.log('Task 1'); }, { priority: 'user-blocking' } ); ``` ## 4.5.5 ### :rocket: New Feature - Added the ability to add their html inserts to the plugin `paste` ```js 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 #### :house: 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 ### :rocket: New Feature - Added plugins/all.js for ESM build ```js 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 #### :boom: 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` ```js 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: 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 #### :boom: 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` ```typescript const editor = Jodit.make('#editor', { popupRoot: document.body }); ``` ## 4.2.48 ### :bug: Bug Fix - [Source code mode: When the text area is resized, the number of visible code view lines does not dynamically adjust #1206](https://github.com/xdan/jodit/issues/1206) #### :house: Internal - Use typings for `options` in `Jodti.make(element, options)` method Before: ```typescript class Jodit { static make(element: HTMLElement | string, options?: object): Jodit { //... } } ``` After: ```typescript 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 ### :rocket: New Feature - Added method `Jodit.modules.Helpers.ConfigDeepFlatten` it allows make plain object from prototype chain object. ```typescript 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, ...} ``` #### :house: Internal - Update dependencies ```plain @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 ### :rocket: New Feature - With the symbols plugin you can use the Shift key to select multiple symbols. [special character #1194](https://github.com/xdan/jodit/issues/1194) ### :bug: Bug Fix - Fixed a bug in the logic of the ControlType.popup method; if the method did not return anything, it could be used as an alternative to `exec`. But when called again it did not work. - Fixed logic in the symbols plugin - [Does it have an API for closing record operations #1193](https://github.com/xdan/jodit/issues/1193) ## 4.2.41 ### :rocket: New Feature - Related issue: [The video plugin only support content from youtube and vimeo #1170](https://github.com/xdan/jodit/issues/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. ```ts 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: Bug Fix - [Toolbar Customization Issue When Selecting Text Inside Table Cells](https://github.com/xdan/jodit/issues/1131) - Fixed a bug when the tooltip remained on the screen when its popup was already closed - [Inline popup tooltips are not visible #1141](https://github.com/xdan/jodit/issues/1141) - Fixed a bug in the Enter plugin where inside a table you had to press Enter twice to create a new row ## 4.2.39 #### :house: 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 ```plain @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: Bug Fix - Fixed behavior of form submit with its own validation ## 4.2.37 ### :bug: Bug Fix - [Bug: this.j.o.resizer is undefined in jodit version 4 #1166](https://github.com/xdan/jodit/issues/1166) ## 4.2.35 ### :bug: Bug Fix - [Edit Link bugg when there is a iframe #1176](https://github.com/xdan/jodit/issues/1176) ## 4.2.34 ### :bug: Bug Fix - [Bug UL and OL list not working corretly with option "enter":"BR" #1178](https://github.com/xdan/jodit/issues/1178) ## 4.2.33 ### :bug: Bug Fix - Fixed bug inside Search plugin with Highlight API. When selection was not cleared ## 4.2.32 ### :rocket: New Feature - Added option `iframeSandbox: string | null = null;` Apply the `sandbox` attribute to the iframe element. The value of the attribute is a space-separated list of directives. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox Issue: https://github.com/xdan/jodit/issues/1186 ```typescript Jodit.make('#editor', { iframe: true, iframeSandbox: 'allow-scripts allow-same-origin' }); ``` #### :house: Internal - Move to ESLint 9 - Update dependencies ```plain @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 ### :rocket: New Feature - Added option `countTextSpaces: boolean = false;` Issue https://github.com/xdan/jodit/issues/1144 ```typescript Jodit.make('#editor', { countTextSpaces: true }); ``` ### :bug: Bug Fix - [Menu Item Popups Hidden when Jodit is inside an <dialog> element #1146](https://github.com/xdan/jodit/issues/1146) #### :house: Internal - Use node 20 for build - Update dependencies ```plain @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: Bug Fix - [Table dragging creates an issue #1128](https://github.com/xdan/jodit/issues/1128) - AddNewLine plugin shown incorrect position after CleanHTML plugin - Inserting a new table - added extra spaces before the table - When merging multiple table cells after the TR tag, the CleanHTML plugin added `<br>` - [Inline popup tooltips are not visible #1141](https://github.com/xdan/jodit/issues/1141) - [space key issues #1143](https://github.com/xdan/jodit/issues/1143) ## 4.2.25 ### :rocket: New Feature - [add ukrainian localization #1142](https://github.com/xdan/jodit/pull/1142) ## 4.2.22 ### :bug: Bug Fix - [Try to fix Unable to use Speech Recognition #1139](https://github.com/xdan/jodit/issues/1139) ## 4.2.21 #### :house: 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 #### :house: Internal - When connecting third-party scripts, two attributes are now added to the script tag. [Jodit not hiding the raw textarea #1086](https://github.com/xdan/jodit/issues/1086) ```json { "crossorigin": "anonymous", "referrerpolicy": "no-referrer" } ``` - [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin) - [referrerpolicy](https://developer.mozilla.org/en-US/docs/Web/API/HTMLScriptElement/referrerPolicy) ## 4.2.17 #### :house: Internal - Removed conversion of list arrays into objects when creating a button in the toolbar. Previously the code looked like: ```js 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: ```js 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. ```js 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: Bug Fix - [Backspacing in the editor with preadded styling or added styling is not retained #1120](https://github.com/xdan/jodit/issues/1120) - [missing generation of inferface.js and interface.d.ts in esm build path esm\plugins\image-properties #1117](https://github.com/xdan/jodit/issues/1117) ## 4.2.13 ### :bug: Bug Fix - [Table inline popup buttons issue #1129](https://github.com/xdan/jodit/issues/1129) ## 4.2.8 ### :rocket: New Feature - Controls have a new field `isVisible(editor: IJodit): boolean`, which allows you to completely hide the button in some situations. ```typescript Jodit.make('#editor', { controls: { undo: { isVisible(editor: IJodit): boolean { return editor.history.canUndo(); } } } }); ``` ## 4.2.1 ### :bug: Bug Fix - [Size of picture is not correct when changin a picture #1107](https://github.com/xdan/jodit/issues/1107) - [Selection by triple click removes close tag + open tag of next paragraph #1101](https://github.com/xdan/jodit/issues/1101) Added options `select.normalizeTripleClick: boolean = true` to normalize selection after triple click For disable this behavior set `select.normalizeTripleClick: false` ```js Jodit.make('#editor', { select: { normalizeTripleClick: false } }); ``` ## 4.1.12 #### :boom: 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: ```js import watch, { watch as watch2 } from 'jodit/core/decorators/watch/watch'; ``` Now only: ```js import { watch } from 'jodit/core/decorators/watch/watch'; ``` ### :bug: Bug Fix - [FileBrowser - Permissions Incorrect during Open of Dialog #1095](https://github.com/xdan/jodit/issues/1095) ## 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. ```js 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 - [Wrong generation of es5 bundle - polyfills missing #1105](https://github.com/xdan/jodit/issues/1105) ## 4.1.1 - Added plugin AI Assistant. https://github.com/xdan/jodit/pull/1088 Thanks @huizarmx #### :house: Internal - Update dependencies ```plain @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 ```plain @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 - Added `search.useCustomHighlightAPI` option to the "Search" plugin to use the built-in text highlighting API https://developer.mozilla.org/en-US/docs/Web/API/CSS_Custom_Highlight_API If the browser does not support this API, then standard text highlighting will be used by wrapping it in the `<span jd-tmp-selection>` tag. - Added Finnish (Suomi) translation https://github.com/xdan/jodit/pull/1081 ## 4.0.2 - [BUG: FileBrowser Context Menu Grows Infinitely](https://github.com/xdan/jodit/issues/1059) ## 4.0.1 - [See changelog](https://github.com/xdan/jodit/releases) ## 4.0.0-beta.121 #### :boom: 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. ```js 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: Bug Fix - [Folder renames not working if "space" is added in folder name #1054](https://github.com/xdan/jodit/issues/1054) #### :house: Internal - Update dependencies ```plain 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 ``` ### :rocket: New Feature - The `Jodit.getInstance` method can accept a module constructor instead of its name: ```js 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 - [Even though I disable some editor plugins, they are displayed on mobile #243](https://github.com/jodit/jodit-react/issues/243) ## 4.0.0-beta.118 ### :bug: Bug Fix - [fix import #1046](https://github.com/xdan/jodit/pull/1046) #### :house: Internal - Fixed colors for selected toolbar elements in the dark theme ## 4.0.0-beta.117 ### :bug: Bug Fix - [Marking a line with shift "pos1 or end" and pressing del removes too much and destroys structure #1038](https://github.com/xdan/jodit/issues/1038) ## 4.0.0-beta.108 ### :bug: Bug Fix - [Comment block in the template throws error "Cannot read properties of undefined (reading 'font-weight')" #1044](https://github.com/xdan/jodit/issues/1044) #### :house: Internal ```plain @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 ### :rocket: New Feature - Introduced the pasteExcludeStripTags option. This is a list of tags that won't be removed from the pasted HTML when in INSERT_AS_TEXT mode. By default, it includes `['br', 'hr']`. See https://github.com/xdan/jodit/issues/1033 for more details. ```js Jodit.make('#editor', { pasteExcludeStripTags: ['br', 'style'] }); ``` - [copy pasting twitter or istagram or etc. not as expected #1032](https://github.com/xdan/jodit/issues/1032) ## 4.0.0-beta.97 #### :house: Internal - Calls to setTimout without the async module hav