v0.45.0 is a monthly release with several breaking changes around selection and reconcile semantics, a major new experimental DOMImportExtension API for composable HTML import that replaces importDOM, a generalized DOMSlot and DOM render override surface, new HistoryExtension ergonomics (canUndo/canRedo signals, maxDepth), notable reconciler/selection performance work, and a wide range of bug fixes across IME, mobile keyboards, list/code/table editing, and markdown round-tripping.
Breaking Changes
lexical — Shadow root inclusion in $getReconciledDirection (#8479)
$getReconciledDirection now walks through shadow roots when resolving the reconciled dir attribute on a node, so nested ShadowRoot-style elements (e.g. tables) inherit direction consistently with regular elements. Callers that relied on direction inheritance stopping at shadow roots will need to update.
lexical / @lexical/rich-text — Backspace at block start preserves the current block (#8493)
Pressing Backspace at the start of a non-empty block previously merged the current block into the previous block, which discarded the current block's type/format. The new behavior merges the previous block's children into the current block instead, preserving the current block's type (heading, list item, quote, etc.). A new $mergeBlockBackward helper on RangeSelection is exposed for custom command handlers that want the same behavior.
lexical — Selection adjustment in removeFromParent callers (#8501)
LexicalNode.replace, insertBefore, insertAfter, and related callers that move a node between parents now correctly adjust the current selection to follow the moved node instead of leaving the selection pointing at the (now empty) original slot. This may change selection state observed by transforms or update listeners that previously relied on the stale offsets.
@lexical/markdown — Apply markdown shortcuts on composition-committed triggers (#8503)
Markdown shortcuts (e.g. *, _, ~) typed via IME composition now trigger after the composition is committed, not just on raw beforeinput. This fixes shortcuts being silently dropped during Japanese / Korean / Chinese input but may also fire shortcuts in some flows that previously didn't.
@lexical/extension / @lexical/rich-text / @lexical/plain-text — NormalizeInlineElementsExtension (#8497)
registerRichText and registerPlainText now register a transform that removes empty inline elements (e.g. LinkNode, formatted TextNode wrappers with no children) instead of leaving them in the tree. The transform is also exported as NormalizeInlineElementsExtension from @lexical/extension for use with extension-based setups. Editors that intentionally kept empty inline wrappers will need to disable the extension or override the transform. See Included Extensions.
lexical / @lexical/extension / @lexical/rich-text / @lexical/plain-text — NormalizeTripleClickSelectionExtension (#8520)
The "triple-click selects the whole paragraph including the trailing newline" normalization has moved out of LexicalEvents and into a new NormalizeTripleClickSelectionExtension registered by both rich-text and plain-text. The core LexicalEditor no longer performs this normalization on its own, so editors that bypass registerRichText / registerPlainText (or the equivalent extensions) need to register the extension explicitly to keep the previous behavior. See Included Extensions.
lexical / @lexical/html / @lexical/selection / @lexical/utils / @lexical/playground — Generalized DOMSlot and DOMRenderExtension override surface (#8519)
DOMSlot is now generalized so child slots can be expressed for arbitrary DOM containers (not just the direct child element), and $createDOM, $updateDOM, $exportDOM, $getDOMSlot etc. all flow through the new override surface. The previously-exported AutocompleteNode in the playground has been replaced by a VisibleLineBreakExtension that demonstrates the new override surface, and markSelection in @lexical/utils has been rewritten on top of the generalized slot API. Custom nodes that override getDOMSlot to return a non-element wrapper now have a real way to express that. See the DOMRenderExtension docs.
New APIs
@lexical/html — DOMImportExtension (experimental) (#8528)
A new DOMImportExtension replaces the legacy node-class importDOM static method with a composable middleware-style API. Rules declare a CSS-selector-style matcher, an optional schema for child handling, and a DOMImportFn that builds Lexical nodes from the matching DOM. Many helpers ship alongside it: $distributeInlineWrapper, ImportSession, DOMPreprocessFn for source-specific cleanup (Word, VS Code, etc.), and full TypeScript types for rules, captures, and contexts. A new dev-examples/dom-import showcase wires it up to a Word/VS Code paste flow. The legacy importDOM continues to work; new code can opt in to DOMImportExtension for richer composition and explicit ordering. The companion ClipboardDOMImportExtension (in @lexical/clipboard) routes text/html pastes through the new pipeline. See the DOMImportExtension guide and the "Migrating from importDOM" section.
@lexical/html / @lexical/playground — Conditional DOM render overrides (#8575)
domOverride now supports disabledForEditor and disabledForSession predicates so render overrides can be conditionally skipped on a per-editor or per-session basis (e.g. only apply during export, or only when a feature flag is on). Useful when one extension provides multiple overrides whose applicability depends on context that isn't known at registration time. See the DOMRenderExtension docs.
lexical — ElementNode import/export of data-lexical-indent (#8536)
ElementNode now uniformly imports and exports the data-lexical-indent attribute so any subclass round-trips its indent level through HTML without having to override exportDOM / importDOM (fixes the long-standing #7729 regression around indented headings/paragraphs).
lexical — Infinite recursion detection in update listeners (#8542)
Update listeners and update transforms that re-trigger themselves are now caught by a runtime guard that throws a descriptive error after a configurable number of nested updates, instead of hanging the tab. See Updates and Listeners.
@lexical/history — canUndo / canRedo ReadonlySignals (#8465)
HistoryExtension's output now exposes canUndo and canRedo as ReadonlySignal<boolean>s so toolbar buttons can subscribe directly without polling historyState or duplicating the priority/state bookkeeping. See Extension Signals.
@lexical/history — maxDepth option (#8537)
HistoryExtension accepts a new maxDepth option that bounds the undo stack. Older entries are evicted FIFO when the depth is exceeded. See the new "Tuning HistoryExtension for memory and long sessions" docs.
@lexical/markdown — $convertSelectionToMarkdownString (#8395)
Counterpart to $convertToMarkdownString that serializes only the current selection (or any caller-provided range) to a markdown string, useful for "copy as markdown" toolbar actions and for selection-scoped AI prompts.
lexical / @lexical/list — $setFormatFromDOM (#8460)
A new $setFormatFromDOM helper extracts text-align / dir from a DOM element and applies it to an ElementNode. ListItemNode.importDOM now uses it to correctly import alignment for list items pasted from external sources.
@lexical/list — ListNode.createListItemNode (#8427)
ListNode exposes a createListItemNode factory that is now used by children-normalization, so ListNode subclasses can supply a custom ListItemNode subclass without monkey-patching the normalizer.
@lexical/rich-text — escapeFormatTriggers on RichTextExtension (#8383)
RichTextExtension now accepts an escapeFormatTriggers config (a ReadonlySignal<EscapeFormatTriggerConfig>) that opts text-format escape behavior in/out per trigger (enter, click, arrow, space, tab). With it enabled, typing at the boundary of a formatted text node "escapes" the active format (bold, italic, code, etc.), matching the typing experience in Google Docs / Notion. Disabled by default. See Included Extensions.
@lexical/extension / @lexical/playground — ClickAfterLastBlockExtension (#8549)
New ClickAfterLastBlockExtension inserts a fresh paragraph when the user clicks below the last block (and places the caret in it), so single-block editors and short documents don't strand the user with no easy way to start a new line.
@lexical/code-prism / @lexical/code-shiki — null Tokenizer.defaultLanguage (#8553)
Tokenizer.defaultLanguage may now be null to indicate that code blocks without an explicit language should round-trip through markdown without injecting a default language tag (e.g. ```javascript). Preserves CommonMark's "no fence info" form on export.
@lexical/code-core / @lexical/code-shiki / @lexical/code-prism — Outdent space-indented code lines (#8445)
Shift+Tab in a code block now correctly outdents space-indented lines (not just tab-indented), respecting the tokenizer's configured indent width.
@lexical/react — Optional async onClose for LexicalTypeaheadMenuPlugin (#8489)
LexicalTypeaheadMenuPlugin's onClose may now return a Promise, useful for handlers that need to await network or animation work before tearing down the menu.
@lexical/clipboard — GetClipboardDataExtension export (#8431)
GetClipboardDataExtension is now exported from @lexical/clipboard for use as a peer dependency from custom clipboard handlers.
@lexical/website — Server-rendered "Copy page" Markdown button (#8570)
Every docs page now has a server-rendered "Copy page as Markdown" button (and a matching ?raw URL) so AI assistants and humans can grab the raw markdown without scraping the rendered HTML.
Highlights
Core:
- ⚠️ #8479 Include shadow root in
$getReconciledDirection - ⚠️ #8493 Backspace at block start now preserves the current block (heading / list item / quote)
- ⚠️ #8501 Adjust selection when
LexicalNodecallers move a node out of its parent - ⚠️ #8519 Generalize
DOMSlotand add DOMRenderExtension override surface;markSelectionrewritten on top - ⚠️ #8520 Move triple-click selection normalization to
NormalizeTripleClickSelectionExtension - 🆕 #8536
ElementNodeimport/export ofdata-lexical-indent - 🆕 #8542 Detect infinite recursion in update listeners and transforms
- ⚡ #8422 Defer DOM Selection property reads in
$updateDOMSelection - ⚡ #8474 Cache
RangeSelection.isBackward()on the instance - ⚡ #8481 Adopt GenMap copy-on-write for
NodeMapand reconcilerkeyToDOMMap - ⚡ #8482 Children fast path with suffix-incremental cache update in
$reconcileChildren - ⚡ #8505 Centralize replace-area selection mapping + bulk splice across list/selection/link
- ⚡ #8548 Cache last-child kind for trailing-
<br>reconcile - ✅ #8412 Import
dirattribute inimportDOM - ✅ #8417 Workarounds for buggy browser behavior around macOS text replacements
- ✅ #8428 Respect CSS
displaystyle inisBlockDomNode/isInlineDomNode - ✅ #8441 Reuse DOM when reconciling cross-parent node moves
- ✅ #8466 Resolve
--lexical-indent-base-valuevia CSSvar()instead of pre-computing in JS - ✅ #8470 Preserve queued updates and tags through
setRootElement - ✅ #8475 Handle iOS 10-key Korean IME
deleteContentBackwardwithtargetRange - ✅ #8486 Keep caret above the on-screen keyboard after Enter
- ✅ #8517 Handle triple-click overselection in
$setBlocksType - ✅ #8547 Migrate away from legacy Flow syntax in flow definitions
- ✅ #8558 Cursor stuck before leading inline
DecoratorNode - ✅ #8564 Skip
$reconcileChildrenfast path during full reconcile - ✅ #8569 Correct children fast-path text size for cross-parent-moved elements
- ✅ #8577 Prevent
MOVE_TO_END/MOVE_TO_STARTcrash on decorator-only elements - ✅ #8581 Restore Shift+Cmd+Arrow selection expansion for
MOVE_TO_END/MOVE_TO_START
HTML / DOM:
- 🆕 #8528
DOMImportExtension— composable replacement forimportDOMwith rule-based matchers and DOM preprocessing - 🆕 #8575
disabledForEditor/disabledForSessionpredicates ondomOverride
Code:
- 🆕 #8445 Outdent space-indented code lines on Shift+Tab
- 🆕 #8553 Allow
nullTokenizer.defaultLanguageto preserve markdown ``` round-trip - ✅ #8487 Detect nested
<br>elements in pasted code - ✅ #8514 Externalize shiki dependencies in the published bundle
Clipboard:
- 🧹 #8431 Export
GetClipboardDataExtension
Extension:
- 🆕 #8497
NormalizeInlineElementsExtension(also wired into rich/plain text) - 🆕 #8520
NormalizeTripleClickSelectionExtension - 🆕 #8549
ClickAfterLastBlockExtension - ✅ #8510 Set the correct default
$canIndent
History:
- 🆕 #8465
canUndo/canRedoReadonlySignals onHistoryExtension - 🆕 #8537
maxDepthoption for bounding the undo stack
Link / List:
- 🆕 #8460
$setFormatFromDOM;ListItemNodeimports alignment from DOM - 🆕 #8427
ListNode.createListItemNodefactory for subclasses
Markdown:
- ⚠️ #8503 Apply markdown shortcuts on composition-committed triggers (fixes IME-typed
*/_/~) - 🆕 #8395
$convertSelectionToMarkdownStringAPI - ✅ #8402 Preserve hard line breaks in default markdown import
- ✅ #8488 Run element-shortcut transforms on Enter
- ✅ #8535 Fix markdown import with Unicode whitespace
React:
- 🆕 #8489 Optional async
onCloseforLexicalTypeaheadMenuPlugin - ✅ #8411 Pass editor context to
editorState.read()inmarkSelection - ✅ #8472
ExtensionComponentsupport for output components with required props - 🧹 #8485 Make
onOpenEmbedModalForConfigprop optional inLexicalAutoEmbedPlugin
Rich Text / Plain Text:
- 🆕 #8383 Opt-in
escapeFormatTriggersonRichTextExtension - ✅ #8526 Insert paragraph on Enter for a block
DecoratorNodeNodeSelection
Table:
- ✅ #8492 Attach window
pointerdownhandler when root element is set after register - ✅ #8502 Prevent crash when moving selection with arrow key outside of nested table
Yjs:
- ✅ #8461 Handle node state being removed on non-
TextNodes in collab v2 - 🧹 #8527 Fix
RenderSnapshotcomment typo
Playground:
- 🆕 #8464 New "markdown-editor split-view" example
- ✅ #8419 #8432 Position
FloatingLinkEditorcorrectly for multi-line / decorator-only links and near the editor's bottom edge - ✅ #8442 Prevent crash importing
<details>with loose body content - ✅ #8444 Allow
PagesExtensionto be disabled byActionsPlugin(HTML & markdown mode) - ✅ #8453 Convert selection to a code block in place
- ✅ #8480 Prevent auto-zoom when focusing in the editor on iOS Safari
- ✅ #8496 Set
font-sizeforh2 - ✅ #8521 Fix unawaited Playwright promises in e2e suite
- ✅ #8534
EquationNodeclick →NodeSelection; empty-input Backspace removes - ✅ #8539 Normalize collapsible content children
- ✅ #8565 Build dev playground in development mode
Website / Examples:
- 🆕 #8570 Server-rendered "Copy page as Markdown" button
- 🆕 #8546 "Tuning HistoryExtension for memory and long sessions" docs
- 🆕 #8429 Clarify
editorStatenullvsundefinedand empty-state pitfall - 🆕 #8467 Document
NodeStatein$configJSON serialization - 🆕 #8471 TSDoc for
LexicalNodeReplacementandwithKlass - 🆕 #8476 Add missing
@lexical/reactplugin docs - 🧹 #8430 Inline toolbar SVG icons in examples via Vite asset handling
- 🧹 #8403 Merge
dev-node-state-styleintoexamples/node-state-style - 🧹 #8473 Disable
skipLibCheckinreact-richfor lib-types regression coverage (#7093) - ✅ #8462 Add the missing links to the sandbox
- ✅ #8463 #8483 Fix copyright statement to pass OSS automated checkup
- ✅ #8498
update-team-data - ✅ #8509 Drop Vercel Analytics inject and unwrap chat input from flex parent
- ✅ #8516 Drop
docusaurus-plugin-internaldocs-fbpreset - ✅ #8523 Correct links to included extensions
- ✅ #8531 Remove
embed=1from non-iframe StackBlitz links - ✅ #8557 Fix crash on
/docs/errorpage from undefinedprocess
Infrastructure:
- 🧹 #8554 Publish packages from their root directory
- 🧹 #8512 Respect
browserslist - 🧹 #8504 Use composite actions to simplify GitHub workflows
- 🧹 #8494 Only cancel in-progress workflows on newer commits
- 🧹 #8499 Run extended tests on new commits to approved PRs
- 🧹 #8508 Drop FIXME #8348 Firefox
ArrowDownworkaround inTables.spec.mjs - 🧹 #8522 Pin Windows e2e runners to
windows-2022 - 🧹 #8572 Use
playwright install-depsinstead ofapt-get - 🧹 #8582 Upgrade
@playwright/testto^1.60.0 - 🧹 #8541 Cover bold-italic markdown round trip
- 🧹 #8400 Fix release workflow's missing rename from
release.jstorelease.mjs - 🧹 #8401 #8404 #8405 #8406 #8408 #8409 #8415 #8540 Dependency vulnerability fixes (protobufjs, dompurify, postcss, astro, eslint, immutable, path-to-regexp, serialize-javascript)
What's Changed
- v0.44.0 by @etrepum in #8394
- [*] Bug Fix: Fix release workflow's missing rename from release.js to release.mjs by @etrepum in #8400
- [lexical] Chore: Fix protobufjs dependency vulnerability by @vishisht31 in #8401
- [lexical] Chore: Fix dompurify dependency vulnerability by @vishisht31 in #8404
- [lexical] Chore: Fix postcss dependency vulnerability by @vishisht31 in #8405
- [lexical] Chore: Fix astro dependency vulnerability by @vishisht31 in #8406
- [examples] Chore: Merge dev-node-state-style into examples/node-state-style by @etrepum in #8403
- [lexical] Chore: Fix eslint dependency vulnerability by @vishisht31 in #8408
- [lexical] Chore: Fix immutable dependency vulnerability by @vishisht31 in #8409
- [lexical][lexical-rich-text][lexical-list] Bug Fix: Import dir attribute in importDOM by @mayrang in #8412
- [lexical] Chore: Fix path-to-regexp dependency vulnerability by @vishisht31 in #8415
- [lexical-utils] Bug Fix: Pass editor context to editorState.read() in markSelection by @potatowagon in #8411
- [lexical-markdown] Feature: Add $convertSelectionToMarkdownString API by @mayrang in #8395
- [lexical] perf: defer DOM Selection property reads in $updateDOMSelection by @rhagigi in #8422
- [lexical-playground] Bug Fix: Position FloatingLinkEditor below the entire link for multi-line and decorator-only links by @mayrang in #8419
- Chore: Inline toolbar SVG icons in examples via Vite asset handling by @markselby9 in #8430
- [lexical-website][lexical-react] Documentation Update: Clarify editorState null vs undefined and empty-state pitfall by @markselby9 in #8429
- [lexical] Bug Fix: Respect CSS display style in isBlockDomNode and isInlineDomNode by @abhishekvishwakarma007 in #8428
- [lexical-clipboard] Chore: Export GetClipboardDataExtension by @ibastawisi in #8431
- [lexical-playground] Bug Fix: Prevent FloatingLinkEditor toolbar from being clipped near the editor's bottom edge by @mayrang in #8432
- [lexical][lexical-playground] Bug Fix: Add workarounds for buggy browser behavior around macOS text replacements by @nmggithub in #8417
- [lexical-markdown] Bug Fix: Preserve hard line breaks in default markdown import by @pro-vi in #8402
- [lexical][lexical-list] Bug Fix: Reuse DOM when reconciling cross-parent node moves by @mayrang in #8441
- [lexical-playground] Bug Fix: Prevent crash importing
- [lexical-playground] Bug Fix: Allow PagesExtension to be disabled by ActionsPlugin (html & markdown mode) by @etrepum in #8444
- [lexical-list] Feature: Add the
createListItemNodemethod to the ListNode and use it for children normalization by @levensta in #8427 - [lexical-rich-text] Feature: Add opt-in format escape triggers for RichTextExtension by @vishisht31 in #8383
- build(deps): bump @floating-ui/react from 0.27.16 to 0.27.19 by @dependabot[bot] in #8448
- build(deps): bump happy-dom from 20.8.9 to 20.9.0 by @dependabot[bot] in #8451
- [lexical-code-core][lexical-code-shiki][lexical-code-prism] Feature: Outdent space-indented code lines by @mayrang in #8445
- [lexical-playground] Bug Fix: Convert selection to a code block in place by @mayrang in #8453
- build(deps-dev): bump the dev-dependencies group across 1 directory with 30 updates by @dependabot[bot] in #8447
- build(deps): bump yjs from 13.6.27 to 13.6.30 by @dependabot[bot] in #8449
- build(deps-dev): bump @types/jsdom from 21.1.6 to 28.0.1 in the dev-dependencies group by @dependabot[bot] in #8455
- build(deps): bump react-day-picker from 9.12.0 to 9.14.0 by @dependabot[bot] in #8458
- build(deps): bump react-error-boundary from 6.0.0 to 6.1.1 by @dependabot[bot] in #8456
- [lexical-yjs] Bug Fix: Handle node state being removed on non-TextNodes in collab v2 by @james-atticus in #8461
- [examples] Docs: Add the missing links to the sandbox by @levensta in #8462
- [lexical][lexical-list] Feature: Add
$setFormatFromDOMfunction and use it to import alignment for ListItem by @levensta in #8460 - build(deps): bump @chakra-ui/react from 2.10.9 to 3.35.0 by @dependabot[bot] in #8457
- [lexical-website] Fix copyright statement to pass OSS automated checkup by @potatowagon in #8463
- [lexical] Bug Fix: Resolve --lexical-indent-base-value via CSS var() instead of pre-computing in JS by @mayrang in #8466
- [lexical-website] Documentation Update: Document NodeState in $config JSON serialization by @markselby9 in #8467
- [lexical-website] Documentation: Add missing @lexical/react plugin docs by @abhishekvishwakarma007 in #8476
- [lexical] Refactor: Cache RangeSelection.isBackward() result on the instance by @mayrang in #8474
- [examples] Chore: Disable skipLibCheck in react-rich for lib-types regression coverage (#7093) by @markselby9 in #8473
- [lexical] Documentation: Add TSDoc for LexicalNodeReplacement and withKlass by @markselby9 in #8471
- [lexical-history] Feature: Add canUndo and canRedo ReadonlySignals to HistoryExtension output by @etrepum in #8465
- [lexical-react] Bug Fix: ExtensionComponent support for output Components with required props by @etrepum in #8472
- [lexical] Perf: Adopt GenMap copy-on-write for NodeMap and reconciler keyToDOMMap by @mayrang in #8481
- [lexical] Bug Fix: Preserve queued updates and tags through setRootElement by @mayrang in #8470
- Fix: Copyright statement to match OSS automated checkup regex by @potatowagon in #8483
- [Breaking Change][lexical] Bug Fix: Include shadow root in $getReconciledDirection by @ibastawisi in #8479
- [lexical-playground] Fix: Prevent auto-zoom when focusing in the editor in iOS Safari by @levensta in #8480
- [lexical] Bug Fix: keep caret above the on-screen keyboard after Enter by @jWA86 in #8486
- [lexical-code-core] Bug Fix: detect nested br elements in pasted code by @danyalahmed1995 in #8487
- [lexical-react] Chore: Make
onOpenEmbedModalForConfigprop optional in LexicalAutoEmbedPlugin by @levensta in #8485 - [lexical-table] Bug Fix: Attach window pointerdown handler when root element is set after register by @etrepum in #8492
- [examples][lexical-website] Feature: Add markdown-editor split-view example by @etrepum in #8464
- [ci] Bug Fix: Only cancel in-progress workflows on newer commits by @etrepum in #8494
- [Breaking Change][lexical] Bug Fix: Backspace at block start preserves the current block by @mayrang in #8493
- [lexical] Bug Fix: Handle iOS 10-key Korean IME deleteContentBackward with targetRange by @kotom320 in #8475
- [lexical-website] Chore: pnpm run update-team-data by @etrepum in #8498
- build(deps): bump mermaid from 11.14.0 to 11.15.0 by @dependabot[bot] in #8500
- [ci] Bug Fix: Run extended tests on new commits to approved PRs by @etrepum in #8499
- [lexical-playground] Bug Fix: Set font-size for h2 by @levensta in #8496
- [Breaking Change][lexical] Bug Fix: Adjust selection when removeFromParent callers move a node out of its parent by @mayrang in #8501
- [lexical] Perf: Children fast path with suffix-incremental cache update in $reconcileChildren by @mayrang in #8482
- [lexical-playground] Chore: Drop FIXME #8348 Firefox ArrowDown workaround in Tables.spec.mjs by @markselby9 in #8508
- [Breaking Change][lexical-markdown] Bug Fix: Apply markdown shortcuts on composition-committed triggers by @mayrang in #8503
- [Breaking Change][lexical-extension][lexical-rich-text][lexical-plain-text] Feature: Remove empty inline elements by @levensta in #8497
- [lexical-table] Bug Fix: prevent crash when moving selection with arrow key outside of nested table by @randal-atticus in #8502
- [lexical][lexical-list][lexical-selection][lexical-link] Refactor: Centralize replace-area selection mapping + bulk splice by @mayrang in #8505
- [lexical-extension] Bug Fix: Set the correct default
$canIndentby @levensta in #8510 - [ci] Refactor: Use composite actions to simplify github workflows by @etrepum in #8504
- [lexical-website] Refactor: Drop docusaurus-plugin-internaldocs-fb preset by @zurfyx in #8516
- [lexical-website] Bug Fix: Drop Vercel Analytics inject and unwrap chat input from flex parent by @mayrang in #8509
- [lexical-code-shiki][nextjs-code-shiki] Bug Fix: Externalize shiki dependencies in the published bundle by @etrepum in #8514
- [lexical-website] Bug Fix: Correct links to included extensions by @duydang2311 in #8523
- [lexical-markdown] Bug Fix: run element markdown shortcuts on Enter by @abhinavgautam01 in #8488
- [lexical-react] Feature: optional async onClose for LexicalTypeaheadMenuPlugin by @abhinavgautam01 in #8489
- [lexical][lexical-yjs][lexical-playground] Chore: Respect browserslist by @levensta in #8512
- [ci] Chore: pin Windows e2e runners to windows-2022 by @etrepum in #8522
- [lexical-playground] Bug Fix: Fix unawaited playwright promises in e2e test suite by @etrepum in #8521
- [lexical-yjs] Chore: Fix RenderSnapshot comment typo by @LeSingh1 in #8527
- [lexical-rich-text] Bug Fix: Insert paragraph on Enter for a block DecoratorNode NodeSelection by @mayrang in #8526
- [Breaking Change][lexical][lexical-extension][lexical-rich-text][lexical-plain-text] Feature: Move triple click selection handling to NormalizeTripleClickSelectionExtension by @etrepum in #8520
- [lexical] Bug Fix: handle triple-click overselection in
$setBlocksTypeby @flavorjones in #8517 - [lexical-website] Bug Fix: Remove embed=1 from non-iframe StackBlitz links by @etrepum in #8531
- [lexical-markdown] Bug Fix: Fix Markdown import with Unicode whitespace by @rodrigolungui in #8535
- [lexical] Feature: ElementNode import/export support for data-lexical-indent by @etrepum in #8536
- [lexical-history] Feature: Add maxDepth option to HistoryExtension by @etrepum in #8537
- build(deps): bump serialize-javascript from 6.0.2 to 7.0.4 by @dependabot[bot] in #8540
- [lexical-playground] Bug Fix: EquationNode click → NodeSelection + empty-input Backspace removes by @mayrang in #8534
- [lexical] Feature: Detect infinite recursion in update listeners by @mayrang in #8542
- [lexical-extension][lexical-html][lexical-utils][lexical] Chore: Migrate away from legacy flow syntax by @SamChou19815 in #8547
- [lexical-markdown] Chore: Cover bold italic markdown round trip by @rohan-patnaik in #8541
- [lexical] Bug Fix: Cache last-child kind for trailing-
reconcile by @mayrang in #8548 - [lexical-playground] Bug Fix: Normalize collapsible content children by @rohan-patnaik in #8539
- [lexical-extension][lexical-playground] Feature: Insert paragraph on click after the last block by @mayrang in #8549
- [lexical-code-prism][lexical-code-shiki][lexical-playground] Feature: Allow null Tokenizer.defaultLanguage to preserve markdown ``` round-trip by @mayrang in #8553
- [lexical][lexical-rich-text][lexical-code-core] Bug Fix: Cursor stuck before leading inline DecoratorNode by @mayrang in #8558
- [lexical] Bug Fix: Skip $reconcileChildren fast path during full reconcile by @etrepum in #8564
- [lexical-playground] Bug Fix: Build dev playground in development mode by @etrepum in #8565
- [Breaking Change][lexical][lexical-html][lexical-selection][lexical-utils][lexical-playground] Feature: Generalize DOMSlot and add DOMRenderExtension override surface by @mayrang in #8519
- [lexical-website] Bug Fix: Fix crash on /docs/error page from undefined process by @etrepum in #8557
- [lexical] Bug Fix: Correct children fast-path text size for cross-parent-moved elements by @etrepum in #8569
- [ci] Use playwright install-deps instead of apt-get by @etrepum in #8572
- [lexical-website] Feature: Server-rendered "Copy page" Markdown button by @etrepum in #8570
- [lexical-html] Feature: DOMImportExtension - replacement for importDOM by @etrepum in #8528
- [lexical-website] Documentation: Tuning HistoryExtension for long sessions by @etrepum in #8546
- [*] Refactor: Publish packages from their root directory by @etrepum in #8554
- fix: prevent MOVE_TO_END/MOVE_TO_START crash on decorator-only edits by @potatowagon in #8577
- [lexical-html][lexical-playground] Feature: Conditional DOM render overrides (disabledForEditor/disabledForSession) by @etrepum in #8575
- fix: restore Shift+Cmd+Arrow selection expansion for MOVE_TO_END/MOVE_TO_START by @potatowagon in #8581
- [ci][lexical] Bug Fix: Upgrade @playwright/test to ^1.60.0 by @etrepum in #8582
New Contributors
- @rhagigi made their first contribution in #8422
- @markselby9 made their first contribution in #8430
- @abhishekvishwakarma007 made their first contribution in #8428
- @nmggithub made their first contribution in #8417
- @danyalahmed1995 made their first contribution in #8487
- @kotom320 made their first contribution in #8475
- @duydang2311 made their first contribution in #8523
- @abhinavgautam01 made their first contribution in #8488
- @LeSingh1 made their first contribution in #8527
- @flavorjones made their first contribution in #8517
- @rodrigolungui made their first contribution in #8535
- @rohan-patnaik made their first contribution in #8541
Full Changelog: v0.44.0...v0.45.0