v0.44.0
blackboardsh/electrobunv0.44.0Apr 27, 2026by etrepum
AI Summary
This monthly release introduces an experimental DOM rendering API, new command priorities, and improved drag-and-drop support. It includes deprecations for legacy APIs and adds new extensions for code highlighting.
Key Highlights
- Experimental DOMRenderExtension API for overriding DOM rendering and export
- New COMMAND_PRIORITY_BEFORE_* priorities for last-registered-first ordering
- Deprecation of OffsetView; migration to $createChildrenArray from lexical
- Code block escape logic moved to CodeExtension for better paste handling
- New CodePrismExtension and CodeShikiExtension with signal-based configuration
Breaking Changes
- OffsetView / $createOffsetView deprecated (use $createChildrenArray from lexical)
- Code block escape logic moved to CodeExtension (using CodeNode without CodeExtension is deprecated)
- $findTextIntersectionFromCharacters from @lexical/text deprecated (broken, untested, undocumented)
New Features
- DOMRenderExtension and EditorDOMRenderConfig for extensible DOM rendering and export
- New command priorities: COMMAND_PRIORITY_BEFORE_EDITOR, _BEFORE_LOW, _BEFORE_NORMAL, _BEFORE_HIGH, _BEFORE_CRITICAL
- CodePrismExtension and CodeShikiExtension with runtime configuration
- Custom AutoLink punctuation support
- New $handleRichTextDrop and $handlePlainTextDrop helpers for drag-and-drop
- removeEmptyDestination option for split-at-caret operations
- Stable APIs for @lexical/extension and NodeState API
- Automatic CSS inline from <style> tags during HTML import
- Improved list handling with orphan prevention and mobile compatibility
- Refined markdown processing with Safari compatibility and improved undo history
Full Release Notes
v0.44.0 is a monthly release with a few minor breaking changes (deprecations), a notable new experimental `DOMRenderExtension` API for overriding DOM create/update/export, easier to use priority levels for registering commands, a pagination demonstration and convenient html import/export in the playground, better drag and drop support, automatic inline of CSS for HTML import, consistent CSP-safe style updates, and a wide range of bug fixes and other new features.
## Breaking Changes
### Deprecation of `@lexical/offset` `OffsetView` (#8350)
`OffsetView` / `$createOffsetView` never worked correctly, has no documentation, no tests, and no usage in the monorepo. It has been deprecated. The only function still in use, `$createChildrenArray`, is now exported from `lexical` itself — import it from `lexical` rather than `@lexical/offset` going forward.
### Code block escape logic moved to `CodeExtension` (#8360)
The "press Enter three times to exit a `CodeNode`" logic has moved from `CodeNode.insertNewAfter` to a `KEY_ENTER_COMMAND` listener registered by `CodeExtension`. This fixes paste-with-blank-lines incorrectly escaping the code block. Using `CodeNode` without `CodeExtension` is now deprecated — a backwards-compatible shim with a dev-mode warning is in place, but the node is expected to stop working without `CodeExtension` in a future version.
## New APIs
### `lexical` / `@lexical/html` — Extensible DOM rendering and export *(experimental)* (#8353, #8368)
A new `DOMRenderExtension` (in `@lexical/html`) and `EditorDOMRenderConfig` (in `lexical`) parameterize `$createDOM`, `$updateDOM`, `$exportDOM`, `$getDOMSlot`, `$shouldInclude`, and `$shouldExclude` so that node rendering and export can be overridden via composable middleware. Use `domOverride(nodes, config)` to target one or more node classes, predicates, or `'*'` (wildcard), and call `$next()` from inside an override to delegate to the underlying implementation.
A new `$decorateDOM(nextNode, prevNode, dom, editor)` hook runs after a node is created/updated and after its children have been reconciled, intended for in-place attribute or DOM tweaks. Override ordering is a well-defined topological sort: wildcards highest, then predicates, then class hierarchy (subclass before superclass), with extension dependency order and registration order as tiebreakers.
Render-context APIs are also exposed: `$withRenderContext`, `$getRenderContextValue`, `contextValue`, `contextUpdater`, `RenderContextRoot`, `RenderContextExport`. New traversal helpers `$generateDOMFromNodes` and `$generateDOMFromRoot` populate a container using the configured render config. `CreateEditorArgs.dom` accepts a `Partial<EditorDOMRenderConfig>` to override rendering at editor creation. `$isLexicalNode` is also exported from `lexical`.
### `lexical` — `COMMAND_PRIORITY_BEFORE_*` priorities (#8375)
Five new command priorities — `COMMAND_PRIORITY_BEFORE_EDITOR`, `_BEFORE_LOW`, `_BEFORE_NORMAL`, `_BEFORE_HIGH`, `_BEFORE_CRITICAL` — register listeners that run **most-recently-registered first**, in front of the existing first-registered-first listeners at the same priority. Ordering is: highest priority first, then all `BEFORE_*` listeners (LIFO), then legacy listeners (FIFO). The new priorities are almost always what you want for new code; legacy priorities are unchanged so this is purely additive. See the new ["Priorities and ordering"](https://lexical.dev/docs/concepts/commands#priorities-and-ordering) docs.
### `@lexical/code-prism` — `CodePrismExtension` & `@lexical/code-shiki` — `CodeShikiExtension` (#8346)
Both packages now export proper extensions (`CodePrismExtension`, `CodeShikiExtension`) with `{disabled, tokenizer}` signal-based configuration that can be toggled and hot-swapped at runtime. The legacy `CodeHighlighterShikiExtension` is kept as a deprecated backwards-compatible shim.
### `@lexical/link` / `@lexical/react` — Custom AutoLink punctuation (#8378)
`AutoLinkExtension`, `registerAutoLink`, and `LexicalAutoLinkPlugin` now accept an optional `punctuation` setting to override the default boundary characters (e.g. to allow colon-delimited matches without breaking URLs that contain colons).
### `@lexical/utils` — `removeEmptyDestination` for split-at-caret (#8384)
`SplitAtPointCaretNextOptions` (used by `$insertNodeToNearestRootAtCaret` and `$splitAtPointCaretNext`) gains a `removeEmptyDestination` option for finer control over whether an empty destination is replaced entirely.
### `@lexical/clipboard` — Shared drop handlers (#8373)
New `$handleRichTextDrop` and `$handlePlainTextDrop` helpers implement Lexical-aware text drag-and-drop, including same-block drags, cross-`TextNode` and cross-block drops, `DecoratorNode` preservation, and cross-editor drags. `registerRichText` and `registerPlainText` now wire these by default.
## Stable APIs (no longer `@experimental`) (#8354)
`@lexical/extension` (since v0.36.1, Sep 2025) and the `NodeState` API in `lexical` (since v0.26.0, Feb 2025) are now formally stable.
## Deprecations
- `@lexical/offset` `OffsetView` / `$createOffsetView` (use `$createChildrenArray` from `lexical`) (#8350)
- `@lexical/text` `$findTextIntersectionFromCharacters` — broken, untested, undocumented (#8364)
- `CodeHighlighterShikiExtension` / `CodeHighlighterShikiConfig` (use `CodeShikiExtension`) (#8346)
- Using `CodeNode` without `CodeExtension` (#8360)
## Highlights
Core:
* ⚠️ #8350 Deprecate `OffsetView`; export `$createChildrenArray` from `lexical`
* 🆕 #8353 #8368 `EditorDOMRenderConfig`, `DOMRenderExtension`, `domOverride`, `$decorateDOM`, render context, `$generateDOMFromNodes`, `$generateDOMFromRoot`, `$isLexicalNode`, `CreateEditorArgs.dom`
* 🆕 #8375 `COMMAND_PRIORITY_BEFORE_*` priorities for last-registered-called-first ordering
* 🧹 #8354 Remove `@experimental` from Extension and NodeState APIs
* ✅ #8356 Workaround for synchronous Firefox focus edge case where deferred callbacks were silently discarded
* ✅ #8349 Resolve Firefox arrow-key navigation skipping over collapsible content
* ✅ #8361 Fall back to non-shifted key matching for Option+number shortcuts on macOS
Clipboard / Rich Text / Plain Text:
* ✅ #8373 Drag-and-drop within the same block now correctly moves the dragged text; `DecoratorNode`s and formatting are preserved across drops; cross-editor drags work even with two Lexical versions on the same page
Code:
* ⚠️ #8360 Move three-Enter code-block escape logic to a `KEY_ENTER_COMMAND` listener in `CodeExtension`; fixes blank-line paste escaping the code block
* 🆕 #8346 Add `CodePrismExtension` (`@lexical/code-prism`) and `CodeShikiExtension` (`@lexical/code-shiki`)
* 🧹 #8330 Upgrade `shiki` to `^4.0.2`
Extension:
* ✅ #8328 Remove JSX/`react` type dependency from `DecoratorTextNode`
* ✅ #8377 `LexicalExtensionEditorComposer` no longer disposes the editor on unmount; lifetime is the caller's responsibility (fixes nested/caption editors after remount)
HTML / Table:
* 🆕 #8326 Inline CSS from `<style>` tags during HTML import (fixes paste from Excel, Outlook, etc.)
* ✅ #8313 Merge nested lists into the parent `<li>` during HTML export, eliminating duplicate ordered-list numbering
Link:
* 🆕 #8378 Allow custom punctuation for AutoLink boundaries
List:
* ✅ #8382 Ensure `ListItemNode` always has a `ListNode` parent (orphans are merged or floated to root)
* ✅ #8390 Toggle checklist items on mobile tap (iOS Safari / Android Chrome) via `pointerup`
* ✅ #8313 Merge nested lists into parent `<li>` on HTML export
Markdown:
* ✅ #8332 Replace negative lookbehind assertions for Safari < 16.4 compatibility
* ✅ #8365 Add an undo history entry for markdown shortcut transforms so undo no longer also undoes the triggering keystroke
* ✅ #8311 Escape ordered-list pattern (`\d+\. `) inside bullet/check list item exports to fix double-escape on round-trip
* ✅ #8381 Code spans take precedence over inline formatting in shortcut transforms (CommonMark behavior)
Playground:
* 🆕 #8322 New `PagesExtension` with `PageNode`, `PageContentNode`, `PageSetupNode` for paginated documents and print-friendly output
* 🆕 #8323 Animations for collapsible section expand/collapse and arrow rotation
* 🆕 #8379 #8386 "Convert to HTML" toolbar button (round-trips through `$generateHtmlFromNodes` / `$generateNodesFromDOM`); HTML view formatted with prettier
* 🆕 #8346 Migrate eight playground plugins to extensions (`PageBreak`, `Twitter`, `YouTube`, `Figma`, `TabFocus`, `Collapsible`, `SpecialText`, code-highlight) and remove the dead `LinkPlugin` and `StickyPlugin` files
* ✅ #8385 `NodeContextMenuPlugin` falls back to the root node when the click target has no Lexical node, instead of showing an empty menu
* ✅ #8388 Use `@floating-ui/react` for `FloatingLinkEditorPlugin` positioning; correctly handles all viewport boundaries and Firefox `focusNode.parentElement` quirks
* ✅ #8392 Show floating link editor for single-character links (right-bias adjacent-link lookup)
React:
* ✅ #8329 Prevent error when `editorRef` is `null` in `LexicalEditorRefPlugin`
* ✅ #8366 Add `yjs` as an optional peer dependency for Yarn PnP compatibility
* ✅ #8377 Don't auto-dispose editor from `LexicalExtensionEditorComposer`
* ✅ #8385 Root-node fallback in `NodeContextMenuPlugin`
Text:
* 🧹 #8364 Add deprecation notice to `$findTextIntersectionFromCharacters`
Utils:
* ✅ #8384 Clean up and test `$insertNodeToNearestRootAtCaret` edge cases; add `removeEmptyDestination` to `SplitAtPointCaretNextOptions`
Refactor (CSP-safe styles):
* 🧹 #8372 Replace runtime `cssText` / `setAttribute('style', …)` writes with property-based style updates across `lexical`, `@lexical/code-core`, `@lexical/list`, `@lexical/table`, `@lexical/yjs`, and the playground
Website:
* 🆕 #8316 Add more examples to the demos gallery and statically capture screenshots with Playwright (replaces the third-party screenshot service)
* ✅ #8369 Fix tailwindcss docusaurus config regression (sync, not async)
* ✅ #8371 Add a dedicated `tsconfig.json` for `lexical-website` so type errors are actually surfaced in CI
Infrastructure:
* 🧹 #8341 Encourage agents to use extensions and `$config` in [AGENTS.md](https://github.com/facebook/lexical/blob/main/AGENTS.md)
* 🧹 #8355 Refactor CommonJS scripts to ESM modules
* 🧹 #8357 Cache build + Playwright before running e2e tests
* 🧹 #8324 Override `yaml` to `>=1.10.3` to fix CVE-2026-33532
* 🧹 #8358 Address `simple-git` dependency vulnerability
* 🧹 #8380 Address `follow-redirects` dependency vulnerability
* 🧹 #8334 Remove example/fixture lockfiles from git to reduce Dependabot noise
* 🧹 #8336 #8347 Update stale dev dependencies to resolve Dependabot alerts
## What's Changed
* v0.43.0 by @etrepum in https://github.com/facebook/lexical/pull/8319
* [lexical-website] Feature: Add more examples to the demos gallery with local screenshot captures by @etrepum in https://github.com/facebook/lexical/pull/8316
* Update examples for v0.43.0 by @etrepum in https://github.com/facebook/lexical/pull/8321
* [lexical-playground]: Collapsible Section Animations by @ivailop7 in https://github.com/facebook/lexical/pull/8323
* [*] Security: Override yaml to >=1.10.3 to fix CVE-2026-33532 by @potatowagon in https://github.com/facebook/lexical/pull/8324
* [lexical-extension] Fix: Remove JSX dependency from DecoratorTextNode by @etrepum in https://github.com/facebook/lexical/pull/8328
* [lexical-react] Bug Fix: Prevent error when editorRef is null by @Jimmy89 in https://github.com/facebook/lexical/pull/8329
* [lexical-code-shiki] Chore: Upgrade shiki to ^4.0.2 by @etrepum in https://github.com/facebook/lexical/pull/8330
* [lexical-markdown] Bug Fix: replace lookbehind assertions for Safari < 16.4 compatibility by @Yahid-Basha in https://github.com/facebook/lexical/pull/8332
* chore: remove example/fixture lockfiles from git to reduce Dependabot noise by @thatmichael85 in https://github.com/facebook/lexical/pull/8334
* chore: update stale dev dependencies to resolve Dependabot alerts by @thatmichael85 in https://github.com/facebook/lexical/pull/8336
* build(deps): bump @docusaurus/faster from 3.9.2 to 3.10.0 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8342
* build(deps): bump semver from 7.7.2 to 7.7.4 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8338
* build(deps): bump y-websocket from 1.5.4 to 3.0.0 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8343
* build(deps): bump @docusaurus/* from 3.9.2 to 3.10.0, update typedoc, react by @dependabot[bot] in https://github.com/facebook/lexical/pull/8339
* [*] Chore: Encourage agents to use extensions and $config in AGENTS.md by @etrepum in https://github.com/facebook/lexical/pull/8341
* [lexical-code-prism][lexical-code-shiki][lexical-playground] Feature: Add CodePrismExtension, CodeShikiExtension, and migrate playground plugins to extensions by @etrepum in https://github.com/facebook/lexical/pull/8346
* build(deps-dev): bump the dev-dependencies group across 1 directory with 42 updates by @dependabot[bot] in https://github.com/facebook/lexical/pull/8347
* build(deps): bump zustand from 4.5.7 to 5.0.12 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8340
* [lexical-playground] Feature: Add PagesExtension by @ibastawisi in https://github.com/facebook/lexical/pull/8322
* [lexical-html][lexical-table] Feature: Inline CSS from <style> tags by @tomsarduy in https://github.com/facebook/lexical/pull/8326
* build(deps): bump pnpm/action-setup from 4 to 6 in the github-actions group across 1 directory by @dependabot[bot] in https://github.com/facebook/lexical/pull/8335
* [Breaking Change][lexical-offset][lexical] Chore: Deprecate the broken/undocumented/untested OffsetView and export $createChildrenArray from lexical by @etrepum in https://github.com/facebook/lexical/pull/8350
* [lexical][lexical-extension] Chore: Remove @experimental flag from Extension and NodeState APIs by @etrepum in https://github.com/facebook/lexical/pull/8354
* [lexical] Bug Fix: Resolve Firefox arrow key navigation issue in collapsible nodes (#8348) by @MohmedIkram in https://github.com/facebook/lexical/pull/8349
* [*] Chore: Cache build + playwright before running e2e tests by @etrepum in https://github.com/facebook/lexical/pull/8357
* [lexical] Bug Fix: Workaround for synchronous firefox focus edge case behavior by @etrepum in https://github.com/facebook/lexical/pull/8356
* address simple-git dependency vulnerability by @potatowagon in https://github.com/facebook/lexical/pull/8358
* [lexical][lexical-playground] Fix: Use the fallback matching for number keys in keyboard shortcuts by @levensta in https://github.com/facebook/lexical/pull/8361
* [Breaking Change][lexical-code] Bug Fix: move code block escape logic to KEY_ENTER_COMMAND listener by @anikakpillai in https://github.com/facebook/lexical/pull/8360
* [*] Chore: Refactor CommonJS scripts to ESM modules by @etrepum in https://github.com/facebook/lexical/pull/8355
* [lexical-text] Chore: Add deprecation notice to $findTextIntersectionFromCharacters by @etrepum in https://github.com/facebook/lexical/pull/8364
* [lexical-markdown] Bug Fix: Add undo history entry for markdown shortcut transforms by @kimseongyu in https://github.com/facebook/lexical/pull/8365
* [lexical-react] Bug Fix: Add 'yjs' as optional peer dependency for Yarn PnP compatibility by @grapgrap in https://github.com/facebook/lexical/pull/8366
* [lexical][lexical-html] Feature: Extensible DOM create/update/export by @etrepum in https://github.com/facebook/lexical/pull/8353
* [lexical-website] Bug Fix: Fix tailwindcss docusaurus config regression by @etrepum in https://github.com/facebook/lexical/pull/8369
* [lexical-website] Bug Fix: Fix type checking for lexical-website package by @etrepum in https://github.com/facebook/lexical/pull/8371
* [lexical-react] Bug Fix: Don't auto-dispose editor from LexicalExtensionEditorComposer by @etrepum in https://github.com/facebook/lexical/pull/8377
* [lexical] Feature: `COMMAND_PRIORITY_BEFORE_*` priorities for last-registered-called-first order by @etrepum in https://github.com/facebook/lexical/pull/8375
* [lexical-markdown] Bug Fix: Escape ordered-list pattern in bullet list item export by @Sathvik-Chowdary-Veerapaneni in https://github.com/facebook/lexical/pull/8311
* address follow-redirects dependency vulnerability by @vishisht31 in https://github.com/facebook/lexical/pull/8380
* [lexical-playground] Feature: HTML conversion button by @levensta in https://github.com/facebook/lexical/pull/8379
* [lexical-markdown] Bug Fix: Code spans take precedence over inline formatting in shortcuts by @potatowagon in https://github.com/facebook/lexical/pull/8381
* [lexical-list] Bug Fix: Ensure that ListItemNode always has a ListItem parent by @etrepum in https://github.com/facebook/lexical/pull/8382
* [lexical][lexical-code-core][lexical-list][lexical-table][lexical-yjs] Refactor: make runtime style updates CSP-safe by @holly-agyei in https://github.com/facebook/lexical/pull/8372
* [lexical-html][lexical-playground] Feature: Implement a well-defined ordering for DOMRenderExtension overrides and add $decorateDOM by @etrepum in https://github.com/facebook/lexical/pull/8368
* [lexical][lexical-utils][lexical-list] Bug Fix: Clean up and test $insertNodeToNearestRootAtCaret edge cases by @etrepum in https://github.com/facebook/lexical/pull/8384
* [lexical-clipboard][lexical-rich-text][lexical-plain-text] Bug Fix: Drag-and-drop within the same block by @etrepum in https://github.com/facebook/lexical/pull/8373
* [lexical-list] Bug Fix: Merge nested list into parent <li> during HTML export by @Sathvik-Chowdary-Veerapaneni in https://github.com/facebook/lexical/pull/8313
* [lexical-link][lexical-react] Feature: Allow custom punctuation for AutoLink boundaries by @holly-agyei in https://github.com/facebook/lexical/pull/8378
* [lexical-playground] Feature: Format HTML conversion with prettier by @etrepum in https://github.com/facebook/lexical/pull/8386
* [lexical-react] Bug Fix: Fall back to root node in NodeContextMenuPlugin when click target has no Lexical node by @mayrang in https://github.com/facebook/lexical/pull/8385
* build(deps): bump @excalidraw/excalidraw from 0.18.0 to 0.18.1 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8389
* [lexical-playground] Refactor: Use @floating-ui/react for FloatingLinkEditorPlugin positioning by @mayrang in https://github.com/facebook/lexical/pull/8388
* [lexical-list] Bug Fix: Toggle checklist items on mobile tap by @jWA86 in https://github.com/facebook/lexical/pull/8390
* [lexical-playground] Bug Fix: Show floating link editor for single-character links by @mayrang in https://github.com/facebook/lexical/pull/8392
* [lexical-extension] Bug Fix: Use maybeFromEditor in getPeerDependencyFromEditor by @potatowagon in https://github.com/facebook/lexical/pull/8398
* [*] Fix Flow type errors in flow definition files by @potatowagon in https://github.com/facebook/lexical/pull/8396
* [lexical] Chore: Fix uuid dependency vulnerability by @vishisht31 in https://github.com/facebook/lexical/pull/8399
* [lexical-website] Set prettier arrowParens to avoid by @potatowagon in https://github.com/facebook/lexical/pull/8397
## New Contributors
* @Jimmy89 made their first contribution in https://github.com/facebook/lexical/pull/8329
* @Yahid-Basha made their first contribution in https://github.com/facebook/lexical/pull/8332
* @tomsarduy made their first contribution in https://github.com/facebook/lexical/pull/8326
* @MohmedIkram made their first contribution in https://github.com/facebook/lexical/pull/8349
* @anikakpillai made their first contribution in https://github.com/facebook/lexical/pull/8360
* @grapgrap made their first contribution in https://github.com/facebook/lexical/pull/8366
* @vishisht31 made their first contribution in https://github.com/facebook/lexical/pull/8380
* @holly-agyei made their first contribution in https://github.com/facebook/lexical/pull/8372
* @mayrang made their first contribution in https://github.com/facebook/lexical/pull/8385
* @jWA86 made their first contribution in https://github.com/facebook/lexical/pull/8390
**Full Changelog**: https://github.com/facebook/lexical/compare/v0.43.0...v0.44.0