Skip to content

Releases: facebook/lexical

v0.33.1

10 Jul 23:17
Compare
Choose a tag to compare

This is a patch release with a fix for the new $config flat NodeState API

Highlights

Core

  • #7683 Implement missing updateJSON support for $config flat NodeState
  • 🆕 #5829 RangeSelection.setFormat setter

What's Changed

  • v0.33.0 by @etrepum in #7672
  • [lexical-link] Chore: Fix test names by @noamzaks in #7666
  • Add a setter for the format property on RangeSelection by @HyperVS in #5829
  • [lexical] Bug Fix: Implement missing deserialization for flat $config NodeState by @etrepum in #7683

New Contributors

Full Changelog: v0.33.0...v0.33.1

v0.33.0

04 Jul 02:07
Compare
Choose a tag to compare

This is a monthly release with some major new features and lots of bug fixes

Breaking Changes

$copyNode(prevNode) now calls node.afterCloneFrom(prevNode) #7609

If you have code that assumes that newNode.afterCloneFrom(prevNode) will not be called as a result of $copyNode(prevNode), and would no longer work if it was, then it will need some refactoring. This is a very unlikely scenario.

role no longer removed from readonly LexicalContentEditableElement #7647

The role attribute is no longer removed from readonly LexicalContentEditableElement for better accessibility compliance. This may require application and/or CSS changes in rare cases.

New APIs

$config protocol #7258

There's a new protocol for creating new node classes, that's more concise, automatically generates the boilerplate for the static methods (getType, clone, importJSON) and has additional features for NodeState.

See the Creating custom nodes with $config and NodeState documentation.

Highlights

Core

  • 🆕 #7258 $config protocol + NodeState registration/flattening (also #7659 #7661 #7667 #7671)
  • #7641 Copy NodeState in TextNode.splitText
  • #7654 Allow the same mutation listener function to be registered to multiple nodes

Clipboard

  • 🆕 #7657 Inherit the style of the last pasted TextNode in the block after pasting rich text

Code

  • 🆕 #7613 Code diff highlighting

Devtools

  • 🆕 #7642 Add NodeState to TreeView

List

  • 🆕 #7638 Add a command to change an ordered list's start number
  • #7655 Make tap target for checklists bugger for touch input

React

  • #7633 Make ref types mutable
  • #7644 Handle DraggableBlockPlugin in scrollable editors
  • #7647 Do not remove role from read-only LexicalContentEditableElement
  • #7669 Fix an issue with dangling div portals with non-empty style in LexicalMenu (regressed in v0.25)

Table

  • #7637 Ignore SELECTION_INSERT_CLIPBOARD_NODES_COMMAND dispatched from child editors
  • #7656 Table selection now only occurs when dragging on touch devices

Playground

  • #7627 Update alignment state for image selection
  • #7636 Allow deleting an empty column layout via backspace
  • #7670 Close FloatingLinkEditor popup when user clicks out of it

