v0.46.0 is a monthly release headlined by two major new experimental capabilities:
- Named slots - a model that lets a single host element or decorator node own several isolated editable regions inside the host's own
editorState - Shadow DOM - the root element can now be hosted in an open shadow root (or iframe)
This release also includes many other fixes and new features across IME/composition, collaboration, markdown round-tripping, lists, code blocks, links, and mobile keyboards. It is also our first release (other than nightlies) to use NPM Trusted Publishing.
Special recognition for this release goes to @mayrang for doing the majority of the work on both of these new features as well as fixing some tricky IME/composition issues 👏 @levensta has also been doing a fantastic job going through the issue backlog, providing valuable feedback on these bleeding edge features, and identifying long-standing edge cases.
Breaking Changes
lexical — Node traversal methods no longer accept unsafe type parameters (#8661)
The zero-argument generics on getParent(OrThrow), getPreviousSibling(s), getNextSibling(s), getChildren, getFirstChild(OrThrow), getLastChild(OrThrow), getChildAtIndex, getFirstDescendant, getLastDescendant, and getDescendantByIndex were implicit unchecked casts — there is no inference site, so any non-base type argument was equivalent to an as cast. Each method is now an overload pair: a documented non-generic signature returning the base type (LexicalNode / ElementNode | null), plus the old generic signature marked @deprecated. Code that leaned on contextual-type inference no longer type-checks:
// Before: compiled (unsound). After: type error.
const node: ParagraphNode | null = $getRoot().getFirstChild();
// Port directly with an explicit cast (no behavior change):
const node = $getRoot().getFirstChild() as ParagraphNode | null;
// Or, better, narrow with a guard:
const node = $getRoot().getFirstChild();
if ($isParagraphNode(node)) { /* node: ParagraphNode */ }Existing getFirstChild<ParagraphNode>()-style calls still compile but are now deprecated and will be removed in a future release. This is a types-only change with no runtime impact.
lexical — $getNearestNodeFromDOMNode(rootElement) now returns RootNode (#8588)
The "selection captured outside of Lexical" mechanism is generalized beyond DecoratorNode subtrees: setDOMUnmanaged(dom, {captureSelection: true}) now marks any subtree (e.g. a DOMRenderExtension override or a getDOMSlot widget) as selection-captured, and isDOMCapturingSelection(dom) walks ancestors so a descendant <input> reports as captured. As part of this, the root element now carries a __lexicalKey_* stash, so $getNodeFromDOM / $getNearestNodeFromDOMNode resolve the root element to the RootNode instead of null. Two call sites become more correct (drop-on-root in clipboard, table-selection→range conversion), but external callers that relied on $getNearestNodeFromDOMNode(rootElement) returning null must update. The internal-only $isSelectionCapturedInDecorator was removed.
lexical — insertNodes preserves a leading linebreak; managed <br>s are now tagged (#8615)
RangeSelection.insertNodes now preserves the first LineBreakNode when inserting inline content ahead of a block element, instead of silently dropping it. Separately, the reconciler-inserted "managed" line breaks (the otherwise-invisible <br>s Lexical adds so the caret can land in empty lines) are now identifiable in the DOM as <br data-lexical-managed-linebreak="true"> — and, on iOS Safari, an analogous <img data-lexical-managed-linebreak="true" …> in some cases. DOM/HTML snapshot test expectations may need to ignore or expect this attribute. Closes #3980.
@lexical/html and node extensions — DOMImportExtension rules now register implicitly (#8662) (experimental)
The experimental DOM-import pipeline no longer requires you to list a per-package import extension. Each node-providing extension (RichTextExtension, ListExtension, LinkExtension, TableExtension, CodeExtension) now registers its own import rules, and the standalone RichTextImportExtension / ListImportExtension / LinkImportExtension / TableImportExtension / CodeImportExtension / HorizontalRuleImportExtension become deprecated aliases that may be removed as early as v0.47.0. Rules stay inert unless HTML is routed through ClipboardDOMImportExtension or $generateNodesFromDOMViaExtension; the legacy importDOM paste path is unchanged. If you had not adopted these v0.45.0 extensions yet, there is no breaking change.
lexical / @lexical/yjs / @lexical/clipboard / @lexical/html — Named slots (#8603) (experimental)
All slot machinery is opt-in and gated (an editor latches _slotsUsed on the first $setSlot), so editors that never use slots take identical code paths to before. Two changes are observable regardless:
syncLexicalUpdateToYjsV2__EXPERIMENTALtakes a newdirtyLeavesparameter, inserted betweendirtyElementsandnormalizedNodes(a slot host's values surface as dirty leaves).- A
NodeSelectioncontaining anElementNodenow includes that element's children on copy/export ($getHtmlContent/$generateJSONFromSelectedNodes). The previous behavior serialized a childless shell, making cut of an elementNodeSelectionsilently lossy; partialRangeSelections keep per-child slicing andexcludeFromCopychildren remain excluded.
@lexical/link / @lexical/list / @lexical/react — Removed exports deprecated since v0.32.1 (#8704)
Exports marked @deprecated in v0.32.1 (2025-06-04, >12 months ago) with no Meta-internal consumers are removed:
@lexical/link:toggleLink→ use$toggleLink@lexical/list:insertList/removeList→ use$insertList/$removeList(from an update or command listener)@lexical/react: theContentEditablePropstype alias → useContentEditableProps
Note: lexical's $nodesOfType is intentionally un-deprecated (it still has many consumers). The remaining v0.32.1 deprecations that still have internal consumers (KEY_MODIFIER_COMMAND, $wrapNodes, the @lexical/table row/column helpers, etc.) are left for a follow-up.
New APIs
lexical — editor.read(mode, fn) and EditorReadMode (#8702)
read gains an optional first argument: 'force-commit' (the default; flushes pending updates first — the previous one-argument behavior), 'pending' (reads the pending state without flushing — the old editor.readPending, now removed), and 'latest' (reads the committed state without flushing, equivalent to editor.getEditorState().read(fn, {editor})). EditorReadMode is exported. readPending only shipped after v0.45.0, so its removal is not considered a breaking change.
lexical — DOM shadow root support (#8694)
An editor can now mount inside an open shadow tree without losing selection, focus, drag-and-drop, IME composition, or floating-UI behavior. Reads go through platform APIs — Selection.getComposedRanges, Selection.direction, ShadowRoot.activeElement, Document.caretPositionFromPoint(x, y, {shadowRoots}) — and nine new helpers ship from lexical; the light-DOM code paths are unchanged. Follow-ups #8708 (insert nodes at the block cursor inside a shadow root) and #8740 (ignore beforeinput/input in captured decorators, fixing Firefox 152) complete the surface.
lexical — onWarn editor hook (#8644)
CreateEditorArgs gains an optional onWarn?: ErrorHandler (stored as _onWarn, defaulting to console.warn), mirroring onError. The infinite-update-loop guard's recoverable warning now routes through it (wired end-to-end in #8658), so embedders that bridge reporting to their own telemetry no longer lose this signal to each user's browser console.
lexical — $config() accessor-based nominal typing (#8645)
An additive extension of the $config() protocol: abstract base classes can declare configuration shared with their subclasses under a Symbol.for(<ClassName>) key (resolved by getStaticNodeConfig), and accessor-based nominal typing lets subclasses opt into stricter $config() checks. No existing node class is changed.
@lexical/history — Cut/paste get their own undo entry (#8649)
Any update tagged PASTE_TAG or CUT_TAG is now classified as an OTHER change inside @lexical/history, which keeps it from merging into the preceding keystrokes and keeps following keystrokes from merging into it. Undoing a short paste (or an iOS autocorrect/prediction) or a cut no longer also undoes the text you typed immediately before it.
@lexical/extension — SelectBlockExtension (#8532)
Overrides SELECT_ALL_COMMAND so the first invocation selects the nearest block element and the second selects the entire document; a selection already spanning multiple blocks expands straight to the document, and select-all is a no-op when everything is already selected. Includes an opt-in cascadeSelection option for nested editors (image captions, etc.) and enables PreventSelectAllExtension by default to keep keydown from leaking out of input/textarea elements. (Also introduced editor.read('pending', …) via the now-generalized #8702.)
@lexical/yjs / @lexical/react — Collaborative cursors via the CSS Custom Highlight API (#8550)
Remote collaborators' selections are now painted with the widely-supported CSS Custom Highlight API; the error-prone absolutely-positioned overlay remains only as a fallback. The remote caret is still rendered as a positioned element. Closes #4457, #5837.
@lexical/utils — dedupeSelectionRects (#8709)
A new exported helper that drops zero-area rects and any rect that contains another (with 1px tolerance) from Range.getClientRects(), fixing the duplicate/over-bright and spurious extra-wide fake-selection rects WebKit produces on some blocks. It is wired into positionNodeOnRange, so every fake-selection consumer (markSelection, selectionAlwaysOnDisplay, the extension) gets clean rects. Addresses #7106, #7492.
@lexical/code-core — escapeWithArrows (#8393)
CodeIndentExtension gains an escapeWithArrows option (default false): when a code block is the terminal node and the caret is at the end of its text, pressing the arrow keys creates a new paragraph and moves the caret into it. New $onEscapeDown / $onEscapeUp helpers back it in @lexical/utils. Closes #7912, #4685, #5968.
@lexical/react — Self-contained LexicalErrorBoundary (#8720)
LexicalErrorBoundary no longer wraps react-error-boundary (the dependency is dropped) and gains an optional fallback prop — omit it for the default message, or pass fallback={null} to render nothing. Its public type is unchanged, so it remains usable as the ErrorBoundary prop of RichTextPlugin / PlainTextPlugin.
Highlights
Core (lexical):
- ⚠️ #8661 Deprecate unsafe type parameters on node traversal methods
- ⚠️ #8588
$getNearestNodeFromDOMNode(rootElement)resolves toRootNode; generalized captured selection viasetDOMUnmanaged({captureSelection}) - ⚠️ #8615 Preserve the first linebreak in
insertNodes; tag managed<br>withdata-lexical-managed-linebreak - 🆕 #8694 DOM shadow root support via platform selection APIs
- 🆕 #8702
editor.read(mode, fn)overload +EditorReadMode(replacesreadPending) - 🆕 #8644
onWarneditor hook (#8658 routes the recursion guard through it end-to-end) - 🆕 #8645
$config()accessor-based nominal typing - ✅ #8598
TabNode.setTextContentfor Safari IME composition - ✅ #8604 Caret stuck when a block has no leading or trailing text
- ✅ #8680 Emit
COMPOSITION_END_TAGfrom the FirefoxonInputdefer branch - ✅ #8701 Recheck text-node contents on deletion with composition
- ✅ #8686 Reuse the empty trailing block when typing at root + last-offset selection
- ✅ #8708 Insert nodes at the block cursor inside a shadow root
- ✅ #8715 Normalize non-inline nodes when inserting into inline-only parents
- ✅ #8740 Ignore
beforeinput/inputin captured decorators (Firefox 152) - ✅ #8635 #8631 #8612 #8638 Stop the infinite-update-loop detector over-firing on fast typing; report via
devInvariant - ✅ #8617
$assumeEditorwarns viadevInvariantinstead of throwing in prod - ✅ #8726 Guard the
klass.prototypenull check ingetStaticNodeConfig - ✅ #8739 Use an
inheritsLoose-safe helper for class-inheritance loops - ✅ #8593 Harden against ReDoS and prototype pollution (linear-time regexes, prototype guards); faster CSS parsing
- 🧹 #8628 Surface a clear error when TypeScript (<5.2) can't read the package exports
- 🧹 #8579 Consolidate tokenization through
tokenizeRawText/$generateNodesFromRawText - 🧹 #8735 Better error messages for invalid node classes; cache
getStaticNodeConfig - 🧹 #8675 #8742 #8667
T[]overArray<T>, modernized Flow stubs, dropped deprecated traversal type params in tests
Named slots (experimental):
- ⚠️🆕 #8603 Named slots — a host node owns multiple isolated editable regions inside its own
editorState - ✅ #8716 Named-slot typing / Backspace / Copy / hydrate paths
HTML / DOM import:
- ⚠️ #8662 Register DOMImportExtension rules implicitly via node extensions; make tree-shaking annotations effective
- 🧹 #8590 Migrate the playground's HTML import/export to the DOMImportExtension pipeline
- ✅ #8589
$generateHtmlFromNodesself-establishes active-editor scope (back-compat for #8519)
Extension / History:
- 🆕 #8532
SelectBlockExtension - 🆕 #8649 Snapshot history before cut/paste so an undo doesn't swallow prior typing
Code:
- 🆕 #8393
escapeWithArrows: create a paragraph around a terminal code block with the arrow keys - 🆕 #8600 Add Go to the code-language options
- ✅ #8606 Set the unsupported-syntax flag only once (shiki)
Link / List:
- ✅ #8513 Skip link wrapping on paste for non-simple text nodes
- ✅ #8705 Preserve the
LinkNodewrap on copy in Firefox/Safari - ✅ #8676 Preserve a previous
DecoratorNodeon Backspace at the start of a top-level list
Markdown:
- ✅ #8688 Code spans bind tighter than text-match transformers
- ✅ #8723 Inline code spans containing backticks
- ✅ #8728 Preserve inline formatting when wrapping already-formatted text with matching markers
- ✅ #8678 Update the ordered-list start when typing a marker before it
- ✅ #8562 Preserve block equation markdown
Mark / Clipboard / Table:
- 🧹 #8717 Widen
MarkNodemethod return types toboolean(restores subclass overrides) - ✅ #8706 Correct clipboard type-checking
- ✅ #8674 Don't throw on stale table node keys in
$handleTableSelectionChangeCommand
Collaboration (@lexical/yjs) / Dragon:
- 🆕 #8550 Render collab cursors via the CSS Custom Highlight API
- ✅ #8611 Local range selection no longer grows when a collaborator edits
- ✅ #8652 Keep the collab cursor at element end when decoding an out-of-range position
- ✅ #8651 #6614 Avoid empty-paragraph echo and a splice crash on collab undo; don't preserve tags on non-dirty updates
- ✅ #8646 Fix Yjs desync after clearing all nodes
- ✅ #8665
@lexical/dragon: handlemakeChangesmessages and the listener-registration race
Utils / React:
- 🆕 #8709
dedupeSelectionRects— clean up WebKit fake-selection rects - 🧹 #8733 Move
getScrollParentto@lexical/utils - ✅ #8684 Fix double paragraph creation when exiting a nested code block
- 🧹 #8720 Self-contained
LexicalErrorBoundary(dropsreact-error-boundary) with an optionalfallbackprop - 🧹 #8682 Hook syntax in
.js.flowfiles; 📝 #8714 API doc coverage of@lexical/reactexports
Rich Text / Plain Text:
- ✅ #8725 Refresh the iOS keyboard suggestion bar after Backspace for all locales
- ✅ #8663 Call
preventDefault()indragoverfor HTML5 DnD compliance
Playground:
- 🆕 #8574 Korean IME autocomplete with composition-idle ghost text (pluggable
AutocompleteDictionary) - 🆕 #8594 Non-printing marks (
¶,↵,→,·), toggled from Settings - ✅ #8599 Autocomplete wordlist returns the highest-priority completion
- ✅ #8666 Clear block alignment/indent on a collapsed (but not partial) selection
- ✅ #8719 Render
PageBreakNodeas<hr>so Safari firesbeforeinputafter paste - ✅ #8655 Fix the importmap of the
/esm/proof of concept - ✅ #8695 Correct the CodeBlock layout-exit e2e expected HTML
- 🧹 #8585 #8595 #8637 Audit and de-flake the e2e suite (remove all
@flakytags) - 🧹 #8639 Remove the localhost:1235 validation-server code from
ActionsPlugin
Infrastructure / Tooling:
- 🧹 #8587 #8597 #8747 Consolidate release workflows and adopt npm trusted publishing
- 🧹 #8614 Vitest browser-mode tests via the Playwright runner
- 🧹 #8673 Fix intermittent
EACCESin Windows CI browser tests - 🧹 #8703 Migrate
editor.getEditorState().read(...)toeditor.read('latest', ...) - 🧹 #8634 Require all changes to be backwards compatible (
AGENTS.md/CLAUDE.md) - 🧹 #8693 Remove the unused
tmpdependency; #8647 replace thenode-state-styleexample with the dev-examples version - 🧹 Dependency bumps: #8566 #8573 #8618 #8619 #8621 #8622 #8624 #8625 #8626 #8629 #8630 #8632 #8633
What's Changed
- v0.45.0 by @etrepum in #8580
- build(deps-dev): bump tmp from 0.2.5 to 0.2.6 by @dependabot[bot] in #8573
- [lexical-playground] Chore: Audit and de-flake the e2e suite (remove all @flaky tags) by @etrepum in #8585
- [lexical][lexical-code-core][lexical-code-prism][lexical-code-shiki] Chore: Consolidate text tokenization through tokenizeRawText / $generateNodesFromRawText by @etrepum in #8579
- fix(lexical-html): $generateHtmlFromNodes should self-establish active-editor scope (back-compat for #8519) by @potatowagon in #8589
- [lexical-link] Bug Fix: Skip link wrapping on paste for non-simple text nodes by @abhishekvishwakarma007 in #8513
- [lexical-playground][lexical-html][lexical-extension] Refactor: Migrate playground HTML import/export to the DOMImportExtension pipeline by @etrepum in #8590
- [Breaking Change][lexical] Feature: Generalize captured selection via setDOMUnmanaged({captureSelection}) + root _lexicalKey* stash by @mayrang in #8588
- [ci] Refactor: Consolidate release workflows + npm trusted publishing by @etrepum in #8587
- [lexical][lexical-extension][lexical-markdown][lexical-playground][lexical-yjs] Bug Fix: Linear-time regexes, prototype-pollution guards, and faster CSS parsing by @etrepum in #8593
- [lexical] Bug Fix: TabNode.setTextContent for Safari IME composition by @mayrang in #8598
- [lexical-playground] Feature: Korean IME autocomplete with composition-idle ghost by @mayrang in #8574
- [ci] Bug Fix: Trusted-publishing follow-ups (TTY-aware setup script, unify nightly, drop NPM_TOKEN) by @etrepum in #8597
- [lexical-playground] Bug Fix: AutocompleteExtension wordlist returns the highest-priority completion by @etrepum in #8599
- [lexical-playground][lexical-website] Feature: Non-printing marks (#8592) by @mayrang in #8594
- [lexical-playground] Chore: De-flake e2e timing- and history-dependent tests by @etrepum in #8595
- [lexical-code-shiki] Bug Fix: Set the unsupported syntax flag only once by @levensta in #8606
- [lexical-code-prism][lexical-playground] Feature: Add Go to code language options by @meaqua9420 in #8600
- [lexical-rich-text] Bug Fix: Caret stuck when block has no leading or trailing text by @mayrang in #8604
- Include editor namespace in infinite-update-loop detector error by @potatowagon in #8612
- [lexical-extension][lexical-react][lexical-playground] Chore: Add Vitest browser-mode tests via the Playwright runner by @etrepum in #8614
- fix(lexical): reconcile DOM mutations targeting the root element by @potatowagon in #8613
- revert(lexical): remove root-element carveout from #8613 (keep the typing test) by @potatowagon in #8616
- [lexical-yjs] Bug Fix: Local range selection grows when collaborator … by @sahiee-dev in #8611
- [lexical] Refactor: $assumeEditor now uses devInvariant instead of invariant to warn instead of throwing in prod by @etrepum in #8617
- build(deps): bump the docusaurus-and-typedoc group with 2 updates by @dependabot[bot] in #8618
- build(deps): bump @rollup/rollup-linux-x64-gnu from 4.52.0 to 4.61.0 by @dependabot[bot] in #8621
- build(deps-dev): bump the flow-and-hermes group with 5 updates by @dependabot[bot] in #8619
- build(deps): bump @shikijs/engine-javascript from 4.0.2 to 4.2.0 by @dependabot[bot] in #8622
- build(deps): bump yjs from 13.6.30 to 13.6.31 by @dependabot[bot] in #8624
- build(deps): bump @shikijs/langs from 3.23.0 to 4.2.0 by @dependabot[bot] in #8626
- build(deps): bump lucide-react from 0.503.0 to 1.17.0 by @dependabot[bot] in #8625
- build(deps): bump @huggingface/transformers from 4.0.1 to 4.2.0 by @dependabot[bot] in #8629
- build(deps-dev): bump the dev-dependencies group across 1 directory with 29 updates by @dependabot[bot] in #8630
- build(deps): bump webpack-dev-server to >=5.2.4 (CVE-2026-6402) by @xiezhenjia-meta in #8632
- build(deps): bump vitest to ^4.1.8 in examples (CVE-2026-47429) by @xiezhenjia-meta in #8633
- fix: bump astro to ^6.1.10 to resolve CVE-2026-45028 by @freddymeta in #8566
- [lexical] Bug Fix: use devInvariant for update recursion guard to avoid reporting a recovered condition as an uncaught error by @potatowagon in #8631
- [*] Bug Fix: Surface a clear error when TypeScript (<5.2) can't read the package exports by @etrepum in #8628
- [lexical-playground] Chore: De-flake collab "Undo with collaboration on" e2e test by @etrepum in #8637
- [lexical] Chore: cover both devInvariant branches in update-recursion guard test by @potatowagon in #8638
- [lexical-playground] Chore: Remove localhost:1235 validation server code from ActionsPlugin by @etrepum in #8639
- [*] Chore: require all changes to be backwards compatible by @potatowagon in #8634
- [lexical-code-core][lexical-playground] Feature: Create paragraph around the code node when navigating with the arrow keys by @levensta in #8393
- [lexical] Extend the $config() protocol with accessor-based nominal typing by @etrepum in #8645
- [lexical-yjs][lexical-react] Feature: Render collab cursors via CSS custom Highlight API by @hamza512b in #8550
- [examples] Chore: Replace node-state-style with the dev-examples version by @etrepum in #8647
- [lexical][lexical-history][lexical-rich-text][lexical-plain-text] Feature: Snapshot history before cut/paste operations by @etrepum in #8649
- [lexical] Feature: add an onWarn editor hook and route the update-recursion guard through it by @potatowagon in #8644
- [lexical-playground] Bug Fix: Fix the importmap of the /esm/ proof of concept by @etrepum in #8655
- [lexical-yjs] Bug Fix: keep collab cursor at element end when decoding an out-of-range position by @ivanscm in #8652
- [lexical][lexical-react] Bug Fix: actually route the update-recursion guard through editor._onWarn end-to-end (follow-up to #8644) by @potatowagon in #8658
- [lexical][lexical-yjs] Bug Fix: avoid empty-paragraph echo and splice crash on collab undo (#6614) and don't preserve tags on non-dirty update by @ivanscm in #8651
- [lexical-yjs] Bug Fix: Yjs desynchronizes after clearing all nodes by @sahiee-dev in #8646
- [Breaking Change][lexical][*] Chore: deprecate unsafe type parameters on node traversal methods by @etrepum in #8661
- [Breaking Changes][*] Refactor: Register DOMImportExtension rules implicitly via node extensions and make tree-shaking annotations effective by @etrepum in #8662
- [lexical][*] Chore: stop using deprecated traversal type parameters in tests by @etrepum in #8667
- [lexical] Bug Fix: stop infinite-update-loop detector over-firing on bounded activity (fast typing) by @potatowagon in #8635
- [lexical-dragon] Bug Fix: Handle makeChanges messages and the listener registration race by @brunoprietog in #8665
- [lexical][lexical-utils][lexical-extension][lexical-playground] Feature: SelectBlockExtension by @levensta in #8532
- [ci] Bug Fix: Fix intermittent EACCES in Windows CI browser tests by pinning Vitest browser port by @etrepum in #8673
- [lexical-table] Bug Fix: don't throw on stale table node keys in $handleTableSelectionChangeCommand by @etrepum in #8674
- [*] Chore: always use T[] syntax instead of Array in TypeScript and Flow by @etrepum in #8675
- [lexical] Bug Fix: Emit COMPOSITION_END_TAG from the Firefox onInput defer branch by @mayrang in #8680
- [lexical-markdown] Bug Fix: Update ordered list start when typing a marker before it by @mayrang in #8678
- [lexical-list] Bug Fix: Preserve previous DecoratorNode on Backspace at the start of a top-level list by @mayrang in #8676
- [lexical-playground] Bug Fix: clear block alignment and indent with a collapsed selection but not a partial one by @achaljhawar in #8666
- [lexical-react] Refactor: Use hook syntax in .js.flow files to better declare intent by @SamChou19815 in #8682
- [lexical-rich-text][lexical-plain-text] Spec hardening: call event.preventDefault() in dragover for HTML5 DnD compliance by @sahiee-dev in #8663
- [lexical-utils][lexical-playground] Bug Fix: Double paragraph creation when exiting a nested code block by @levensta in #8684
- [lexical-markdown] Bug Fix: code spans should bind tighter than text-match transformers by @etrepum in #8688
- [lexical] Bug Fix: Reuse the empty trailing block when typing at root + last-offset selection by @mayrang in #8686
- [lexical] Chore: Remove unused tmp dependency by @noritaka1166 in #8693
- [Breaking Change][lexical] Fix: Preserve the first linebreak when passing inline nodes to insertNodes and add data-lexical-managed-linebreak attribute to managed linebreaks by @levensta in #8615
- [lexical-playground] Bug Fix: CodeBlock layout-exit e2e expected HTML by @mayrang in #8695
- [lexical] Feature: Replace LexicalEditor.readPending with editor.read(mode, fn) overload by @etrepum in #8702
- [lexical] Bug Fix: Recheck text node contents on deletion with composition by @ewsbr in #8701
- [lexical-playground] Bug Fix: Preserve block equation markdown by @vivekjm in #8562
- [Breaking Changes][lexical][lexical-yjs][lexical-clipboard][lexical-html][lexical-playground] Feature: Named slots by @mayrang in #8603
- [lexical-clipboard] Bug Fix: Correct type-checking by @levensta in #8706
- [Breaking Changes][lexical-link][lexical-list][lexical-react] Chore: Remove a subset of v0.32.1-deprecated exports by @etrepum in #8704
- [lexical-link] Bug Fix: Preserve LinkNode wrap on copy in Firefox/Safari by @mayrang in #8705
- [lexical] Bug Fix: Insert nodes at the block cursor inside a shadow root by @etrepum in #8708
- [lexical-react][lexical-link][lexical-history][lexical-extension] Docs: API doc coverage of react exports by @etrepum in #8714
- [lexical-react][lexical-playground] Refactor: Replace react-error-boundary with a self-contained LexicalErrorBoundary by @etrepum in #8720
- [*] Refactor: Migrate editor.getEditorState().read(...) to editor.read('latest', ...) by @etrepum in #8703
- [lexical-playground] Bug Fix: Render PageBreakNode as
so Safari fires beforeinput after paste by @mayrang in #8719 - [lexical-mark] Chore: Widen MarkNode method return types to boolean by @patrick-atticus in #8717
- [lexical][lexical-rich-text][lexical-clipboard] Bug Fix: Named-slot typing / Backspace / Copy / hydrate paths by @mayrang in #8716
- [lexical-markdown] Bug Fix: Inline code spans containing backticks by @baptistejamin in #8723
- [lexical-plain-text][lexical-rich-text] Bug Fix: Refresh iOS keyboard suggestion bar after Backspace for all locales by @levensta in #8725
- fix(lexical): guard klass.prototype null check in getStaticNodeConfig by @potatowagon in #8726
- [lexical-markdown] Bug Fix: Preserve inline formatting when wrapping already-formatted text with matching markers by @koki-develop in #8728
- [lexical-utils] Add dedupeSelectionRects: fix duplicate/extra selection rects on WebKit (#7106, #7492) by @pro-vi in #8709
- [lexical] Bug Fix: Normalize non-inline nodes when inserting into inline-only parents by @etrepum in #8715
- [lexical] Feature: Support DOM shadow roots via platform selection APIs by @mayrang in #8694
- [lexical-utils][lexical-react] Chore: Move getScrollParent to @lexical/utils by @mayrang in #8733
- [lexical] Refactor: Improve error messages for invalid node classes and cache getStaticNodeConfig by @etrepum in #8735
- [lexical] Bug Fix: Refactor class inheritance loops to use an inheritsLoose-safe helper by @etrepum in #8739
- [lexical] Modernize Flow type-stub syntax rejected by fb-www flow strict by @potatowagon in #8742
- [lexical] Bug Fix: Ignore beforeinput and input events in captured decorators by @etrepum in #8740
- [ci] Bug Fix: grant id-token: write in version.yml release call by @etrepum in #8747
New Contributors
- @meaqua9420 made their first contribution in #8600
- @sahiee-dev made their first contribution in #8611
- @xiezhenjia-meta made their first contribution in #8632
- @freddymeta made their first contribution in #8566
- @hamza512b made their first contribution in #8550
- @ivanscm made their first contribution in #8652
- @brunoprietog made their first contribution in #8665
- @ewsbr made their first contribution in #8701
- @vivekjm made their first contribution in #8562
- @koki-develop made their first contribution in #8728
Full Changelog: v0.45.0...v0.46.0