v0.50.0
amirivojdan/shekarv0.50.0Sep 2, 2026by etrepum
Upgrading?
AI Summary
A major release for the Lexical editor framework introducing HMR support, compiled keyboard shortcuts, and screen reader accessibility, alongside several breaking changes to node replacement and clipboard handling.
Key Highlights
- HMR support for development
- Compiled keyboard shortcut dispatch
- Screen reader announcements for headings and links
- New `@lexical/compiler` package
- Upgrade to pnpm 11
Breaking Changes
- `LexicalNode.replace()` no longer re-homes named slot values
- Lexical JSON clipboard payload now uses `excludeFromCopy('clone')` instead of `'html'`
- `CAN_UNDO_COMMAND` and `CAN_REDO_COMMAND` are deprecated
New Features
- HMR support
- Compiled keyboard shortcuts
- Screen reader announcements
- Word list import extension
- New `@lexical/compiler` package
Full Release Notes
v0.50.0 is a monthly release with a large number of PRs to improve correctness, accessibility, and performance. It also ships HMR support, compiled keyboard shortcut dispatch, and screen reader announcements for headings and auto-links, and build-time tree-shaking annotations (in a new [`@lexical/compiler`](https://lexical.dev/docs/api/modules/lexical_compiler) package). We have upgraded to pnpm 11, so if you're working directly with the monorepo you will need to upgrade as well.
### Breaking Changes
* [`lexical`](https://lexical.dev/docs/api/modules/lexical) — `LexicalNode.replace()` no longer re-homes a named slot value. A slot value has no parent (its up-link is `__slotHost`), so replacing one through the tree API now fails with an actionable invariant instead of a generic parent error; use `$setSlot` on the owning host. `$setBlocksType` and the block converters skip slot values for the same reason ([#8938](https://github.com/facebook/lexical/pull/8938), [#8905](https://github.com/facebook/lexical/pull/8905), [#8901](https://github.com/facebook/lexical/pull/8901))
* [`@lexical/clipboard`](https://lexical.dev/docs/api/modules/lexical_clipboard) — The Lexical JSON clipboard payload (`application/x-lexical-editor`) now asks `excludeFromCopy('clone')` instead of `'html'`, matching the destination the rest of that payload already uses. Nodes that opt out of HTML export but expect to survive a clone (e.g. `MarkNode`) are copied again; custom `excludeFromCopy` implementations that keyed on `'html'` for this channel should be updated ([#8995](https://github.com/facebook/lexical/pull/8995))
### Behavior Changes to Watch
These were merged as bug fixes rather than breaking changes, but they change observable output — check them if you snapshot HTML, assert on the DOM, or depend on the old editing behavior.
* **HTML export emits a terminating `<br>`.** A trailing `LineBreakNode` in a block now exports an extra `<br data-lexical-managed-linebreak="true">`, mirroring what the reconciler already puts in the live DOM, so `<p>a<br></p>` survives an export/import round trip. Both importers drop the marker, but exported-HTML fixtures will differ ([#8765](https://github.com/facebook/lexical/pull/8765))
* **Rich text mounts an `aria-live` region by default.** `HeadingAnnounceExtension` (via `RichTextExtension`) and `AutoLinkAnnounceExtension` (via `AutoLinkExtension`) depend on `AriaLiveRegionExtension`, which appends a live-region `<div>` to `document.body` — or to the configured `owner` element. Opt out with `configExtension(HeadingAnnounceExtension, {disabled: true})` ([#8908](https://github.com/facebook/lexical/pull/8908), [#9071](https://github.com/facebook/lexical/pull/9071))
* **Select-all delete and cut now remove the blocks.** A whole-document range is widened to the top-level blocks, so the editor is left on a fresh empty paragraph instead of an emptied heading, quote or list that went on styling the next character typed — and Cmd+X now carries those blocks, so pasting restores them ([#8884](https://github.com/facebook/lexical/pull/8884))
* **A formatted paragraph copies as a block.** `ParagraphNode.extractWithChild` now keeps a fully-selected paragraph that carries alignment, indent or inline style in the payload as a block, instead of splicing its children in and dropping that formatting. Paragraphs with none of it serialize as before ([#9059](https://github.com/facebook/lexical/pull/9059))
* **`importJSON` applies registered node replacements.** JSON deserialization builds through `$create`, so a replacement's class is constructed and its `importJSON` runs; a deprecated `replace` without `withKlass` is still applied the old way ([#9061](https://github.com/facebook/lexical/pull/9061), [#9090](https://github.com/facebook/lexical/pull/9090))
* **Listener return types tightened.** Only `RootListener` and `EditableListener` are typed to return a cleanup function; returning one from another listener is now a TypeScript error — it was never called ([#8990](https://github.com/facebook/lexical/pull/8990))
* **Collab and Markdown output shifts.** `@lexical/yjs` no longer syncs root `textFormat`/`textStyle` ([#8940](https://github.com/facebook/lexical/pull/8940)); Markdown import restructures nested mixed-type lists and stores fence metadata in a new `mdCodeMeta` node state ([#8283](https://github.com/facebook/lexical/pull/8283))
* **New invariants.** Replacing a slot value ([#8938](https://github.com/facebook/lexical/pull/8938)), an `insertText` anchor that is not a text node, an empty `KeyboardShortcutMatch` key, and a `createBindingV2` `getXmlText`/`getXmlElement` that returns an un-integrated or misnamed type ([#6483](https://github.com/facebook/lexical/pull/6483)) now throw instead of failing later
### Deprecations
* [`lexical`](https://lexical.dev/docs/api/modules/lexical) — `CAN_UNDO_COMMAND` and `CAN_REDO_COMMAND` are deprecated in favor of the `canUndo` / `canRedo` signals on `HistoryExtension`. A command only reports a change, so a listener registered after initialization can't read the current value; the signal always holds it ([#8918](https://github.com/facebook/lexical/pull/8918))
### New APIs & Features
* [`@lexical/compiler`](https://lexical.dev/docs/api/modules/lexical_compiler) — New package that injects `/* @__PURE__ */` annotations and inlines the trivial side-effect-free factories (`defineExtension`, `configExtension`, `safeCast`, `createCommand`, `createState`, …) at build time, as a Rollup and Vite plugin. Hand-written annotations on those calls are no longer needed ([#9086](https://github.com/facebook/lexical/pull/9086))
* [`@lexical/extension`](https://lexical.dev/docs/api/modules/lexical_extension) — `HMRExtension` (with `HMRConfig`, `HMROutput`, `HotContext`) keeps an editor alive across hot module replacement. [`@lexical/react`](https://lexical.dev/docs/api/modules/lexical_react) gains `LexicalMenuOption`, `LexicalAutoEmbedPluginUtils`, `LexicalTypeaheadMenuPluginUtils` and `LexicalCollaborationContextUtils` entry points that split values out of component modules so Fast Refresh works — the original exports are unchanged ([#8959](https://github.com/facebook/lexical/pull/8959))
* [`lexical`](https://lexical.dev/docs/api/modules/lexical) / [`@lexical/extension`](https://lexical.dev/docs/api/modules/lexical_extension) — Compiled keyboard shortcut dispatch: `compileKeyboardShortcuts`, `CONTROL_OR_ALT`, `CONTROL_OR_META`, `CONTROL_OR_OTHER_KEY`, `keyboardEventMaskForPlatform` and the `KeyboardShortcut*` types in core, plus `KeyboardShortcutsExtension` and `formatKeyboardShortcut` for declaring named shortcuts and rendering them per platform ([#8876](https://github.com/facebook/lexical/pull/8876))
* [`@lexical/rich-text`](https://lexical.dev/docs/api/modules/lexical_rich_text) — `HeadingAnnounceExtension` announces heading changes to screen readers, on by default in `RichTextExtension`; [`@lexical/link`](https://lexical.dev/docs/api/modules/lexical_link)'s `AutoLinkAnnounceExtension` does the same when typing turns text into a link, on by default with `AutoLinkExtension` ([#8908](https://github.com/facebook/lexical/pull/8908), [#9071](https://github.com/facebook/lexical/pull/9071))
* [`@lexical/list`](https://lexical.dev/docs/api/modules/lexical_list) — Opt-in `WordListImportExtension` reconstructs list structure from Microsoft Word HTML (`MsoListParagraph` classes and `mso-list` metadata) on paste ([#9082](https://github.com/facebook/lexical/pull/9082))
* [`@lexical/rich-text`](https://lexical.dev/docs/api/modules/lexical_rich_text) — New `shouldHandlePasteAsFiles` config (and exported `defaultShouldHandlePasteAsFiles`, plus an optional third argument to `registerRichText`) lets an app decide that pasted files win over the incidental `text/html` browsers attach when an image is copied. The default is unchanged: files are handled only when the clipboard carries no text content ([#8902](https://github.com/facebook/lexical/pull/8902), [#8699](https://github.com/facebook/lexical/pull/8699))
* [`@lexical/yjs`](https://lexical.dev/docs/api/modules/lexical_yjs) — `CreateBindingV2Options__EXPERIMENTAL` allows a custom Yjs `XmlText`, so a Lexical document can live inside a larger shared type ([#6483](https://github.com/facebook/lexical/pull/6483))
* [`lexical`](https://lexical.dev/docs/api/modules/lexical) — New `$getSelectionSlotFrame` ([#9052](https://github.com/facebook/lexical/pull/9052)) and `$flushSyncAfterUpdate` ([#9067](https://github.com/facebook/lexical/pull/9067)) exports; `$isBlockFullySelected` moved into core and is still re-exported from `@lexical/utils` ([#9059](https://github.com/facebook/lexical/pull/9059)); [`@lexical/table`](https://lexical.dev/docs/api/modules/lexical_table) now exports the `TableCellHeaderState` type ([#9038](https://github.com/facebook/lexical/pull/9038)); JSDoc added across the core exports ([#8895](https://github.com/facebook/lexical/pull/8895))
* **Performance** — Bulk inserts and removals no longer walk the parent's children to compute an offset the selection never reads, which made those operations quadratic ([#9108](https://github.com/facebook/lexical/pull/9108))
### Notable Fixes
**Named slots & the node tree**
* Line breaks inside a slot insert and delete correctly ([#8899](https://github.com/facebook/lexical/pull/8899)); a managed line break is restored in wrapped slot hosts ([#9066](https://github.com/facebook/lexical/pull/9066)); reading the parent style of a slot value no longer throws ([#8950](https://github.com/facebook/lexical/pull/8950)); a slot-bearing decorator host is deleted correctly at the selection boundary ([#8905](https://github.com/facebook/lexical/pull/8905))
* `replace()` keeps the parent's `__size` correct when handed a sibling ([#8917](https://github.com/facebook/lexical/pull/8917)), and `splice` no longer creates a sibling cycle when it re-inserts a node after the range ([#8916](https://github.com/facebook/lexical/pull/8916))
**Node state, copy/paste & serialization**
* HTML import/export and slot frames carry the whole node state, keeping the HTML and Lexical clipboard payloads in agreement ([#9052](https://github.com/facebook/lexical/pull/9052)); copy and insert keep the original node's state ([#9059](https://github.com/facebook/lexical/pull/9059)); list operations and DOM import/export keep the node's own state ([#9050](https://github.com/facebook/lexical/pull/9050)); inline node transforms keep the node and its DOM in step ([#9060](https://github.com/facebook/lexical/pull/9060)); code blocks keep the caret and their own attributes ([#9056](https://github.com/facebook/lexical/pull/9056)); blocks pasted after consecutive line breaks are preserved ([#8890](https://github.com/facebook/lexical/pull/8890))
* Nodes keep their own properties across clone, split and export: `EditorState.clone()` keeps `_parsed` ([#8989](https://github.com/facebook/lexical/pull/8989)), `AutoLinkNode.insertNewAfter` keeps its properties ([#8996](https://github.com/facebook/lexical/pull/8996)), a split heading keeps its format and style ([#8926](https://github.com/facebook/lexical/pull/8926)), split lists continue numbering from the item's value ([#8913](https://github.com/facebook/lexical/pull/8913)), and in the playground the Excalidraw drawing and size survive a clone ([#8984](https://github.com/facebook/lexical/pull/8984)), a closed collapsible no longer exports as open ([#8994](https://github.com/facebook/lexical/pull/8994)), mention nodes keep their display text ([#8999](https://github.com/facebook/lexical/pull/8999)), custom nodes keep the theme classes `createDOM` applied ([#9049](https://github.com/facebook/lexical/pull/9049)) and an unparseable `data-lexical-datetime` no longer breaks serialization ([#9047](https://github.com/facebook/lexical/pull/9047))
**Selection & editing**
* Selection and caret state are correct at block and shadow root boundaries ([#9058](https://github.com/facebook/lexical/pull/9058)); the block cursor shows before block decorators regardless of the preceding sibling ([#8888](https://github.com/facebook/lexical/pull/8888)); the select-all highlight stays visible next to boundary decorators ([#8931](https://github.com/facebook/lexical/pull/8931)); `$extendCaretToRange`'s focus is a real, flippable position ([#8930](https://github.com/facebook/lexical/pull/8930)); Shift+Arrow extends adjacent node selections ([#9067](https://github.com/facebook/lexical/pull/9067)); clicking inside a selected node no longer deselects it ([#8910](https://github.com/facebook/lexical/pull/8910))
* `insertNodes` no longer leaves an empty paragraph after a block inserted at the end of a paragraph ([#9099](https://github.com/facebook/lexical/pull/9099)); `insertText` no longer throws when the caret is inside a segmented `TextNode` ([#9104](https://github.com/facebook/lexical/pull/9104)); Backspace works at a soft line-wrap boundary in Firefox ([#9101](https://github.com/facebook/lexical/pull/9101)); Enter on iOS no longer moves the caret past the acceptance boundary ([#8941](https://github.com/facebook/lexical/pull/8941)); iPadOS desktop-class user agents are detected ([#8909](https://github.com/facebook/lexical/pull/8909)); dropped files are forwarded when the drop point has no caret ([#9076](https://github.com/facebook/lexical/pull/9076)); clear-formatting resets the cached selection format ([#8889](https://github.com/facebook/lexical/pull/8889))
**Tables & lists**
* Table grid indices, cell state and boundary selection fixed ([#9054](https://github.com/facebook/lexical/pull/9054)); alignment covers every cell a table selection touches ([#9043](https://github.com/facebook/lexical/pull/9043)); inserting a column steps by the visited cell's `colSpan` ([#8911](https://github.com/facebook/lexical/pull/8911)); `importDOM` imports the `dir` attribute ([#8914](https://github.com/facebook/lexical/pull/8914)); `toggleHeaderStyle` stays inside `TableCellHeaderStates` ([#9038](https://github.com/facebook/lexical/pull/9038)); the `trackTable` `MutationObserver` is disconnected in `removeListeners` ([#9074](https://github.com/facebook/lexical/pull/9074)); text cursor placement is reliable when tapping cells on touch devices ([#8827](https://github.com/facebook/lexical/pull/8827))
* The stale depth theme class is removed when a list changes depth ([#9077](https://github.com/facebook/lexical/pull/9077)); rapid clicks on the same checklist checkbox are no longer throttled ([#9102](https://github.com/facebook/lexical/pull/9102)); focus stays in the editor when a press lands on a check list item's label ([#9088](https://github.com/facebook/lexical/pull/9088))
**Links, Markdown & HTML**
* `TOGGLE_LINK_COMMAND`'s object payload no longer discards the configured attributes ([#8985](https://github.com/facebook/lexical/pull/8985)); `$toggleLink` applies the `title` attribute for a `NodeSelection` ([#8993](https://github.com/facebook/lexical/pull/8993)); `LinkNode`/`AutoLinkNode` getters read the latest state ([#9080](https://github.com/facebook/lexical/pull/9080)); middle-clicked links open in a new tab ([#9078](https://github.com/facebook/lexical/pull/9078)); the auto embed menu only opens when a bare link is pasted ([#9091](https://github.com/facebook/lexical/pull/9091)); the playground's `validateUrl` no longer accepts a sentence that merely contains a URL ([#9097](https://github.com/facebook/lexical/pull/9097))
* Markdown round trips keep fenced code and enclosing blocks intact ([#9055](https://github.com/facebook/lexical/pull/9055)); nested mixed-type lists import with the right structure ([#8283](https://github.com/facebook/lexical/pull/8283)); a URL containing parentheses imports correctly ([#9093](https://github.com/facebook/lexical/pull/9093)); no dangling closing tag when a selection slices a format to whitespace ([#8961](https://github.com/facebook/lexical/pull/8961)); no stray leading newline when a selection starts below the first block ([#8960](https://github.com/facebook/lexical/pull/8960))
* A trailing line break survives HTML export and re-import ([#8765](https://github.com/facebook/lexical/pull/8765)); `exportDOM` returning a `DocumentFragment` applies its `after()` replacement ([#8997](https://github.com/facebook/lexical/pull/8997)); `parseSelector` rejects an empty selector group ([#9083](https://github.com/facebook/lexical/pull/9083)); Prism language maps are read as own properties ([#8981](https://github.com/facebook/lexical/pull/8981)); a function-valued style patch is applied once to an empty element ([#8912](https://github.com/facebook/lexical/pull/8912)); `objectKlassEquals` no longer throws on `undefined` or prototype-less objects ([#9079](https://github.com/facebook/lexical/pull/9079))
**React, collaboration & history**
* Decorator portals are recreated when the editor root remounts ([#8921](https://github.com/facebook/lexical/pull/8921)); `Placeholder` uses the SSR-safe `useLayoutEffect` ([#8906](https://github.com/facebook/lexical/pull/8906)); the typeahead query updates during IME composition ([#8942](https://github.com/facebook/lexical/pull/8942)); plugins and hooks re-derive when their inputs change ([#9051](https://github.com/facebook/lexical/pull/9051)); focus is restored after dragging decorator blocks ([#9064](https://github.com/facebook/lexical/pull/9064)); multiple clicks are normalized ([#8928](https://github.com/facebook/lexical/pull/8928))
* Collab sync gaps between the editor state and the Yjs doc are closed, and bootstrapping the initial state no longer becomes an undo entry ([#9057](https://github.com/facebook/lexical/pull/9057)); only one client may bootstrap a nested editor's document, so an image caption or sticky note no longer gains a spurious leading paragraph — `shouldBootstrap` is documented as at-most-one-client ([#9107](https://github.com/facebook/lexical/pull/9107)); `SharedHistoryExtension` forwards the parent `maxDepth` ([#9044](https://github.com/facebook/lexical/pull/9044)) and shared history stacks record the state of the editor that actually changed, alongside fixes to overlays, hit targets and shared state at the editor boundary ([#9053](https://github.com/facebook/lexical/pull/9053))
**Docs & tooling**
* New Decorators concept guide ([#8696](https://github.com/facebook/lexical/pull/8696)), a React MathType example ([#8692](https://github.com/facebook/lexical/pull/8692)), a clarified vanilla quick start ([#8801](https://github.com/facebook/lexical/pull/8801)), documented `DOMImportExtension` rule evaluation order ([#9089](https://github.com/facebook/lexical/pull/9089)), `SKIP_DOM_SELECTION_TAG` behavior during the initial editor state ([#8636](https://github.com/facebook/lexical/pull/8636)) and `$reverseDfs` ([#8962](https://github.com/facebook/lexical/pull/8962)), plus an OpenGraph social preview for the website ([#8935](https://github.com/facebook/lexical/pull/8935))
* Upgraded to pnpm 11 ([#8816](https://github.com/facebook/lexical/pull/8816)), cached Playwright's apt packages in CI ([#9085](https://github.com/facebook/lexical/pull/9085)), extracted the internal-registry OIDC exchange into a reusable action ([#9084](https://github.com/facebook/lexical/pull/9084)), fixed a `qs` dependency vulnerability ([#9072](https://github.com/facebook/lexical/pull/9072)), quieted stderr noise in `test-unit` ([#9098](https://github.com/facebook/lexical/pull/9098)) and moved the playground onto `ownerDocument`/`$getDocument()` for shadow DOM safety ([#8878](https://github.com/facebook/lexical/pull/8878))
## What's Changed
* v0.49.0 by @etrepum in https://github.com/facebook/lexical/pull/8893
* [lexical-playground] Chore: Use ownerDocument and $getDocument() for shadow DOM safety by @mayrang in https://github.com/facebook/lexical/pull/8878
* [lexical] Documentation Update: Add JSDoc comments to core package exports by @mayrang in https://github.com/facebook/lexical/pull/8895
* [lexical][lexical-rich-text] Bug Fix: Show block cursor before block decorators regardless of preceding sibling by @ochevallier in https://github.com/facebook/lexical/pull/8888
* [lexical] Bug Fix: Line breaks in a slot can't be inserted or deleted correctly by @sahiee-dev in https://github.com/facebook/lexical/pull/8899
* [lexical-playground] Bug Fix: Reset the cached selection format on clear formatting by @Yjason-K in https://github.com/facebook/lexical/pull/8889
* [lexical-selection] Bug Fix: Handle bare slot values in $setBlocksType by @mayrang in https://github.com/facebook/lexical/pull/8901
* [lexical-react] Bug Fix: Use the SSR-safe useLayoutEffect in Placeholder by @arcs- in https://github.com/facebook/lexical/pull/8906
* [lexical][lexical-selection][lexical-list] Bug Fix: Skip named-slot values in block converters, diagnose replace() on a slot value, and delete slot-bearing decorator hosts at the selection boundary by @etrepum in https://github.com/facebook/lexical/pull/8905
* [lexical-extension] Bug Fix: Normalize multiple clicks by @levensta in https://github.com/facebook/lexical/pull/8928
* [lexical-rich-text] Feat: add pasteFileContentCheck config to let files win over incidental HTML on paste by @Sa-Te in https://github.com/facebook/lexical/pull/8902
* [lexical] Bug Fix: Detect iPadOS desktop-class user agents by @corinthionia in https://github.com/facebook/lexical/pull/8909
* [lexical-rich-text] Bug Fix: Don't deselect a selected node when clicking inside it by @alvorithm in https://github.com/facebook/lexical/pull/8910
* [lexical-table] Bug Fix: step by the visited cell's colSpan when walking left to insert a column by @LeSingh1 in https://github.com/facebook/lexical/pull/8911
* [lexical-selection] Bug Fix: apply a function-valued style patch only once to an empty element by @LeSingh1 in https://github.com/facebook/lexical/pull/8912
* [lexical-table] Bug Fix: Import the dir attribute in table importDOM by @LeSingh1 in https://github.com/facebook/lexical/pull/8914
* [lexical-react] Bug Fix: Recreate decorator portals when the editor root remounts by @alphanull in https://github.com/facebook/lexical/pull/8921
* [lexical] Bug Fix: keep parent __size correct when replace() is passed a sibling by @LeSingh1 in https://github.com/facebook/lexical/pull/8917
* [lexical] Bug Fix: don't create a sibling cycle when splice re-inserts the node after the range by @LeSingh1 in https://github.com/facebook/lexical/pull/8916
* [lexical-rich-text] Bug Fix: preserve heading format and style when splitting a heading by @LeSingh1 in https://github.com/facebook/lexical/pull/8926
* [lexical-list] Bug Fix: continue split-list numbering from the item's value, not its index by @LeSingh1 in https://github.com/facebook/lexical/pull/8913
* [lexical] Bug Fix: make $extendCaretToRange's focus a real, flippable position by @Sa-Te in https://github.com/facebook/lexical/pull/8930
* [lexical] Deprecate CAN_UNDO_COMMAND and CAN_REDO_COMMAND in favour of HistoryExtension's signals by @LeSingh1 in https://github.com/facebook/lexical/pull/8918
* [lexical-website] Add opengraph social preview image by @alex-js-ltd in https://github.com/facebook/lexical/pull/8935
* [Breaking Change][lexical][lexical-utils][lexical-selection][lexical-website] Bug Fix: LexicalNode.replace no longer re-homes named slots by @etrepum in https://github.com/facebook/lexical/pull/8938
* [lexical-playground] Chore: Stabilize the collab dangling-text e2e tests by @etrepum in https://github.com/facebook/lexical/pull/8933
* [scripts] Bug Fix: wait out minimumReleaseAge boundary in example installs by @etrepum in https://github.com/facebook/lexical/pull/8934
* [lexical-yjs] Bug Fix: Don't sync root textFormat/textStyle by @patrick-atticus in https://github.com/facebook/lexical/pull/8940
* [lexical-react] Bug Fix: Update the typeahead query during IME composition by @hamo-o in https://github.com/facebook/lexical/pull/8942
* [lexical-selection] Bug Fix: don't throw reading the parent style of a slot value by @LeSingh1 in https://github.com/facebook/lexical/pull/8950
* [lexical-utils] Documentation Update: describe $reverseDfs instead of $reverseDfsIterator by @luantaraschi in https://github.com/facebook/lexical/pull/8962
* [lexical][lexical-website] Documentation Update: SKIP_DOM_SELECTION_TAG is ignored during initial editor state by @spokodev in https://github.com/facebook/lexical/pull/8636
* [lexical] Bug Fix: keep the select-all highlight visible next to boundary decorators by @etrepum in https://github.com/facebook/lexical/pull/8931
* [lexical-markdown] Bug Fix: don't emit a dangling closing tag when a selection slices a format to whitespace by @luantaraschi in https://github.com/facebook/lexical/pull/8961
* [lexical-code-prism] Bug Fix: read the language maps as own properties by @luantaraschi in https://github.com/facebook/lexical/pull/8981
* [lexical] Bug Fix: Don't move the caret past the acceptance boundary for Enter on iOS by @SujinKim1127 in https://github.com/facebook/lexical/pull/8941
* [lexical-playground] Bug Fix: keep the Excalidraw drawing and its size across a node clone by @LeSingh1 in https://github.com/facebook/lexical/pull/8984
* [lexical-link] Bug Fix: TOGGLE_LINK_COMMAND object payload no longer discards the configured attributes by @LeSingh1 in https://github.com/facebook/lexical/pull/8985
* [lexical] Bug Fix: EditorState.clone() keeps the _parsed flag by @LeSingh1 in https://github.com/facebook/lexical/pull/8989
* [lexical] Bug Fix: only root and editable listeners may return a cleanup function by @LeSingh1 in https://github.com/facebook/lexical/pull/8990
* [lexical-link] Bug Fix: $toggleLink applies the title attribute for a NodeSelection by @LeSingh1 in https://github.com/facebook/lexical/pull/8993
* [lexical-playground] Bug Fix: $createMentionNode keeps the display text it is given by @LeSingh1 in https://github.com/facebook/lexical/pull/8999
* [lexical-playground] Bug Fix: a closed collapsible container no longer exports as open by @LeSingh1 in https://github.com/facebook/lexical/pull/8994
* [Breaking Change][lexical-clipboard] Bug Fix: the Lexical clipboard payload asks excludeFromCopy for the clone destination by @LeSingh1 in https://github.com/facebook/lexical/pull/8995
* [lexical-link] Bug Fix: AutoLinkNode.insertNewAfter keeps the node's own properties by @LeSingh1 in https://github.com/facebook/lexical/pull/8996
* [lexical-html] Bug Fix: apply the after() replacement when exportDOM returns a DocumentFragment by @LeSingh1 in https://github.com/facebook/lexical/pull/8997
* [lexical-table] Bug Fix: align every cell a table selection covers, not just the naive rect by @LeSingh1 in https://github.com/facebook/lexical/pull/9043
* [lexical-playground] Bug Fix: importing an unparseable data-lexical-datetime no longer breaks serialization by @LeSingh1 in https://github.com/facebook/lexical/pull/9047
* [lexical-history] Bug Fix: SharedHistoryExtension forwards the parent maxDepth by @LeSingh1 in https://github.com/facebook/lexical/pull/9044
* [lexical-table] Bug Fix: toggleHeaderStyle stays inside TableCellHeaderStates by @LeSingh1 in https://github.com/facebook/lexical/pull/9038
* [lexical] Bug fix: apply nodes replacement for importJSON by @fantactuka in https://github.com/facebook/lexical/pull/9061
* [lexical-text][lexical-mark][lexical-link][lexical-playground] Bug Fix: inline node transforms keep the node and its DOM in step by @LeSingh1 in https://github.com/facebook/lexical/pull/9060
* [lexical-rich-text][lexical-a11y] Feature: Announce heading changes by default in rich text by @Electro-Jam in https://github.com/facebook/lexical/pull/8908
* [lexical-react][lexical-playground] Bug Fix: restore focus after dragging decorator blocks by @luantaraschi in https://github.com/facebook/lexical/pull/9064
* [lexical][lexical-extension][lexical-playground] Refactor: Compiled keyboard shortcut dispatch by @mayrang in https://github.com/facebook/lexical/pull/8876
* [lexical] Bug Fix: restore managed line break in wrapped slot hosts by @luantaraschi in https://github.com/facebook/lexical/pull/9066
* build(deps): bump mermaid from 11.15.0 to 11.16.1 by @dependabot[bot] in https://github.com/facebook/lexical/pull/8980
* [lexical-rich-text] Bug Fix: extend adjacent node selections with Shift+Arrow by @luantaraschi in https://github.com/facebook/lexical/pull/9067
* [lexical] Chore: Fix qs package dependency vulnerability by @vijayojha89 in https://github.com/facebook/lexical/pull/9072
* [lexical-website] Documentation Update: Add Decorators concept guide by @WilliamK112 in https://github.com/facebook/lexical/pull/8696
* [lexical-markdown] Bug Fix: don't prefix a newline when a selection starts below the first block by @luantaraschi in https://github.com/facebook/lexical/pull/8960
* [lexical-table] Bug Fix: disconnect trackTable MutationObserver in removeListeners by @kaminski-dev in https://github.com/facebook/lexical/pull/9074
* [lexical-utils] Bug Fix: objectKlassEquals throws on undefined and prototype-less objects by @nithin42 in https://github.com/facebook/lexical/pull/9079
* [lexical-html] Bug Fix: reject an empty selector group in parseSelector by @luantaraschi in https://github.com/facebook/lexical/pull/9083
* [lexical-list] Feature: opt-in Word list paste overlay by @smrifat1411 in https://github.com/facebook/lexical/pull/9082
* [lexical-link] Bug Fix: read the latest state in LinkNode and AutoLinkNode getters by @nithin42 in https://github.com/facebook/lexical/pull/9080
* [lexical-list] Bug Fix: remove the stale depth theme class when a list changes depth by @nithin42 in https://github.com/facebook/lexical/pull/9077
* [ci] Extract the internal-registry OIDC exchange into a reusable auth action by @zurfyx in https://github.com/facebook/lexical/pull/9084
* [lexical-link] Feature: Tell screen reader users when typing turns text into a link by @Electro-Jam in https://github.com/facebook/lexical/pull/9071
* [ci] Chore: cache Playwright's apt packages and skip WebKit deps on Linux by @etrepum in https://github.com/facebook/lexical/pull/9085
* docs: clarify vanilla quick start path by @alexespinoza28 in https://github.com/facebook/lexical/pull/8801
* [lexical-html][lexical-rich-text][lexical-website] Docs: clarify DOMImportExtension rule evaluation order by @etrepum in https://github.com/facebook/lexical/pull/9089
* [lexical] Feature: build the node with $create when importing JSON by @etrepum in https://github.com/facebook/lexical/pull/9090
* [lexical-code-core][lexical-code-prism][lexical-code-shiki] Bug Fix: code blocks keep the caret and their own attributes by @LeSingh1 in https://github.com/facebook/lexical/pull/9056
* [lexical-compiler][lexical-eslint-plugin-internal] Feature: inject /* @__PURE__ */ annotations at build time by @etrepum in https://github.com/facebook/lexical/pull/9086
* [lexical-playground] Bug Fix: validateUrl no longer accepts a sentence that merely contains a URL by @Om-singhaI in https://github.com/facebook/lexical/pull/9097
* [lexical-markdown] Bug Fix: import a link whose URL contains parentheses by @luantaraschi in https://github.com/facebook/lexical/pull/9093
* [tests] Chore: silence unnecessary stderr warnings in test-unit by @etrepum in https://github.com/facebook/lexical/pull/9098
* [lexical] Bug Fix: Backspace at a soft line-wrap boundary in Firefox by @etrepum in https://github.com/facebook/lexical/pull/9101
* [lexical] Bug Fix: insertNodes no longer leaves an empty paragraph after a block inserted at the end of a paragraph by @Om-singhaI in https://github.com/facebook/lexical/pull/9099
* [lexical-list] Bug Fix: stop throttling rapid mouse clicks on the same checklist checkbox by @noeschmidt in https://github.com/facebook/lexical/pull/9102
* [lexical-react] Bug Fix: Only open the auto embed menu when a bare link is pasted by @Om-singhaI in https://github.com/facebook/lexical/pull/9091
* [lexical-history][lexical-utils][lexical-playground] Bug Fix: overlays, hit targets and shared state at the editor boundary by @LeSingh1 in https://github.com/facebook/lexical/pull/9053
* [lexical-playground] Bug Fix: custom nodes keep the theme classes createDOM applied by @LeSingh1 in https://github.com/facebook/lexical/pull/9049
* [lexical] Bug Fix: insertText no longer throws when the caret is inside a segmented TextNode by @Om-singhaI in https://github.com/facebook/lexical/pull/9104
* [lexical][lexical-rich-text][lexical-utils] Bug Fix: copy and insert keep the original node's state by @LeSingh1 in https://github.com/facebook/lexical/pull/9059
* [lexical-list] Bug Fix: list operations and DOM import/export keep the node's own state by @LeSingh1 in https://github.com/facebook/lexical/pull/9050
* [lexical-rich-text] Bug Fix: forward dropped files when the drop point has no caret by @nithin42 in https://github.com/facebook/lexical/pull/9076
* [lexical-list][lexical-playground] Bug Fix: keep the focus on the editor when a press lands in a check list item's label by @luantaraschi in https://github.com/facebook/lexical/pull/9088
* [lexical-utils] Bug Fix: Prioritize file transfer over text/html when pasting browser-copied images by @VivekJariwala50 in https://github.com/facebook/lexical/pull/8699
* [lexical][lexical-html][lexical-clipboard] Bug Fix: HTML import/export and slot frames carry the whole state by @LeSingh1 in https://github.com/facebook/lexical/pull/9052
* [lexical-yjs][lexical-react] Bug Fix: collab sync gaps between the editor state and the yjs doc by @LeSingh1 in https://github.com/facebook/lexical/pull/9057
* [lexical-link] Bug Fix: open middle-clicked links in a new tab by @nithin42 in https://github.com/facebook/lexical/pull/9078
* [lexical-table][lexical-playground][lexical-rich-text] Bug Fix: table grid indices, cell state and boundary selection by @LeSingh1 in https://github.com/facebook/lexical/pull/9054
* [lexical][lexical-table] Bug Fix: selection and caret state at block and shadow-root boundaries by @LeSingh1 in https://github.com/facebook/lexical/pull/9058
* [lexical-react][lexical-playground] Bug Fix: plugins and hooks re-derive when their inputs change by @LeSingh1 in https://github.com/facebook/lexical/pull/9051
* [lexical-markdown][lexical-mdast] Bug Fix: markdown round trip keeps fenced code and enclosing blocks intact by @LeSingh1 in https://github.com/facebook/lexical/pull/9055
* Add React MathType example by @culpen90 in https://github.com/facebook/lexical/pull/8692
* [lexical-table] Bug Fix: Fix unreliable text cursor placement when tapping table cells on touch devices by @Arman-Luthra in https://github.com/facebook/lexical/pull/8827
* [lexical-yjs][lexical-react] Feature: Allow custom Yjs XmlText by @flaviouk in https://github.com/facebook/lexical/pull/6483
* Upgrade to pnpm 11 by @zurfyx in https://github.com/facebook/lexical/pull/8816
## New Contributors
* @Yjason-K made their first contribution in https://github.com/facebook/lexical/pull/8889
* @arcs- made their first contribution in https://github.com/facebook/lexical/pull/8906
* @corinthionia made their first contribution in https://github.com/facebook/lexical/pull/8909
* @alvorithm made their first contribution in https://github.com/facebook/lexical/pull/8910
* @alphanull made their first contribution in https://github.com/facebook/lexical/pull/8921
* @alex-js-ltd made their first contribution in https://github.com/facebook/lexical/pull/8935
* @luantaraschi made their first contribution in https://github.com/facebook/lexical/pull/8962
* @spokodev made their first contribution in https://github.com/facebook/lexical/pull/8636
* @SujinKim1127 made their first contribution in https://github.com/facebook/lexical/pull/8941
* @Electro-Jam made their first contribution in https://github.com/facebook/lexical/pull/8908
* @WilliamK112 made their first contribution in https://github.com/facebook/lexical/pull/8696
* @kaminski-dev made their first contribution in https://github.com/facebook/lexical/pull/9074
* @nithin42 made their first contribution in https://github.com/facebook/lexical/pull/9079
* @smrifat1411 made their first contribution in https://github.com/facebook/lexical/pull/9082
* @alexespinoza28 made their first contribution in https://github.com/facebook/lexical/pull/8801
* @Om-singhaI made their first contribution in https://github.com/facebook/lexical/pull/9097
* @noeschmidt made their first contribution in https://github.com/facebook/lexical/pull/9102
* @VivekJariwala50 made their first contribution in https://github.com/facebook/lexical/pull/8699
* @culpen90 made their first contribution in https://github.com/facebook/lexical/pull/8692
* @Arman-Luthra made their first contribution in https://github.com/facebook/lexical/pull/8827
* @flaviouk made their first contribution in https://github.com/facebook/lexical/pull/6483
**Full Changelog**: https://github.com/facebook/lexical/compare/v0.49.0...v0.50.0Related Repositories
public-apis/public-apis★ 491,135
A collective list of free APIs
NousResearch/hermes-agent★ 255,963
The agent that grows with you
yt-dlp/yt-dlp★ 200,054
A feature-rich command-line audio/video downloader
microsoft/markitdown★ 191,491
Python tool for converting files and office documents to Markdown.
Significant-Gravitas/AutoGPT★ 187,703
AutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.