What's Changed

  • v0.32.1 by @etrepum in #7605
  • [lexical][Breaking Change] Bug Fix: Change $copyNode to use afterCloneFrom by @etrepum in #7609
  • [lexical-react] Chore: Remove confusing return value by @eliottvincent in #7607
  • [lexical-code][lexical-markdown][lexical-playground] Feature: Add code diff highlighting by @jeromew in #7613
  • [lexical-devtools-core] Bug Fix: Allow CustomPrintNodeFn to return undefined by @achaljhawar in #7619
  • [lexical-playground] Bug Fix: Update alignment state for image selection by @kirandash in #7627
  • Add in favor for to deprecated tag by @sofiane-dj in #7634
  • [lexical-react] Chore: make ref types mutable by @findoo in #7633
  • [lexical-headless-test] Enhance navigator environment check with object type and structure validation by @0xobedient in #7626
  • Feature: $config protocol + NodeState registration/flattening by @etrepum in #7258
  • [Lexical]Refactor: Change UnionToIntersection flow type by @lilshady in #7643
  • [lexical-table] Bug Fix: Ignore SELECTION_INSERT_CLIPBOARD_NODES_COMMAND dispatched from child editors by @etrepum in #7637
  • [lexical] Bug Fix: copy NodeState when splitting text nodes by @randal-atticus in #7641
  • [lexical-devtools-core] Chore: add NodeState to TreeView by @randal-atticus in #7642
  • [lexical-react] Bug Fix: handle DraggableBlockPlugin in scrollable editors by @randal-atticus in #7644
  • [lexical-playground] Bug Fix: Allow deleting empty column layouts via backspace by @Lakshmanshankar in #7636
  • [lexical] Bug Fix: allow same mutation listener fn to be registered to multiple nodes by @james-atticus in #7654
  • [lexical-playground] [lexical-list] add ability to change ordered list start number by @achaljhawar in #7638
  • [lexical] Bug Fix: Workarounds in $config protocol for loose inheritance by @etrepum in #7659
  • [lexical-react] Bug Fix: aria-prohibited-attr violation on LexicalContentEditableElement by @so99ynoodles in #7647
  • [lexical-website] Documentation Update: Update some doc links by @lilshady in #7660
  • [lexical] Bug Fix: Workarounds for import json by @lilshady in #7661
  • [lexical-website] Chore: Fix typo in transforms by @noamzaks in #7664
  • [lexical-list] Bug Fix: Make tap target for checklists bigger so touch inputs register by @circlingthesun in #7655
  • [lexical-clipboard] Inherit style when typing after pasting rich text by @achaljhawar in #7657
  • [lexical-table] Bug Fix: Fix table selection for touch devices by @circlingthesun in #7656
  • [lexical-playground] Chore: Fix AutocompleteNode importDOM warning by @etrepum in #7667
  • [lexical-react] Bug Fix: LexicalMenu position menu immediately regression by @etrepum in #7669
  • [lexical-playground] fix: close link popup when user clicks out of it by @achaljhawar in #7670
  • [lexical] Bug Fix: LexicalNode.getType() fallback to $config protocol by @etrepum in #7671

New Contributors

Full Changelog: v0.32.1...v0.33.0

v0.32.1

04 Jun 23:36
Compare
Choose a tag to compare

This is an ad-hoc patch release to include #7602 - which fixes an issue that could corrupt a document if a TabNode was at the anchor or focus of a selection when text is inserted under certain circumstances.

Highlights

Core

  • #7602 Treat all TabNode as if they are in token mode
  • #7579 Firefox now handles Select All (Ctrl+A) the same way as other browsers

What's Changed

  • [Monthly Release] v0.32.0 by @lilshady in #7599
  • [lexical][lexical-selection] Bug Fix: Treat all TabNode as if they are in token mode by @etrepum in #7602
  • [scripts] update next version in lexical-esm-nextjs by @lilshady in #7604
  • [tests] Chore: Update table test to use locator API instead of page.evaluate by @etrepum in #7603
  • [lexical] Fix: ctrl+a doesn't work well in plain text mode on Firefox by @wataru-chocola in #7579

New Contributors

Full Changelog: v0.32.0...v0.32.1

v0.32.0

03 Jun 05:18
Compare
Choose a tag to compare

Highlights

Core

  • #7544 2 Tabs on single line selection should indent
  • 🆕 #7573 Feature: Improve Tab/Indent/Outdent to match VSCode
  • #7568 unbulleting an image doesn't work #5698 ([lexical-selection][lexical-playground])
  • 🆕 #7593 Type: Add flow export type for LexicalUpdateTags

Playground

  • #7556 Change list, strikethrough and quoteblock shortcuts to match Google Docs for Windows compatibility
  • #7545 Support Apple Pencil
  • 🆕 #7567 Chore: source command priority from package
  • #7572 Preserve row striping in frozen table columns
  • #7568 unbulleting an image doesn't work #5698
  • #7558 Made checklist icon fully scalable, clickable, and properly spaced at large font sizes
  • 🆕 #7590 Refactor: simplify ExcalidrawModal
  • 🆕 #7509 FloatingUI Context Menu
  • 🆕 #7596 Chore: source command priority from package

Markdown

  • #7560 Link Transformer URL Protocol Han…
  • #7564 Prevent transform from removing nodes if the replace function returns false
  • #7594 Don't select nodes when importing

React

  • #7589 page freezes when typing a link in an overflow area
  • 🆕 #7584 Feature: allow whitespaces in search keyword in useBasicTypeaheadTriggerMatch

