NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4968 most downloaded on npm
This package contains misc utilities for Lexical.
Last release 2 days ago
02 Oct 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
5 years old
696 releases · first in 2022
One column per quarter.
v0.52.1-nightly.20261002.0
v0.52.1-nightly.20261002.0
v0.52.1-nightly.20261001.0
v0.52.1-nightly.20261001.0
v0.52.1-nightly.20260930.0
v0.52.1-nightly.20260930.0
v0.52.1-nightly.20260929.0
v0.52.1-nightly.20260929.0
[lexical][lexical-html] Breaking Change: honor $createDOM overrides in default DOM export by @etrepum in #9231
v0.52.0 is an ad-hoc release targeting a few fixes to mobile text input, but carries a number of other updates accumulated in the past week as we move towards Lexical 1.0. We did a pass to modernize the documentation focusing on the latest features. @lexical/mdast now uses one configurable MdastExtension for import and export, headless editors can be built entirely from extensions, and selection notifications have a consistent timing contract. There are also fixes for deletion, horizontal caret scrolling, drag-and-drop and mobile input.
lexical — SELECTION_CHANGE_COMMAND consistently runs before DOM reconciliation, inside the pending writable update. This includes automatic NodeSelection and TableSelection notifications that previously ran after reconciliation. $getSelection() returns the pending selection; $getPreviousSelection() returns the last committed selection. Eligible programmatic changes now notify without waiting for a native selectionchange event. Listener edits join the same commit, and handlers that change the selection must converge. A listener that throws can now abort the whole pending update, including the edit that triggered the notification, and listeners inherit that update's tags, so content edits made during a COLLABORATION_TAG or HISTORIC_TAG update are not synced to Yjs peers. Move DOM-dependent work such as element lookup, focus checks and floating UI positioning into $onUpdate(() => editor.read('latest', () => { /* ... */ })), reading selection and nodes inside that callback. Use registerUpdateListener for UI that must respond to every commit, including content-only changes (#9219, selection timing guide)lexical / @lexical/html — Default HTML export now honors DOMRenderExtension $createDOM overrides. This affects nodes that inherit LexicalNode.exportDOM or call super.exportDOM(editor), including text and paragraphs. If an override was intended only for the live editor, review the HTML it now exports. Custom exportDOM implementations that create their own elements can still bypass this hook; $updateDOM and $decorateDOM remain reconciliation-only, and $exportDOM handles export-specific changes (#9231)lexical — LexicalNode.getCommonAncestor is removed. Use $getCommonAncestor(a, b)?.commonAncestor ?? null. This is not quite a direct substitution: the removed method first replaced non-element arguments with their parents, while the function compares the supplied nodes and can return a text node when both arguments are that node. Pass the parents of non-element nodes if you need the old behavior, and use type guards instead of the old unchecked generic type argument (#9238)@lexical/mdast — MdastImportExtension and MdastExportExtension are deprecated aliases of MdastExtension. Move configuration to MdastExtension and replace MdastImportExtensionOutput / MdastExportExtensionOutput with MdastExtensionOutput. The package is experimental, and these aliases are intended to remain for only one release (#9198)@lexical/mdast — Unified Markdown configuration and inherited export rules. MdastExtension owns both import and export, and feature extensions include it automatically. Export rules accept a node class or type string and apply to subclasses, with more specific rules taking precedence. A TextNode rule can therefore handle tabs and custom text subclasses without separate registrations (#9198)@lexical/mdast — Import/export middleware through context.next(). Delegate conversion of the same node to the remaining handlers, then return or modify their output. Export chains try remaining same-type rules before ancestor rules. Use context.next() to delegate: null retains its existing meaning of default export or omitted import, while [] omits content in either direction. Formatted text from middleware participates in text merging; custom structure or metadata is preserved as-is (#9198)@lexical/headless — HeadlessExtension works with buildEditorFromExtensions for server-side processing and tests. It marks the editor as headless and prevents attaching a DOM root. Unlike createHeadlessEditor, it keeps listener registration methods available, so extensions that register root listeners can still be used (#9249)Selection & editing
scroll-padding, with updated playground styling to keep the caret clear of the code gutter (#9215)Mobile input & recovery
setEditorState with a childless root warns and recovers to an empty paragraph in production. Development builds still report the invalid state through onError (#9183)Performance & signals
@lexical/extension raises its @preact/signals-core dependency to ^1.14.4, fixing stale computed values after a batch changes a signal and restores its original value (#9248)Playground & docs
$config schemas, NodeState, and HTML import/export through extensions (#9237)Full Changelog: v0.51.0...v0.52.0
v0.51.1-nightly.20260928.0
v0.51.1-nightly.20260928.0
v0.51.1-nightly.20260925.0
v0.51.1-nightly.20260925.0
v0.51.1-nightly.20260924.0
v0.51.1-nightly.20260924.0
v0.51.1-nightly.20260923.0
v0.51.1-nightly.20260923.0
v0.51.1-nightly.20260922.0
v0.51.1-nightly.20260922.0
v0.51.1-nightly.20260921.0
v0.51.1-nightly.20260921.0
v0.51.1-nightly.20260918.0
v0.51.1-nightly.20260918.0
[*] Breaking change: Publish ESM only to npm and keep the CommonJS build for www by @etrepum in #9127
v0.51.0 is a monthly release with one large new feature: nodes can now declare their JSON serialization as a schema on $config. This declarative schema is faster, safer, and more flexible than the hand-written methods. The metadata it provides enables a compact export option with all default values elided, the code generator that provides faster import and export for every node that lexical ships, a new @lexical/fast-check package for property-based tests, and it provides a path to future features that rely on knowing the structure of the nodes (e.g. additional codecs and dev tools).
This is a big step towards Lexical 1.0, the next few releases are expected to be focused on moving everything (including docs and examples) to the latest Extension and $config APIs and removing deprecated functionality. Two related changes in this release are that we are publishing ESM-only to npm now (cjs builds are still supported in the source tree), and LexicalComposer is deprecated for LexicalExtensionComposer. Expect anything @deprecated to be removed soon.
"type": "module" and its exports map offers development / production / default conditions with no require branch; the CommonJS build remains in-tree only for Meta's www. Bundlers are unaffected. CommonJS code can require() the packages on Node.js 20.19+ (the builds have no top-level await), and older Node.js must use await import(...) — but a dependency the app also loads through require() can then exist twice, which breaks handing its objects to Lexical (yjs docs to @lexical/yjs, @preact/signals-core signals from @lexical/extension), so load those as ESM too. Metro bundles both builds unless you add the condition for Lexical's packages; see the module formats FAQ (#9127)lexical — exportJSON may serialize the instance as-is. A property declared with withField is read straight off the node instead of through its accessor, so exportJSON no longer resolves getLatest() for you and a stale reference can write stale values (and a property whose accessor a subclass overrode still resolves, so one object can mix the two). Nothing inside Lexical is affected — the walk, the clipboard selection export and editorState.toJSON() all start from the node map — but call getLatest() yourself on a reference you kept across a mutation (#8602)@lexical/code — the deprecated Prism re-exports are gone, along with the @lexical/code-prism dependency (so Prism no longer lands in a bundle that only imports @lexical/code). Import CODE_LANGUAGE_FRIENDLY_NAME_MAP, CODE_LANGUAGE_MAP, getCodeLanguageOptions, getCodeLanguages, getCodeThemeOptions, getLanguageFriendlyName, normalizeCodeLanguage (formerly also normalizeCodeLang), PrismTokenizer and registerCodeHighlighting from @lexical/code-prism (#9141)@lexical/react — LexicalComposer is deprecated in favor of LexicalExtensionComposer and is expected to be removed in a future major. LexicalComposer cannot accept extensions, so any feature shipped as one is unreachable from an editor it builds; the migration is usually a two-line change (#9168, React extensions guide)lexical — Declarative serialization schemas (experimental). A node that uses $config declares its serialized properties once in the new json property, and that single declaration drives importJSON, updateFromJSON and exportJSON: nodeSchema, withField / withAccessors, and the value combinators (stringValue, numberValue, booleanValue, enumValue, arrayValue, objectValue, unionValue, rawValue, transformValue, nullable, optional, …). Every built-in node declares one, and most custom nodes now need no JSON serialization code at all. Output is unchanged by default (#8602, serialization docs).lexical — Compact JSON export, opt-in via editorState.toJSON(true) or $withCompactExport(true, cb) (with $isCompactExport() for schema getters, plus $exportNodeJSON and the CompactSerializedEditorState / ParsableSerializedEditorState / LexicalParseJSON / SerializedPartial types). It omits properties equal to their schema default, properties the parser derives, and the deprecated version. The raw objects are well under half the legacy size — which matters for structured clones and worker messages — but after gzip the two are a wash. Both forms parse back to the same document; only a Lexical new enough to know the schemas can read the compact one, so keep writing the legacy form until every reader is upgraded (#8602)@lexical/compiler — Generated serialization code. Every built-in node class ships straight-line serialization generated from its own schema at build time, producing byte-identical JSON to the schema-driven path that continues to serve custom nodes (#8602)@lexical/fast-check — New package deriving fast-check arbitraries from those schemas: nodeArbitrary(NodeClass) generates exactly the serialized JSON a node's parser accepts, each property independently present or absent. Useful for the bugs fixtures hide, such as a property afterCloneFrom forgot to copy. fast-check is a peer dependency; getComposedSchemaFields in core inspects a class's schema without generating anything (#8602)@lexical/extension — Published as subpath exports, one entry per extension (@lexical/extension/AutoFocusExtension, …), with compiler and lint enforcement of the source import convention. The barrel import is unchanged, and shared modules such as signals keep a single instance (#9161). This is primarily only useful as a consumer if you are not using tree-shaking.Bundling, tree-shaking & types
createCommand no longer retains the editor (#9121), and the remaining module-scope side effects that defeated tree-shaking are gone, with a bare-import residue check now run over every entry (#9124); extension editors build under loose-mode transpilation (#9134)defineExtension was uncallable, making the extension types unusable (#9132); declarations can now express an extension with dependencies (#9176); modern variance keywords survive into the www stubs (#9154)Selection & editing
TextNode.setMode, setTextContent and isSimpleText read the latest state (#9162); $removeTextFromCaretRange no longer leaves a childless list or table as the root's only child (#9116); a text entity keeps the style and detail of the text it replaces (#9130); selection overlay listeners are notified when rectangles are removed (#9117)Lists, tables & Markdown
$mergeCells no longer keeps the empty paragraph of the target cell (#9122); text left outside a Markdown link keeps its format (#9131)Playground & docs
Plus the usual dependency updates across the rollup, shikijs, vitest, docusaurus/typedoc and flow/hermes groups.
Full Changelog: v0.50.0...v0.51.0
v0.50.1-nightly.20260917.0
v0.50.1-nightly.20260917.0
v0.50.1-nightly.20260916.0
v0.50.1-nightly.20260916.0
v0.50.1-nightly.20260915.0
v0.50.1-nightly.20260915.0
v0.50.1-nightly.20260914.0
v0.50.1-nightly.20260914.0
v0.50.1-nightly.20260911.0
v0.50.1-nightly.20260911.0
v0.50.1-nightly.20260910.0
v0.50.1-nightly.20260910.0
v0.50.1-nightly.20260909.0
v0.50.1-nightly.20260909.0
v0.50.1-nightly.20260908.0
v0.50.1-nightly.20260908.0
v0.50.1-nightly.20260907.0
v0.50.1-nightly.20260907.0
v0.50.1-nightly.20260904.0
v0.50.1-nightly.20260904.0
v0.50.1-nightly.20260903.0
v0.50.1-nightly.20260903.0
…reusable action ( #9084 ), fixed a qs dependency vulnerability ( #9072 ), quieted stderr noise in test-unit ( #9098 ) and moved the playground onto ow…
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 package). We have upgraded to pnpm 11, so if you're working directly with the monorepo you will need to upgrade as well.
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, #8905, #8901)@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)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.
<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)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, #9071)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)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, #9090)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)@lexical/yjs no longer syncs root textFormat/textStyle (#8940); Markdown import restructures nested mixed-type lists and stores fence metadata in a new mdCodeMeta node state (#8283)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) now throw instead of failing laterlexical — 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)@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)@lexical/extension — HMRExtension (with HMRConfig, HMROutput, HotContext) keeps an editor alive across hot module replacement. @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)lexical / @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)@lexical/rich-text — HeadingAnnounceExtension announces heading changes to screen readers, on by default in RichTextExtension; @lexical/link's AutoLinkAnnounceExtension does the same when typing turns text into a link, on by default with AutoLinkExtension (#8908, #9071)@lexical/list — Opt-in WordListImportExtension reconstructs list structure from Microsoft Word HTML (MsoListParagraph classes and mso-list metadata) on paste (#9082)@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, #8699)@lexical/yjs — CreateBindingV2Options__EXPERIMENTAL allows a custom Yjs XmlText, so a Lexical document can live inside a larger shared type (#6483)lexical — New $getSelectionSlotFrame (#9052) and $flushSyncAfterUpdate (#9067) exports; $isBlockFullySelected moved into core and is still re-exported from @lexical/utils (#9059); @lexical/table now exports the TableCellHeaderState type (#9038); JSDoc added across the core exports (#8895)Named slots & the node tree
replace() keeps the parent's __size correct when handed a sibling (#8917), and splice no longer creates a sibling cycle when it re-inserts a node after the range (#8916)Node state, copy/paste & serialization
EditorState.clone() keeps _parsed (#8989), AutoLinkNode.insertNewAfter keeps its properties (#8996), a split heading keeps its format and style (#8926), split lists continue numbering from the item's value (#8913), and in the playground the Excalidraw drawing and size survive a clone (#8984), a closed collapsible no longer exports as open (#8994), mention nodes keep their display text (#8999), custom nodes keep the theme classes createDOM applied (#9049) and an unparseable data-lexical-datetime no longer breaks serialization (#9047)Selection & editing
$extendCaretToRange's focus is a real, flippable position (#8930); Shift+Arrow extends adjacent node selections (#9067); clicking inside a selected node no longer deselects it (#8910)insertNodes no longer leaves an empty paragraph after a block inserted at the end of a paragraph (#9099); insertText no longer throws when the caret is inside a segmented TextNode (#9104); Backspace works at a soft line-wrap boundary in Firefox (#9101); Enter on iOS no longer moves the caret past the acceptance boundary (#8941); iPadOS desktop-class user agents are detected (#8909); dropped files are forwarded when the drop point has no caret (#9076); clear-formatting resets the cached selection format (#8889)Tables & lists
colSpan (#8911); importDOM imports the dir attribute (#8914); toggleHeaderStyle stays inside TableCellHeaderStates (#9038); the trackTable MutationObserver is disconnected in removeListeners (#9074); text cursor placement is reliable when tapping cells on touch devices (#8827)Links, Markdown & HTML
TOGGLE_LINK_COMMAND's object payload no longer discards the configured attributes (#8985); $toggleLink applies the title attribute for a NodeSelection (#8993); LinkNode/AutoLinkNode getters read the latest state (#9080); middle-clicked links open in a new tab (#9078); the auto embed menu only opens when a bare link is pasted (#9091); the playground's validateUrl no longer accepts a sentence that merely contains a URL (#9097)exportDOM returning a DocumentFragment applies its after() replacement (#8997); parseSelector rejects an empty selector group (#9083); Prism language maps are read as own properties (#8981); a function-valued style patch is applied once to an empty element (#8912); objectKlassEquals no longer throws on undefined or prototype-less objects (#9079)React, collaboration & history
Placeholder uses the SSR-safe useLayoutEffect (#8906); the typeahead query updates during IME composition (#8942); plugins and hooks re-derive when their inputs change (#9051); focus is restored after dragging decorator blocks (#9064); multiple clicks are normalized (#8928)shouldBootstrap is documented as at-most-one-client (#9107); SharedHistoryExtension forwards the parent maxDepth (#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)Docs & tooling
DOMImportExtension rule evaluation order (#9089), SKIP_DOM_SELECTION_TAG behavior during the initial editor state (#8636) and $reverseDfs (#8962), plus an OpenGraph social preview for the website (#8935)qs dependency vulnerability (#9072), quieted stderr noise in test-unit (#9098) and moved the playground onto ownerDocument/$getDocument() for shadow DOM safety (#8878)Note truncated.
v0.49.1-nightly.20260902.0
v0.49.1-nightly.20260902.0
v0.49.1-nightly.20260901.0
v0.49.1-nightly.20260901.0
v0.49.1-nightly.20260831.0
v0.49.1-nightly.20260831.0
v0.49.1-nightly.20260828.0
v0.49.1-nightly.20260828.0
v0.49.1-nightly.20260827.0
v0.49.1-nightly.20260827.0
v0.49.1-nightly.20260826.0
v0.49.1-nightly.20260826.0
v0.49.1-nightly.20260825.0
v0.49.1-nightly.20260825.0
v0.49.1-nightly.20260824.0
v0.49.1-nightly.20260824.0
v0.49.1-nightly.20260821.0
v0.49.1-nightly.20260821.0
v0.49.1-nightly.20260820.0
v0.49.1-nightly.20260820.0
v0.49.1-nightly.20260819.0
v0.49.1-nightly.20260819.0
v0.49.1-nightly.20260818.0
v0.49.1-nightly.20260818.0
v0.49.1-nightly.20260817.0
v0.49.1-nightly.20260817.0
v0.49.1-nightly.20260814.0
v0.49.1-nightly.20260814.0
v0.49.1-nightly.20260813.0
v0.49.1-nightly.20260813.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
…for Lexical's built-in node classes (#8640), a breaking change that replaces per-node getType()/clone()/importJSON()/importDOM()/transform() boilerpla…
v0.49.0 is a monthly release headlined by the completion of the $config() protocol migration for Lexical's built-in node classes (#8640), a breaking change that replaces per-node getType()/clone()/importJSON()/importDOM()/transform() boilerplate with runtime-synthesized behavior. It ships with a cluster of follow-up fixes hardening the synthesized getType() and clone() (including a stack overflow in compiled builds), an opt-in sticky horizontal scrollbar for overflowing tables, and a broad batch of fixes across tables, Markdown, HTML, code highlighting, and selection.
lexical — Built-in node classes are ported to the $config() protocol. The static importJSON(), importDOM(), clone(), and transform() methods are no longer present on ported nodes; use the higher-level equivalents instead (LexicalEditor.parseEditorState/$generateNodesFromDOM, the $cloneWithProperties helper, and extensions or $transform in $config). getType() is unchanged and safe to keep using, __type is now readonly, and node constructors require zero-argument defaults. Custom nodes may keep their static methods, but adopting $config() is recommended (#8640)lexical — LexicalCommand<T>'s payload type is now invariant to prevent unsafe structural compatibility between commands. Previously correct code (including explicit generics) needs no changes; only unsafe LexicalCommand<unknown> usage must switch to the newly exported AnyLexicalCommand alias. dispatchCommand's payload argument is now optional when a command's payload type is undefined or void, and redundant explicit type parameters were dropped from the registerCommand/registerNodeTransform call sites (#8877)@lexical/table — Opt-in sticky horizontal scrollbar for tables wider than their container, so the scrollbar stays anchored at the viewport bottom instead of only being reachable at the end of the table. Enable it with hasStickyScrollbar: true in the table config; style it via the new tableStickyScrollbar theme key (#8790)@lexical/table — The <colgroup> element is now omitted from the table DOM when column widths are undefined, producing cleaner markup and letting the browser auto-size columns; it is created or removed dynamically as widths change (#8850)lexical — Added an editor operation benchmark suite (paragraph split, bold formatting, range deletion, paste, select-all format) measured through full DOM reconciliation, to help contributors track core editing performance (#8856)@lexical/table — $createTableSelection is deprecated in favor of $createTableSelectionFrom, which takes the table node plus anchor/focus cells and validates them, instead of returning a blank selection with placeholder 'root' keys that must be overwritten (#8855)@lexical/table — getShape() is deprecated because it computes incorrect bounds for merged cells; use the now-exported $computeTableCellRectBoundary (with $computeTableMap) instead (#8853)$config() follow-ups (#8640)
clone() now applies afterCloneFrom() when called directly (e.g. NodeClass.clone(node)), fixing silent property loss across 25+ core nodes (#8864)getType() no longer returns the superclass type when inherited, fixing node-type collisions during editor registration (#8867)getType() no longer recurses infinitely when a bundler copies it onto a subclass as an own static, fixing stack overflows in compiled/minified builds (#8869)Tables
DELETE_LINE_COMMAND (Cmd/Ctrl-based delete-line shortcuts) now works inside table cells instead of being silently swallowed (#8851)Selection & editing
editor.read()) now run in a fresh writable update instead of being silently dropped, with a dev warning (#8863)Markdown, HTML & code
p, .foo) against all elements instead of only tag-matched ones (#8873)QuoteNode.updateDOM now accepts the EditorConfig argument the reconciler passes to every other node, for API consistency (#8882)Playground & website
Full Changelog: v0.48.0...v0.49.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →