v0.45.0

leptos-rs/leptosv0.45.0May 28, 2026by etrepum

AI Summary

A major monthly release featuring breaking changes in selection and reconciliation, a new experimental DOMImportExtension API, generalized DOMSlot, and improved HistoryExtension ergonomics.

Key Highlights

  • New experimental `DOMImportExtension` API for composable HTML import
  • Generalized `DOMSlot` and DOM render override surface
  • New `HistoryExtension` ergonomics (`canUndo`/`canRedo` signals, `maxDepth`)
  • Notable reconciler/selection performance work

Breaking Changes

  • Shadow root inclusion in `$getReconciledDirection` now walks through shadow roots
  • Backspace at block start preserves the current block
  • Selection adjustment in `removeFromParent` callers now moves selection with node
  • Markdown shortcuts now trigger on composition-committed triggers
  • `NormalizeInlineElementsExtension` now removes empty inline elements by default
  • `NormalizeTripleClickSelectionExtension` moved out of core `LexicalEditor`

New Features

  • New `DOMImportExtension` experimental API
  • Conditional DOM render overrides
  • `ElementNode` import/export of `data-lexical-indent`
  • Infinite recursion detection in update listeners
  • `canUndo` / `canRedo` ReadonlySignals
  • `maxDepth` option for HistoryExtension
  • `$convertSelectionToMarkdownString`