Website

  • #7569 fix documentation typos
  • #7574 Fix docusaurus build by adding removeLegacyPostBuildHeadAttribute flag

What's Changed

  • v0.31.2 by @etrepum in #7550
  • Revert "[lexical-markdown] Bug Fix: Link Transformer URL Protocol Han… by @zurfyx in #7560
  • [lexical-playground] Bug Fix: Change list, strikethrough and quoteblock shortcuts to match Google Docs for Windows compatibility by @harshmetkel24 in #7556
  • [lexical-code] Bug Fix: 2 Tabs on single line selection should indent by @jeromew in #7544
  • [lexical-list] Bug Fix: Removed the hardcoded checkbox width in checklist onclick helper by @jvithlani in #7559
  • [lexical][lexical-playground] Bug Fix: Support Apple Pencil by @circlingthesun in #7545
  • [lexical-markdown] Bug fix: Prevent transform from removing nodes if the replace function returns false by @rodrigomotion in #7564
  • [lexical-website] Chore: fix documentation typos by @noritaka1166 in #7569
  • [lexical-playground] Chore: source command priority from package by @eliottvincent in #7567
  • [lexical-playground] Bug Fix: Preserve row striping in frozen table columns by @kirandash in #7572
  • [Update] Fix docusaurus build by adding removeLegacyPostBuildHeadAttribute flag by @lilshady in #7574
  • [lexical-selection][lexical-playground] Bug Fix: unbulleting an image doesn't work #5698 by @kamilpitula in #7568
  • [lexical-playground][lexical-list] Bug Fix: Made checklist icon fully scalable, clickable, and properly spaced at large font sizes by @swrsaini in #7558
  • [lexical-table] Bug Fix: error when deleting multiple rows with merged row cells by @kamilpitula in #7582
  • [lexical-link] Feature: Move URL formatting from #7499 to LinkNode sanitizeUrl by @etrepum in #7585
  • [lexical-react][lexical-playground] FloatingUI Context Menu by @ivailop7 in #7509
  • [lexical-playground] Refactor: simplify ExcalidrawModal by @thorn0 in #7590
  • [lexical-react] Bug Fix: page freezes when typing a link in an overflow area by @kamilpitula in #7589
  • [lexical-react][lexical-playground] Feature: allow whitespaces in search keyword in useBasicTypeaheadTriggerMatch by @harshmetkel24 in #7584
  • [lexical-code] Feature: Improve Tab/Indent/Outdent to match VSCode by @jeromew in #7573
  • [Lexical] Type: Add flow export type for LexicalUpdateTags by @ttzztztz in #7593
  • [lexical-playground][lexical-rich-text][lexical-website][tests][examples] Chore: source command priority from package by @eliottvincent in #7596
  • [lexical-markdown] Bug Fix: Don't select nodes when importing by @juusolain in #7594

New Contributors

Full Changelog: v0.31.2...v0.32.0

v0.31.2

20 May 20:07
Compare
Choose a tag to compare

Patch release for #7549, this is a bug fix release

Highlights

Core:

  • #7549 Fix infinite loop in indexPath
  • #7536 Do not export empty textAlign styles

Code:

  • #7538 Allow code highlighter to be used in headless mode

Markdown:

  • #7539 Do not export auto-link nodes

Playground:

  • #7534 Use babel MatchPatterns that work correctly on Windows

What's Changed

  • v0.31.1 by @etrepum in #7525
  • [lexical-playground] Bug Fix: Use babel MatchPatterns that work correctly on windows by @etrepum in #7534
  • [lexical-website] Chore: Update docusaurus-plugin-internaldocs-fb and reorg serialization docs by @etrepum in #7533
  • [lexical] Bug Fix : Prevent from adding element.style.textAlign when formatType is unset by @baptistejamin in #7536
  • [lexical-code] Bug Fix: Allow Code Highlighter to be working in headless mode by @baptistejamin in #7538
  • [lexical-markdown]: Bug fix: Do not export auto-link nodes by @baptistejamin in #7539
  • [lexical] Bug Fix: Fix loop in indexPath by @etrepum in #7549

New Contributors

Full Changelog: v0.31.1...v0.31.2

v0.31.1

11 May 22:58
Compare
Choose a tag to compare