Full Release Notes

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](https://lexical.dev/docs/extensions/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](https://lexical.dev/docs/extensions/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](https://lexical.dev/docs/serialization/dom-render) 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](https://lexical.dev/docs/serialization/dom-import) guide and the ["Migrating from `importDOM`"](https://lexical.dev/docs/serialization/dom-import#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](https://lexical.dev/docs/serialization/dom-render) 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](https://lexical.dev/docs/concepts/updates) and [Listeners](https://lexical.dev/docs/concepts/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](https://lexical.dev/docs/extensions/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"](https://lexical.dev/docs/concepts/history#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](https://lexical.dev/docs/extensions/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 `LexicalNode` callers move a node out of its parent
* ⚠️ #8519 Generalize `DOMSlot` and add DOMRenderExtension override surface; `markSelection` rewritten on top
* ⚠️ #8520 Move triple-click selection normalization to `NormalizeTripleClickSelectionExtension`
* 🆕 #8536 `ElementNode` import/export of `data-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 `NodeMap` and reconciler `keyToDOMMap`
* ⚡ #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 `dir` attribute in `importDOM`
* ✅ #8417 Workarounds for buggy browser behavior around macOS text replacements
* ✅ #8428 Respect CSS `display` style in `isBlockDomNode` / `isInlineDomNode`
* ✅ #8441 Reuse DOM when reconciling cross-parent node moves
* ✅ #8466 Resolve `--lexical-indent-base-value` via CSS `var()` instead of pre-computing in JS
* ✅ #8470 Preserve queued updates and tags through `setRootElement`
* ✅ #8475 Handle iOS 10-key Korean IME `deleteContentBackward` with `targetRange`
* ✅ #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 `$reconcileChildren` fast path during full reconcile
* ✅ #8569 Correct children fast-path text size for cross-parent-moved elements
* ✅ #8577 Prevent `MOVE_TO_END` / `MOVE_TO_START` crash on decorator-only elements
* ✅ #8581 Restore Shift+Cmd+Arrow selection expansion for `MOVE_TO_END` / `MOVE_TO_START`

HTML / DOM:

* 🆕 #8528 [`DOMImportExtension`](https://lexical.dev/docs/serialization/dom-import) — composable replacement for `importDOM` with rule-based matchers and DOM preprocessing
* 🆕 #8575 `disabledForEditor` / `disabledForSession` predicates on [`domOverride`](https://lexical.dev/docs/serialization/dom-render)

Code:

* 🆕 #8445 Outdent space-indented code lines on Shift+Tab
* 🆕 #8553 Allow `null` `Tokenizer.defaultLanguage` to 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` / `canRedo` `ReadonlySignal`s on `HistoryExtension`
* 🆕 #8537 [`maxDepth` option](https://lexical.dev/docs/concepts/history#tuning-historyextension-for-memory-and-long-sessions) for bounding the undo stack

Link / List:

* 🆕 #8460 `$setFormatFromDOM`; `ListItemNode` imports alignment from DOM
* 🆕 #8427 `ListNode.createListItemNode` factory for subclasses

Markdown:

* ⚠️ #8503 Apply markdown shortcuts on composition-committed triggers (fixes IME-typed `*`/`_`/`~`)
* 🆕 #8395 `$convertSelectionToMarkdownString` API
* ✅ #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 `onClose` for `LexicalTypeaheadMenuPlugin`
* ✅ #8411 Pass editor context to `editorState.read()` in `markSelection`
* ✅ #8472 `ExtensionComponent` support for output components with required props
* 🧹 #8485 Make `onOpenEmbedModalForConfig` prop optional in `LexicalAutoEmbedPlugin`

Rich Text / Plain Text:

* 🆕 #8383 Opt-in `escapeFormatTriggers` on `RichTextExtension`
* ✅ #8526 Insert paragraph on Enter for a block `DecoratorNode` `NodeSelection`

Table:

* ✅ #8492 Attach window `pointerdown` handler 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-`TextNode`s in collab v2
* 🧹 #8527 Fix `RenderSnapshot` comment typo

Playground:

* 🆕 #8464 New "markdown-editor split-view" example
* ✅ #8419 #8432 Position `FloatingLinkEditor` correctly for multi-line / decorator-only links and near the editor's bottom edge
* ✅ #8442 Prevent crash importing `<details>` with loose body content
* ✅ #8444 Allow `PagesExtension` to be disabled by `ActionsPlugin` (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-size` for `h2`
* ✅ #8521 Fix unawaited Playwright promises in e2e suite
* ✅ #8534 `EquationNode` click → `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"](https://lexical.dev/docs/concepts/history#tuning-historyextension-for-memory-and-long-sessions) docs
* 🆕 #8429 Clarify `editorState` `null` vs `undefined` and empty-state pitfall
* 🆕 #8467 Document `NodeState` in `$config` JSON serialization
* 🆕 #8471 TSDoc for `LexicalNodeReplacement` and `withKlass`
* 🆕 #8476 Add missing `@lexical/react` plugin docs
* 🧹 #8430 Inline toolbar SVG icons in examples via Vite asset handling
* 🧹 #8403 Merge `dev-node-state-style` into `examples/node-state-style`
* 🧹 #8473 Disable `skipLibCheck` in `react-rich` for 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-fb` preset
* ✅ #8523 Correct links to included extensions
* ✅ #8531 Remove `embed=1` from non-iframe StackBlitz links
* ✅ #8557 Fix crash on `/docs/error` page from undefined `process`

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 `ArrowDown` workaround in `Tables.spec.mjs`
* 🧹 #8522 Pin Windows e2e runners to `windows-2022`
* 🧹 #8572 Use `playwright install-deps` instead of `apt-get`
* 🧹 #8582 Upgrade `@playwright/test` to `^1.60.0`
* 🧹 #8541 Cover bold-italic markdown round trip
* 🧹 #8400 Fix release workflow's missing rename from `release.js` to `release.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 https://github.com/facebook/lexical/pull/8394
* [*] Bug Fix: Fix release workflow's missing rename from release.js to release.mjs by @etrepum in https://github.com/facebook/lexical/pull/8400
* [lexical] Chore: Fix protobufjs dependency vulnerability  by @vishisht31 in https://github.com/facebook/lexical/pull/8401
* [lexical] Chore: Fix dompurify dependency vulnerability  by @vishisht31 in https://github.com/facebook/lexical/pull/8404
* [lexical] Chore: Fix postcss dependency vulnerability  by @vishisht31 in https://github.com/facebook/lexical/pull/8405
* [lexical] Chore: Fix astro dependency vulnerability  by @vishisht31 in https://github.com/facebook/lexical/pull/8406
* [examples] Chore: Merge dev-node-state-style into examples/node-state-style by @etrepum in https://github.com/facebook/lexical/pull/8403
* [lexical] Chore: Fix eslint dependency vulnerability  by @vishisht31 in https://github.com/facebook/lexical/pull/8408
* [lexical] Chore: Fix immutable dependency vulnerability  by @vishisht31 in https://github.com/facebook/lexical/pull/8409
* [lexical][lexical-rich-text][lexical-list] Bug Fix: Import dir attribute in importDOM by @mayrang in https://github.com/facebook/lexical/pull/8412
* [lexical] Chore: Fix path-to-regexp dependency vulnerability by @vishisht31 in https://github.com/facebook/lexical/pull/8415
* [lexical-utils] Bug Fix: Pass editor context to editorState.read() in markSelection by @potatowagon in https://github.com/facebook/lexical/pull/8411
* [lexical-markdown] Feature: Add $convertSelectionToMarkdownString API by @mayrang in https://github.com/facebook/lexical/pull/8395
* [lexical] perf: defer DOM Selection property reads in $updateDOMSelection by @rhagigi in https://github.com/facebook/lexical/pull/8422
* [lexical-playground] Bug Fix: Position FloatingLinkEditor below the entire link for multi-line and decorator-only links by @mayrang in https://github.com/facebook/lexical/pull/8419
* Chore: Inline toolbar SVG icons in examples via Vite asset handling by @markselby9 in https://github.com/facebook/lexical/pull/8430
* [lexical-website][lexical-react] Documentation Update: Clarify editorState null vs undefined and empty-state pitfall by @markselby9 in https://github.com/facebook/lexical/pull/8429
* [lexical] Bug Fix: Respect CSS display style in isBlockDomNode and isInlineDomNode by @abhishekvishwakarma007 in https://github.com/facebook/lexical/pull/8428
* [lexical-clipboard] Chore: Export GetClipboardDataExtension by @ibastawisi in https://github.com/facebook/lexical/pull/8431
* [lexical-playground] Bug Fix: Prevent FloatingLinkEditor toolbar from being clipped near the editor's bottom edge by @mayrang in https://github.com/facebook/lexical/pull/8432
* [lexical][lexical-playground] Bug Fix: Add workarounds for buggy browser behavior around macOS text replacements by @nmggithub in https://github.com/facebook/lexical/pull/8417
* [lexical-markdown] Bug Fix: Preserve hard line breaks in default markdown import by @pro-vi in https://github.com/facebook/lexical/pull/8402
* [lexical][lexical-list] Bug Fix: Reuse DOM when reconciling cross-parent node moves by @mayrang in https://github.com/facebook/lexical/pull/8441
* [lexical-playground] Bug Fix: Prevent crash importing <details> with loose body content by @markselby9 in https://github.com/facebook/lexical/pull/8442
* [lexical-playground] Bug Fix: Allow PagesExtension to be disabled by ActionsPlugin (html & markdown mode) by @etrepum in https://github.com/facebook/lexical/pull/8444
* [lexical-list] Feature: Add the `createListItemNode` method to the ListNode and use it for children normalization by @levensta in https://github.com/facebook/lexical/pull/8427
* [lexical-rich-text] Feature: Add opt-in format escape triggers for RichTextExtension by @vishisht31 in https://github.com/facebook/lexical/pull/8383
* build(deps): bump @floating-ui/react from 0.27.16 to 0.27.19 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8448
* build(deps): bump happy-dom from 20.8.9 to 20.9.0 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8451
* [lexical-code-core][lexical-code-shiki][lexical-code-prism] Feature: Outdent space-indented code lines by @mayrang in https://github.com/facebook/lexical/pull/8445
* [lexical-playground] Bug Fix: Convert selection to a code block in place by @mayrang in https://github.com/facebook/lexical/pull/8453
* build(deps-dev): bump the dev-dependencies group across 1 directory with 30 updates by @dependabot[bot] in https://github.com/facebook/lexical/pull/8447
* build(deps): bump yjs from 13.6.27 to 13.6.30 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8449
* build(deps-dev): bump @types/jsdom from 21.1.6 to 28.0.1 in the dev-dependencies group by @dependabot[bot] in https://github.com/facebook/lexical/pull/8455
* build(deps): bump react-day-picker from 9.12.0 to 9.14.0 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8458
* build(deps): bump react-error-boundary from 6.0.0 to 6.1.1 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8456
* [lexical-yjs] Bug Fix: Handle node state being removed on non-TextNodes in collab v2 by @james-atticus in https://github.com/facebook/lexical/pull/8461
* [examples] Docs: Add the missing links to the sandbox by @levensta in https://github.com/facebook/lexical/pull/8462
* [lexical][lexical-list] Feature: Add `$setFormatFromDOM` function and use it to import alignment for ListItem by @levensta in https://github.com/facebook/lexical/pull/8460
* build(deps): bump @chakra-ui/react from 2.10.9 to 3.35.0 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8457
* [lexical-website] Fix copyright statement to pass OSS automated checkup by @potatowagon in https://github.com/facebook/lexical/pull/8463
* [lexical] Bug Fix: Resolve --lexical-indent-base-value via CSS var() instead of pre-computing in JS by @mayrang in https://github.com/facebook/lexical/pull/8466
* [lexical-website] Documentation Update: Document NodeState in $config JSON serialization by @markselby9 in https://github.com/facebook/lexical/pull/8467
* [lexical-website] Documentation: Add missing @lexical/react plugin docs by @abhishekvishwakarma007 in https://github.com/facebook/lexical/pull/8476
* [lexical] Refactor: Cache RangeSelection.isBackward() result on the instance by @mayrang in https://github.com/facebook/lexical/pull/8474
* [examples] Chore: Disable skipLibCheck in react-rich for lib-types regression coverage (#7093) by @markselby9 in https://github.com/facebook/lexical/pull/8473
* [lexical] Documentation: Add TSDoc for LexicalNodeReplacement and withKlass by @markselby9 in https://github.com/facebook/lexical/pull/8471
* [lexical-history] Feature: Add canUndo and canRedo ReadonlySignals to HistoryExtension output by @etrepum in https://github.com/facebook/lexical/pull/8465
* [lexical-react] Bug Fix: ExtensionComponent support for output Components with required props by @etrepum in https://github.com/facebook/lexical/pull/8472
* [lexical] Perf: Adopt GenMap copy-on-write for NodeMap and reconciler keyToDOMMap by @mayrang in https://github.com/facebook/lexical/pull/8481
* [lexical] Bug Fix: Preserve queued updates and tags through setRootElement by @mayrang in https://github.com/facebook/lexical/pull/8470
* Fix: Copyright statement to match OSS automated checkup regex by @potatowagon in https://github.com/facebook/lexical/pull/8483
* [Breaking Change][lexical] Bug Fix: Include shadow root in $getReconciledDirection by @ibastawisi in https://github.com/facebook/lexical/pull/8479
* [lexical-playground] Fix: Prevent auto-zoom when focusing in the editor in iOS Safari by @levensta in https://github.com/facebook/lexical/pull/8480
* [lexical] Bug Fix: keep caret above the on-screen keyboard after Enter by @jWA86 in https://github.com/facebook/lexical/pull/8486
* [lexical-code-core] Bug Fix: detect nested br elements in pasted code by @danyalahmed1995 in https://github.com/facebook/lexical/pull/8487
* [lexical-react] Chore: Make `onOpenEmbedModalForConfig` prop optional in LexicalAutoEmbedPlugin by @levensta in https://github.com/facebook/lexical/pull/8485
* [lexical-table] Bug Fix: Attach window pointerdown handler when root element is set after register by @etrepum in https://github.com/facebook/lexical/pull/8492
* [examples][lexical-website] Feature: Add markdown-editor split-view example by @etrepum in https://github.com/facebook/lexical/pull/8464
* [ci] Bug Fix: Only cancel in-progress workflows on newer commits by @etrepum in https://github.com/facebook/lexical/pull/8494
* [Breaking Change][lexical] Bug Fix: Backspace at block start preserves the current block by @mayrang in https://github.com/facebook/lexical/pull/8493
* [lexical] Bug Fix: Handle iOS 10-key Korean IME deleteContentBackward with targetRange by @kotom320 in https://github.com/facebook/lexical/pull/8475
* [lexical-website] Chore: pnpm run update-team-data by @etrepum in https://github.com/facebook/lexical/pull/8498
* build(deps): bump mermaid from 11.14.0 to 11.15.0 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8500
* [ci] Bug Fix: Run extended tests on new commits to approved PRs by @etrepum in https://github.com/facebook/lexical/pull/8499
* [lexical-playground] Bug Fix: Set font-size for h2 by @levensta in https://github.com/facebook/lexical/pull/8496
* [Breaking Change][lexical] Bug Fix: Adjust selection when removeFromParent callers move a node out of its parent by @mayrang in https://github.com/facebook/lexical/pull/8501
* [lexical] Perf: Children fast path with suffix-incremental cache update in $reconcileChildren by @mayrang in https://github.com/facebook/lexical/pull/8482
* [lexical-playground] Chore: Drop FIXME #8348 Firefox ArrowDown workaround in Tables.spec.mjs by @markselby9 in https://github.com/facebook/lexical/pull/8508
* [Breaking Change][lexical-markdown] Bug Fix: Apply markdown shortcuts on composition-committed triggers by @mayrang in https://github.com/facebook/lexical/pull/8503
* [Breaking Change][lexical-extension][lexical-rich-text][lexical-plain-text] Feature: Remove empty inline elements by @levensta in https://github.com/facebook/lexical/pull/8497
* [lexical-table] Bug Fix: prevent crash when moving selection with arrow key outside of nested table by @randal-atticus in https://github.com/facebook/lexical/pull/8502
* [lexical][lexical-list][lexical-selection][lexical-link] Refactor: Centralize replace-area selection mapping + bulk splice by @mayrang in https://github.com/facebook/lexical/pull/8505
* [lexical-extension] Bug Fix: Set the correct default `$canIndent` by @levensta in https://github.com/facebook/lexical/pull/8510
* [ci] Refactor: Use composite actions to simplify github workflows by @etrepum in https://github.com/facebook/lexical/pull/8504
* [lexical-website] Refactor: Drop docusaurus-plugin-internaldocs-fb preset by @zurfyx in https://github.com/facebook/lexical/pull/8516
* [lexical-website] Bug Fix: Drop Vercel Analytics inject and unwrap chat input from flex parent by @mayrang in https://github.com/facebook/lexical/pull/8509
* [lexical-code-shiki][nextjs-code-shiki] Bug Fix: Externalize shiki dependencies in the published bundle by @etrepum in https://github.com/facebook/lexical/pull/8514
* [lexical-website] Bug Fix: Correct links to included extensions by @duydang2311 in https://github.com/facebook/lexical/pull/8523
* [lexical-markdown] Bug Fix: run element markdown shortcuts on Enter by @abhinavgautam01 in https://github.com/facebook/lexical/pull/8488
* [lexical-react] Feature: optional async onClose for LexicalTypeaheadMenuPlugin by @abhinavgautam01 in https://github.com/facebook/lexical/pull/8489
* [lexical][lexical-yjs][lexical-playground] Chore: Respect browserslist by @levensta in https://github.com/facebook/lexical/pull/8512
* [ci] Chore: pin Windows e2e runners to windows-2022 by @etrepum in https://github.com/facebook/lexical/pull/8522
* [lexical-playground] Bug Fix: Fix unawaited playwright promises in e2e test suite by @etrepum in https://github.com/facebook/lexical/pull/8521
* [lexical-yjs] Chore: Fix RenderSnapshot comment typo by @LeSingh1 in https://github.com/facebook/lexical/pull/8527
* [lexical-rich-text] Bug Fix: Insert paragraph on Enter for a block DecoratorNode NodeSelection by @mayrang in https://github.com/facebook/lexical/pull/8526
* [Breaking Change][lexical][lexical-extension][lexical-rich-text][lexical-plain-text] Feature: Move triple click selection handling to NormalizeTripleClickSelectionExtension by @etrepum in https://github.com/facebook/lexical/pull/8520
* [lexical] Bug Fix: handle triple-click overselection in `$setBlocksType` by @flavorjones in https://github.com/facebook/lexical/pull/8517
* [lexical-website] Bug Fix: Remove embed=1 from non-iframe StackBlitz links by @etrepum in https://github.com/facebook/lexical/pull/8531
* [lexical-markdown] Bug Fix: Fix Markdown import with Unicode whitespace by @rodrigolungui in https://github.com/facebook/lexical/pull/8535
* [lexical] Feature: ElementNode import/export support for data-lexical-indent by @etrepum in https://github.com/facebook/lexical/pull/8536
* [lexical-history] Feature: Add maxDepth option to HistoryExtension by @etrepum in https://github.com/facebook/lexical/pull/8537
* build(deps): bump serialize-javascript from 6.0.2 to 7.0.4 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8540
* [lexical-playground] Bug Fix: EquationNode click → NodeSelection + empty-input Backspace removes by @mayrang in https://github.com/facebook/lexical/pull/8534
* [lexical] Feature: Detect infinite recursion in update listeners by @mayrang in https://github.com/facebook/lexical/pull/8542
* [lexical-extension][lexical-html][lexical-utils][lexical] Chore: Migrate away from legacy flow syntax by @SamChou19815 in https://github.com/facebook/lexical/pull/8547
* [lexical-markdown] Chore: Cover bold italic markdown round trip by @rohan-patnaik in https://github.com/facebook/lexical/pull/8541
* [lexical] Bug Fix: Cache last-child kind for trailing-<br> reconcile by @mayrang in https://github.com/facebook/lexical/pull/8548
* [lexical-playground] Bug Fix: Normalize collapsible content children by @rohan-patnaik in https://github.com/facebook/lexical/pull/8539
* [lexical-extension][lexical-playground] Feature: Insert paragraph on click after the last block by @mayrang in https://github.com/facebook/lexical/pull/8549
* [lexical-code-prism][lexical-code-shiki][lexical-playground] Feature: Allow null Tokenizer.defaultLanguage to preserve markdown ``` round-trip by @mayrang in https://github.com/facebook/lexical/pull/8553
* [lexical][lexical-rich-text][lexical-code-core] Bug Fix: Cursor stuck before leading inline DecoratorNode by @mayrang in https://github.com/facebook/lexical/pull/8558
* [lexical] Bug Fix: Skip $reconcileChildren fast path during full reconcile by @etrepum in https://github.com/facebook/lexical/pull/8564
* [lexical-playground] Bug Fix: Build dev playground in development mode by @etrepum in https://github.com/facebook/lexical/pull/8565
* [Breaking Change][lexical][lexical-html][lexical-selection][lexical-utils][lexical-playground] Feature: Generalize DOMSlot and add DOMRenderExtension override surface by @mayrang in https://github.com/facebook/lexical/pull/8519
* [lexical-website] Bug Fix: Fix crash on /docs/error page from undefined process by @etrepum in https://github.com/facebook/lexical/pull/8557
* [lexical] Bug Fix: Correct children fast-path text size for cross-parent-moved elements by @etrepum in https://github.com/facebook/lexical/pull/8569
* [ci] Use playwright install-deps instead of apt-get by @etrepum in https://github.com/facebook/lexical/pull/8572
* [lexical-website] Feature: Server-rendered "Copy page" Markdown button by @etrepum in https://github.com/facebook/lexical/pull/8570
* [lexical-html] Feature: DOMImportExtension - replacement for importDOM by @etrepum in https://github.com/facebook/lexical/pull/8528
* [lexical-website] Documentation: Tuning HistoryExtension for long sessions by @etrepum in https://github.com/facebook/lexical/pull/8546
* [*] Refactor: Publish packages from their root directory by @etrepum in https://github.com/facebook/lexical/pull/8554
* fix: prevent MOVE_TO_END/MOVE_TO_START crash on decorator-only edits by @potatowagon in https://github.com/facebook/lexical/pull/8577
* [lexical-html][lexical-playground] Feature: Conditional DOM render overrides (disabledForEditor/disabledForSession) by @etrepum in https://github.com/facebook/lexical/pull/8575
* fix: restore Shift+Cmd+Arrow selection expansion for MOVE_TO_END/MOVE_TO_START by @potatowagon in https://github.com/facebook/lexical/pull/8581
* [ci][lexical] Bug Fix: Upgrade @playwright/test to ^1.60.0 by @etrepum in https://github.com/facebook/lexical/pull/8582

## New Contributors
* @rhagigi made their first contribution in https://github.com/facebook/lexical/pull/8422
* @markselby9 made their first contribution in https://github.com/facebook/lexical/pull/8430
* @abhishekvishwakarma007 made their first contribution in https://github.com/facebook/lexical/pull/8428
* @nmggithub made their first contribution in https://github.com/facebook/lexical/pull/8417
* @danyalahmed1995 made their first contribution in https://github.com/facebook/lexical/pull/8487
* @kotom320 made their first contribution in https://github.com/facebook/lexical/pull/8475
* @duydang2311 made their first contribution in https://github.com/facebook/lexical/pull/8523
* @abhinavgautam01 made their first contribution in https://github.com/facebook/lexical/pull/8488
* @LeSingh1 made their first contribution in https://github.com/facebook/lexical/pull/8527
* @flavorjones made their first contribution in https://github.com/facebook/lexical/pull/8517
* @rodrigolungui made their first contribution in https://github.com/facebook/lexical/pull/8535
* @rohan-patnaik made their first contribution in https://github.com/facebook/lexical/pull/8541

**Full Changelog**: https://github.com/facebook/lexical/compare/v0.44.0...v0.45.0