This is a patch release primarily to address a dev tools build regression (#7522)

Highlights

Rich Text

  • #7516 Backspace now only dedents at the start of first descendant of an indented block

List

  • #7504 Marker styles are now inherited on indent

Markdown

  • #7499 Link transformer now explicitly adds a protocol to URLs

React

  • 🆕 #7520 useBasicTypeaheadTriggerMatch punctuation regex fragment is now configurable

Table

  • #7498 TableNode DOM import now supports frozen rows and columns

Playground

  • #7506 LexicalTypeaheadMenuPlugin is now positioned correctly when scrolled
  • #7508 Change text capitalization keyboard shortcuts on macOS to avoid conflicts
  • #7520 Emoji typeahead search now permits underscore and dashes

Dev Tools

  • #7522 Vite configuration fix for devtools build

Docs

  • 🆕 #7294 New NodeState documentation and example

What's Changed

  • Monthly Release: v0.31.0 by @lilshady in #7502
  • [lexical-table] Bug Fix: Add missing DOM import for TableNode frozen rows and columns by @Iaotle in #7498
  • [lexical-markdown] Bug Fix: Link Transformer URL Protocol Handling by @AashishRichhariya in #7499
  • [lexical-list] Bug Fix: Inherit marker styles when indenting list items by @kirandash in #7504
  • [lexical-playground] Bug Fix: LexicalTypeaheadMenuPlugin Positioning When Scrolled by @AashishRichhariya in #7506
  • [lexical][lexical-website] Documentation: Start on NodeState docs and examples by @etrepum in #7294
  • [lexical-rich-text] Bug Fix: Backspace should only dedent at first descendant of indented block by @etrepum in #7516
  • [lexical-playground] Bug Fix: capitalize shortcut not working in macos fix by @harshmetkel24 in #7508
  • [lexical-react][lexical-playground] Bug Fix: Make typeahead punctuation configurable; allow underscores and dashes in emoji queries by @kirandash in #7520
  • [lexical-devtools] Bug Fix: Update devtools vite config for process.env.LEXICAL_VERSION by @etrepum in #7522

New Contributors

Full Changelog: v0.31.0...v0.31.1

v0.31.0

30 Apr 07:16
Compare
Choose a tag to compare

Highlights

Core

  • #7439 Correct caret movement in vertical-rl writing mode
  • #7450 Migrate string literals to update tag constants
  • #7471 Chore: Update sveltejs dependency
  • #7479 Revert Enter command to use inexact matching
  • #7481 Update KEY_ENTER_COMMAND API docs
    Website
  • 🆕 #7442 Improve createCommand developer experience
  • 🆕 #7441 Document and export common update tags
  • 🆕 #7448 Documentation Update: Add detailed guides for key and clone concepts

Playground

  • 🆕 #7464 Add keyboard shortcut for comments
  • #7462 Stabilize text format dropdown width in toolbar
  • #7478 Disable flaky "Can expand table to fit content when pasting table into table" in collab
  • 🆕 #7482 Refactor autolink tests for reliability

React

  • 🆕 #7477 Make check for entity boundary configurable in LexicalTypeaheadMenuPlugin
  • #7488 Re-render tables when the hasHorizontalScroll setting is changed
  • #7486 Support custom cursor sync in CollaborationPlugin

Collab

  • 🆕 #7453 Simplify removeFromParent internal operations

Table

  • #7447 Handle backspace deletion of tables with merged cells

Markdown

  • #7476 Add import support for backslash escape sequences

What's Changed

  • v0.30.0 by @etrepum in #7440
  • [lexical][lexical-website] Feature: Improve createCommand developer experience by @kirandash in #7442
  • [lexical][lexical-website] Feature: Document and export common update tags by @kirandash in #7441
  • [lexical-selection] Bug Fix: Correct caret movement in vertical-rl writing mode by @kirandash in #7439
  • [lexical-table][lexical-playground] Bug Fix: Handle backspace deletion of tables with merged cells by @kirandash in #7447
  • Chore: migrate string literals to update tag constants by @kirandash in #7450
  • [lexical-playground] fix: clarify EquationComponent inputRef type by @navidmafi in #7460
  • [lexical] Chore: Update internalMarkNodeAsDirty TODO comment by @kirandash in #7457
  • [lexical-playground] Feature: Add keyboard shortcut for comments by @kirandash in #7464
  • [lexical-playground] Bug Fix: Stabilize text format dropdown width in toolbar by @kirandash in #7462
  • [lexical-yjs][lexical] Refactor: Simplify removeFromParent internal operations by @kirandash in #7453
  • Chore: Update sveltejs dependency by @Garvit244 in #7471
  • [lexical] Bug Fix exact modifier matching for built-in keyboard shortcuts by @10tacion in #7443
  • [lexical][lexical-playground] Chore: Deprecate KEY_MODIFIER_COMMAND and use KEY_DOWN_COMMAND for playground shortcuts by @etrepum in #7472
  • [lexical-markdown] Bug Fix: Add import support for backslash escape sequences by @etrepum in #7476
  • [lexical-playground] Chore: Disable flaky "Can expand table to fit content when pasting table into table" in collab by @etrepum in #7478
  • [lexical] Chore: Revert Enter command to use inexact matching by @takuyakanbr in #7479
  • [lexical] Chore: Update KEY_ENTER_COMMAND API docs by @etrepum in #7481
  • [lexical-playground] Chore: Refactor autolink tests for reliability by @etrepum in #7482
  • [lexical-react] Feature: make check for entity boundary configurable in LexicalTypeaheadMenuPlugin by @asevich in #7477
  • [lexical-website] Documentation Update: Add detailed guides for key and clone concepts by @kirandash in #7448
  • [lexical-react][lexical-table] Bug Fix: Re-render tables when the hasHorizontalScroll setting is changed by @etrepum in #7488
  • [lexical-react][lexical-yjs] Feature: Support custom cursor sync in CollaborationPlugin by @simonecervini in #7486

New Contributors

Full Changelog: v0.30.0...v0.31.0

v0.30.0

07 Apr 16:58
Compare
Choose a tag to compare

Breaking Changes

Listeners are now always called with the editor they were registered to

#7378 changed the internal updateEditorSync implementation to always use the correct active editor when triggering a listener. This only affects how nested editors delegate their events to listeners attached to a parent editor. If you have listeners attached to the parent editor that expect to be called with the context of the nested editor then you'll have to either also attach the listener to the nested editor, or change the behavior to check the editor argument of the command listener to see which editor the command was originally dispatched to.

Import of markdown blocks preserves separation with shouldPreserveNewLines

#7386 changed the behavior of the markdown import's paragraph merging logic to align with GitHub's markdown editor behavior for list and common markdown formatting expectations when shouldPreserveNewlines is true.

Markdown encoding uses HTML entities to represent leading and trailing whitespace

#7400 changed the markdown encoder to replace leading or trailing whitespace of formatted strings with the corresponding HTML entities

Highlights

Core

  • #7378 Ensure updateEditorSync is always synchronous and use it when triggering listeners
  • #7393 Fix right and up arrow key navigation with decorator nodes
  • #7401 Clone the selection and use $setSelection instead of assigning dirty to true directly
  • #7397 Change $getTextNodeOffset invariant to warn in prod (error in __DEV__)
  • #7412 Fix forward line deletion when using control+K
  • 🆕 #7438 Add text-transform styles to exported HTML

Rich Text

  • #7411 Prevent indentation from becoming negative

Collab

  • #7330 Don't sync ElementNode __dir property
  • #7398 Fix scroll position getting changed when someone else makes a change in collab

Markdown

  • #7386 Preserve paragraph separation after block elements
  • #7395 Prevent Markdown shortcuts from applying to code-formatted text
  • #7400 Replace whitespace with code point when the string has leading and trailing whitespaces

List

  • #7380 Empty list item type change
  • #7420 Enforce strict list indentation
  • 🆕 #7429 Export registerCheckList

Link

  • #7366 Add support for image links via NodeSelection

Devtools

  • #7403 Update debug view to show KEY_ESCAPE_COMMAND immediately

React

  • 🆕 #7404 Add option to disable first item auto-selection in menus

Table

  • 🆕 #7408 Improve logic for pasting table into table
  • 🆕 #7415 Rename and deprecate some table utils

Playground

  • 🆕 #7384 Clear block ElementNode formatting along with TextNode
  • 🆕 #7417 Clear formatting should also clear any indent/outdent if applied
  • #7368 Remove shared imports from playground for easier re-use
  • #7388 Use natural dimensions for inherited image size
  • #7405 Fix floating toolbar position for end-aligned text
  • #7431 Fix immediate broken image display on load failure

What's Changed

  • v0.29.0 by @lilshady in #7375
  • [tests] Update next version by @lilshady in #7374
  • [lexical-playground] Chore: Remove shared imports from playground by @etrepum in #7368
  • [lexical-list] Bug Fix: empty list item type change by @fantactuka in #7380
  • [Breaking Change][lexical] Bug Fix: Ensure updateEditorSync is always synchronous and use it when triggering listeners by @etrepum in #7378
  • Update dependencies: vite,@babel/runtime,prismjs,@babel/helpers by @lilshady in #7381
  • update codeowners by @potatowagon in #7389
  • [lexical-playground] Feature: clear blockelement formatting along with textNode by @harshmetkel24 in #7384
  • [lexical-playground] Bug Fix: Use natural dimensions for inherited image size by @kirandash in #7388
  • [Breaking Change][lexical-markdown] Bug Fix: Preserve paragraph separation after block elements by @kirandash in #7386
  • [lexical-link][lexical-playground] Feature: Add support for image links via NodeSelection by @kirandash in #7366
  • [lexical-yjs] Bug Fix: don't sync ElementNode __dir property by @james-atticus in #7330
  • [lexical-rich-text] Bug Fix: Fix right and up arrow key navigation with decorator nodes by @kirandash in #7393
  • [lexical-markdown] Bug Fix: Prevent Markdown shortcuts from applying to code-formatted text by @takuyakanbr in #7395
  • [lexical-yjs] Bug Fix: Fix scroll position getting changed when someone else makes a change in collab by @amanharwara in #7398
  • [RFC][lexical-markdown] Replace whitespace with code point when the string has leading and trailing whitespaces by @lilshady in #7400
  • [Bug Fix] Clone a node and use $setSelection instead of assigning dirty to true directly. by @lilshady in #7401
  • [lexical-devtools-core] Bug Fix: Update debug view to show KEY_ESCAPE_COMMAND immediately by @kirandash in #7403
  • [lexical-react] Feature: Add option to disable first item auto-selection in menus by @kirandash in #7404
  • [lexical] Chore: Change $getTextNodeOffset invariant to warn in prod (error in DEV) by @etrepum in #7397
  • [lexical-playground] Bug Fix: Floating toolbar position for end-aligned text by @kirandash in #7405
  • [lexical] Bug Fix: Fix forward line deletion when using control+K by @takuyakanbr in #7412
  • [lexical-rich-text] Bug Fix: Prevent indentation from becoming negative by @takuyakanbr in #7411
  • [lexical-table] Feature: Improve logic for pasting table into table by @takuyakanbr in #7408
  • [lexical-table] Refactor: Rename and deprecate some table utils by @takuyakanbr in #7415
  • [lexical-playground] Bug: clear formatting should also clear any indent/outdent if applied by @harshmetkel24 in #7417
  • [lexical-list] Feature: Enforce strict list indentation by @dineug in #7420
  • [lexical-playground] Bug Fix: Immediate broken image display on load failure by @kirandash in #7431
  • Chore: Improve spelling consistency across codebase by @kirandash in #7437
  • [lexical] Feature: Add text-transform styles to exported HTML by @kirandash in #7438
  • [lexical-list] Feature: export registerCheckList by @atsjo in #7429

New Contributors

Full Changelog: v0.29.0...v0.30.0

v0.29.0

25 Mar 07:34
Compare
Choose a tag to compare

Breaking Changes

#7351 : Only select RootNode on removal of last child if there was an existing selection
#7353: Support escaping markdown characters
#7357: Refactor: LexicalNestedComposer add skipEditableListener prop and deprecate initialNodes prop and implicit namespace setting
#7372: Set tableFrozenColumn and tableFrozenRow classes only on the scrollable table wrapper

Highlights

React:
🆕 #7357: LexicalNestedComposer add skipEditableListener prop and deprecate initialNodes prop and implicit namespace setting

Table:
#7372: Set tableFrozenColumn and tableFrozenRow classes only on the scrollable table wrapper
#7316: Add fallback selection to InsertTableCommand

Core editor:
#7351: Only select RootNode on removal of last child if there was an existing selection
#7354: Ignore input event from inside decorators

Markdown:
🆕 #7353: Feature: Support escaping markdown characters

Playground:
🆕 #7352 : Chore: Improve accessibility of DraggableBlockPlugin add block button
#7334: Table action menu visibility with cell overflow
#7362: Fix equation rendering in Safari
🆕 #7371: Chore: Update excalidraw to v0.18.0
Doc:
#7365: Update react.md, fix typo

What's Changed

  • v0.28.0 by @etrepum in #7348
  • [lexical-playground] Chore: Improve accessibility of DraggableBlockPlugin add block button by @etrepum in #7352
  • [Breaking Change][lexical] Bug Fix: Only select RootNode on removal of last child if there was an existing selection by @etrepum in #7351
  • [lexical-playground] Bug Fix: Table action menu visibility with cell overflow by @kirandash in #7334
  • [Breaking Change][lexical-markdown] Feature: Support escaping markdown characters by @AlessioGr in #7353
  • [lexical-table] Bug Fix: Add fallback selection to InsertTableCommand by @patrick-atticus in #7316
  • Update react.md, fix typo by @bohdanbirdie in #7365
  • [lexical-playground] Bug Fix: Fix equation rendering in Safari by @kirandash in #7362
  • [Breaking Change][lexical-react] Refactor: LexicalNestedComposer add skipEditableListener prop and deprecate initialNodes prop and implicit namespace setting by @etrepum in #7357
  • [lexical] Bug Fix: Ignore input event from inside decorators by @etrepum in #7354
  • [Breaking Change][lexical-table][lexical-playground] Bug Fix: Set tableFrozenColumn and tableFrozenRow classes only on the scrollable table wrapper by @etrepum in #7372
  • [lexical-playground] Chore: Update excalidraw to v0.18.0 by @etrepum in #7371

New Contributors

Full Changelog: v0.28.0...v0.29.0

v0.28.0

18 Mar 18:57
Compare
Choose a tag to compare

Ad-hoc minor release with important bug fixes and some enabling features. The most important fix is in #7341 - where under certain conditions nodes may not be updated in the DOM at all (this bug is rarely triggered and has been around for 3+ years).

Breaking Changes

NodeSelection default delete handler #7323

If you have any $onDelete handlers copied from the playground for KEY_DELETE_COMMAND and KEY_BACKSPACE_COMMAND, you can delete them all now. If you leave them in, it will have similar bugs as prior to this PR.

The default KEY_DELETE_COMMAND and KEY_BACKSPACE_COMMAND handlers now event.preventDefault() and call DELETE_CHARACTER_COMMAND for NodeSelection (in addition to the existing RangeSelection behavior).

The DELETE_CHARACTER_COMMAND handler now handles NodeSelection by calling the new NodeSelection.deleteNodes() method which places a new RangeSelection where the first selected node was (if any, and if it was the current selection) and then removes all of the selected nodes.

RootNode and ListItemNode splice #7341

This PR moves the incorrectly overridden append methods for RootNode and ListNode and moves it to the ElementNode's primitive splice method. For RootNode this means that the exception you'd get for appending a leaf node to the root will be thrown in all situations when that node is inserted, rather than just append. For ListNode this means that the automatic ListItemNode wrapping applies in all situations when children are inserted into the node, not just append.

$insertNodeToNearestRoot changes #7342

Previously $insertNodeToNearestRoot could create empty ElementNode when splitting the current node, now it respects canBeEmpty() and will not split in those cases (e.g. ListNode).

ListItemNode CSS #7325

The approach used in #7024 (since v0.26.0) to have a ListItemNode bullet inherit the style of the first text node was too broad, the inline style on the ListItemNode cascades to all of its children. The only way around this is to change the approach.

To retain this feature, you need to add CSS to your theme to specifically style the marker pseudo-element based on these new custom properties. Here's an example from the playground css:

.PlaygroundEditorTheme__listItem::marker {
  color: var(--listitem-marker-color);
  background-color: var(--listitem-marker-background-color);
  font-family: var(--listitem-marker-font-family);
  font-size: var(--listitem-marker-font-size);
}

TableCellNode importDOM #7318

The importDOM implementation for TableCellNode has been corrected to behave as other Lexical roots do with regard to converting <br> tags to LineBreakNode and wrapping runs of top-level inline nodes (including inline decorators) with ParagraphNode. If you have any specific workarounds accounting for the previous behavior, you can remove them. The one difference from other import paths is that a solitary <br> (e.g. <td><br></td>) is converted to an empty ParagraphNode rather than a ParagraphNode containing a LineBreakNode.

getDOMSlot #7336

If you're using the undocumented internal getDOMSlot API, you may need to change your types. There is now a type parameter for ElementDOMSlot so that the element property can be specialized.

Highlights

Core:

  • 🆕 #7321 Add mutatedNodes to UpdateListener payload
  • 🆕 #7323 Add a default delete handler for NodeSelection - this allowed a lot of boilerplate code to be deleted, and all of the existing implementations were subtly broken
  • #7341 Fix bug in transformer loop that would cause nodes not to get reconciled
  • #7342 Handle canBeEmpty() in $splitNodes
  • 🆕 #7344 Apply RootNode transforms last

List:

  • #7325 Move ListItemNode text style inheritance to CSS custom properties

Tables:

  • #7336 Fix updateDOM for scrollable TableNode
  • #7318 Fix table cell line breaks

React:

  • #7315 Remove unused direct dependencies
  • 🆕 #7338 Add onElementChanged callback to DraggableBlockPlugin

Playground:

  • #7337 Table actions should clear selection instead of moving it to the beginning
  • 🆕 #7338 Add "+" button to DraggableBlockPlugin

Utils:

  • 🆕 #7340 Add a type predicate to objectKlassEquals

New APIs

UpdateListenerPayload mutatedNodes #7321

A mutatedNodes property is now present in the UpdateListener payload. This was done to accommodate the use case when you want to have a MutationListener that listens to all nodes (this is useful in combination with NodeState). Note that this property is only calculated when at least one MutationListener is registered (e.g. editor.registerMutationListener(RootNode, () => {}) is sufficient to compute mutatedNodes for all nodes).

NodeSelection deleteNodes #7323

NodeSelection.deleteNodes() was added to support the default delete handler

RootNode node transform #7344

There is now an ordering guarantee that RootNode node transforms are called last, and documentation about the special case that RootNode is always considered intentionally dirty when any other node is dirty

@lexical/react/LexicalDraggableBlockPlugin onElementChanged #7338

An onElementChanged prop was added to make it possible to implement the "+" button in the playground

What's Changed

  • v0.27.2 by @etrepum in #7314
  • [lexical-react]: Chore: remove unused dependencies from @lexical/react by @AlessioGr in #7315
  • [lexical-editor][Bug fix] Add LexicalEditor.hasNode to flow typing to match typescript by @Zhangerr in #7320
  • [Breaking Change][lexical][lexical-table] Bug Fix: Scrollable TableNode updateDOM fixes and getDOMSlot type refactoring by @etrepum in #7336
  • [lexical] Feature: Add mutatedNodes to UpdateListener payload by @etrepum in #7321
  • [Breaking Change][lexical-list] Bug Fix: Move ListItemNode text style inheritance to custom properties and CSS by @etrepum in #7325
  • [Breaking Change][lexical][lexical-playground] Feature: Add a default delete handler for NodeSelection by @etrepum in #7323
  • [lexical-playground] Table actions should clear selection instead of moving it to the beginning by @etrepum in #7337
  • [lexical-utils] Feature: Add type predicate to objectKlassEquals by @2wheeh in #7340
  • [Breaking Change][lexical] Bug Fix: Fix bug in transformer loop that would cause nodes not to get reconciled by @etrepum in #7341
  • [Breaking Change][lexical-table] Bug Fix: Table cell line breaks behave differently from the intended HTML behavior. by @dineug in #7318
  • [Breaking Change][lexical][lexical-utils]: Bug Fix: Handle canBeEmpty in $splitNodes by @etrepum in #7342
  • [lexical-playground][lexical-react] Feature: Push Draggable Element to Parent by @sescandell in #7338
  • [lexical-website] Docs: Fix broken links to React Rich Collab Example by @etrepum in #7347
  • [lexical] Feature: Apply RootNode transforms last by @etrepum in #7344

New Contributors

Full Changelog: v0.27.2...v0.28.0