refactor(richtext-lexical): upgrade lexical to 0.50.0 (3.x) (#18148)

Upgrades `lexical` and every installed `@lexical/*` package from
`0.41.0` to `0.50.0` for Payload 3.x. Updates the dependency pins,
lockfile, and `lexicalTargetVersion`.

Also exposes the 15 React entry points added on main in
[#17554](https://github.com/payloadcms/payload/pull/17554) through
`@payloadcms/richtext-lexical/lexical/react/*`, so custom features can
use these APIs through Payload.

## Breaking changes

**No application changes or data migration are needed when using
Payload's built-in rich text features.**

If you maintain custom rich text features, check that they still compile
and that custom content loads, copies, and pastes correctly. Lexical
removed some older APIs, tightened TypeScript types, and changed how
custom nodes are loaded and copied. Tests that inspect the editor's HTML
may also need updated selectors or snapshots because Lexical adds some
internal markup.

**Do not install `lexical` or `@lexical/*` yourself for use with
Payload.** Remove any direct dependencies you added for the editor and
use Payload's re-exports from `@payloadcms/richtext-lexical/lexical` and
`@payloadcms/richtext-lexical/lexical/*`. Payload supplies the matching
versions; mixing versions can break the editor. This is the existing
[custom feature
requirement](https://payloadcms.com/docs/rich-text/custom-features).

The 3.x Markdown implementation and converter defaults are preserved.
This does not backport the v4 Markdown API changes.

## Breaking changes and Payload migrations

Reviewed
[0.42.0](https://github.com/facebook/lexical/releases/tag/v0.42.0),
[0.43.0](https://github.com/facebook/lexical/releases/tag/v0.43.0),
[0.44.0](https://github.com/facebook/lexical/releases/tag/v0.44.0),
[0.45.0](https://github.com/facebook/lexical/releases/tag/v0.45.0),
[0.46.0](https://github.com/facebook/lexical/releases/tag/v0.46.0),
[0.47.0](https://github.com/facebook/lexical/releases/tag/v0.47.0),
[0.48.0](https://github.com/facebook/lexical/releases/tag/v0.48.0),
[0.49.0](https://github.com/facebook/lexical/releases/tag/v0.49.0),
[0.50.0](https://github.com/facebook/lexical/releases/tag/v0.50.0).
Listed below are breaking API/type changes and behavior changes
explicitly identified as breaking in the release notes. Deprecations and
routine bug fixes are omitted. **Yes** means we had to change Payload
code; **No** means no Payload migration was required.

| Release | Breaking change | Required migration in Payload | Changes
made |
| ------- |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| ----------------------------- |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 0.42 | [Experimental `hasFitNestedTables` moves out of the table
package into the
playground](https://github.com/facebook/lexical/pull/8210). | No | - |
| 0.42 | [The deprecated context-menu plugin is
removed](https://github.com/facebook/lexical/pull/8199). | Yes | Removed
the invalid `LexicalContextMenuPlugin` proxy and package export. Custom
consumers must use
`@payloadcms/richtext-lexical/lexical/react/LexicalNodeContextMenuPlugin`
and adapt to its node-context-menu API. |
| 0.43 | [Nested editors delegate asynchronously to their
parent](https://github.com/facebook/lexical/pull/8308), restoring the
behavior from before 0.42.0. | No | - |
| 0.45 | [`$getReconciledDirection` now inherits direction through
shadow-root nodes](https://github.com/facebook/lexical/pull/8479). | No
| - |
| 0.45 | [Backspace at the start of a non-empty block preserves the
current block type and
formatting](https://github.com/facebook/lexical/pull/8493). | No | - |
| 0.45 | [Moving nodes between parents adjusts selection
offsets](https://github.com/facebook/lexical/pull/8501). | No | - |
| 0.45 | [Markdown shortcuts can trigger when IME composition
commits](https://github.com/facebook/lexical/pull/8503). | No | - |
| 0.45 | [Rich/plain text automatically removes empty inline
elements](https://github.com/facebook/lexical/pull/8497). | No | - |
| 0.45 | [Triple-click selection normalization moves from core into
rich/plain text
registration](https://github.com/facebook/lexical/pull/8520). Editors
bypassing that registration must add
`NormalizeTripleClickSelectionExtension`. | No | - |
| 0.45 | [`DOMSlot` and the DOM rendering override APIs are
generalized](https://github.com/facebook/lexical/pull/8519); playground
`AutocompleteNode` is replaced by `VisibleLineBreakExtension`. | No | -
|
| 0.46 | [`static importJSON` widens its parameter to
`SerializedLexicalNode & Record<string,
unknown>`](https://github.com/payloadcms/payload/pull/17554). Overrides
using serialized interfaces can fail TypeScript checks. | No | - |
| 0.46 | [Node lookups and traversal no longer infer unchecked subclass
types](https://github.com/facebook/lexical/pull/8661). Explicit
unchecked traversal generics are deprecated. | Yes | Removed the upload
drawer’s assumption that a node lookup returns `UploadNode`. Added
`$isUploadNode` before reading or updating upload data. |
| 0.46 | [DOM lookups of the editor root return `RootNode` instead of
`null`](https://github.com/facebook/lexical/pull/8588).
Selection-capture handling is also generalized beyond decorators. | No |
- |
| 0.46 | [`insertNodes` preserves leading line breaks, and managed line
breaks receive a DOM
marker](https://github.com/facebook/lexical/pull/8615). | No | - |
| 0.46 | [Experimental DOM-import rules register through node
extensions](https://github.com/facebook/lexical/pull/8662); the separate
per-package import extensions become deprecated aliases. | No | - |
| 0.46 | [Experimental named slots change the Yjs sync
signature](https://github.com/facebook/lexical/pull/8603):
`syncLexicalUpdateToYjsV2__EXPERIMENTAL` gains a `dirtyLeaves`
parameter. | No | - |
| 0.46 | [Copying an element through `NodeSelection` includes its
children](https://github.com/facebook/lexical/pull/8603), instead of
copying an empty shell. | No | - |
| 0.46 | [Previously deprecated exports are
removed](https://github.com/facebook/lexical/pull/8704): `toggleLink`,
`insertList`, `removeList`, and ContentEditable’s `Props` alias.
Replacements are `$toggleLink`, `$insertList`, `$removeList`, and
`ContentEditableProps`. | No | - |
| 0.47 | [React 17 support is
removed](https://github.com/facebook/lexical/pull/8782); React 18 or
later is required. | No | - |
| 0.47 | [Segmented text temporarily switches to normal mode during IME
composition while keeping its
DOM](https://github.com/facebook/lexical/pull/8784). Subclasses must
tolerate that temporary mode. | No | - |
| 0.49 | [Built-in nodes adopt
`$config()`](https://github.com/facebook/lexical/pull/8640). Direct
static `importJSON`, `importDOM`, `clone`, and `transform`
implementations change; `__type` becomes readonly and automatic node
construction needs zero-argument defaults. Custom static implementations
remain supported. | No | - |
| 0.49 | [`LexicalCommand<T>` checks its payload type more
strictly](https://github.com/facebook/lexical/pull/8877).
`LexicalCommand<unknown>` is no longer a safe catch-all. | Yes | Focus
and blur commands were incorrectly registered with `MouseEvent`. Removed
the explicit types so Lexical infers `FocusEvent`. |
| 0.50 | [Named-slot values cannot be replaced with
`LexicalNode.replace()`](https://github.com/facebook/lexical/pull/8938).
Block converters also [skip slot
values](https://github.com/facebook/lexical/pull/8905). | No | - |
| 0.50 | [Lexical JSON clipboard copying checks
`excludeFromCopy('clone')`, not
`'html'`](https://github.com/facebook/lexical/pull/8995). | No | - |

Also updated the copied table action menu for merged-cell bounds, header
toggles, and merge/unmerge selection, and fixed the upload alignment
test’s image selector. Formatting and diff checks pass for the upload
selector fix.

Verified all 15 new entry points through source and published export
maps with runtime imports and TypeScript checks. ESLint and formatting
checks pass.

## Previous Lexical upgrades

- [#15760](https://github.com/payloadcms/payload/pull/15760) — 0.35.0 →
0.41.0
- [#13715](https://github.com/payloadcms/payload/pull/13715) — 0.34.0 →
0.35.0
- [#13622](https://github.com/payloadcms/payload/pull/13622) — 0.28.0 →
0.34.0
This commit is contained in:
Alessio Gravili
2026-09-11 13:01:50 -07:00
committed by GitHub
parent 479458d8e0
commit c337e12896
25 changed files with 651 additions and 318 deletions
+163 -23
View File
@@ -183,11 +183,6 @@
"types": "./src/lexical-proxy/@lexical-react/LexicalContentEditable.ts",
"default": "./src/lexical-proxy/@lexical-react/LexicalContentEditable.ts"
},
"./lexical/react/LexicalContextMenuPlugin": {
"import": "./src/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.ts",
"types": "./src/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.ts",
"default": "./src/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.ts"
},
"./lexical/react/LexicalNodeContextMenuPlugin": {
"import": "./src/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.ts",
"types": "./src/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.ts",
@@ -328,6 +323,81 @@
"types": "./src/lexical-proxy/@lexical-react/useLexicalTextEntity.ts",
"default": "./src/lexical-proxy/@lexical-react/useLexicalTextEntity.ts"
},
"./lexical/react/ExtensionComponent": {
"import": "./src/lexical-proxy/@lexical-react/ExtensionComponent.ts",
"types": "./src/lexical-proxy/@lexical-react/ExtensionComponent.ts",
"default": "./src/lexical-proxy/@lexical-react/ExtensionComponent.ts"
},
"./lexical/react/LexicalExtensionComposer": {
"import": "./src/lexical-proxy/@lexical-react/LexicalExtensionComposer.ts",
"types": "./src/lexical-proxy/@lexical-react/LexicalExtensionComposer.ts",
"default": "./src/lexical-proxy/@lexical-react/LexicalExtensionComposer.ts"
},
"./lexical/react/LexicalExtensionEditorComposer": {
"import": "./src/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.ts",
"types": "./src/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.ts",
"default": "./src/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.ts"
},
"./lexical/react/LexicalSelectionAlwaysOnDisplay": {
"import": "./src/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.ts",
"types": "./src/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.ts",
"default": "./src/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.ts"
},
"./lexical/react/ReactExtension": {
"import": "./src/lexical-proxy/@lexical-react/ReactExtension.ts",
"types": "./src/lexical-proxy/@lexical-react/ReactExtension.ts",
"default": "./src/lexical-proxy/@lexical-react/ReactExtension.ts"
},
"./lexical/react/ReactPluginHostExtension": {
"import": "./src/lexical-proxy/@lexical-react/ReactPluginHostExtension.ts",
"types": "./src/lexical-proxy/@lexical-react/ReactPluginHostExtension.ts",
"default": "./src/lexical-proxy/@lexical-react/ReactPluginHostExtension.ts"
},
"./lexical/react/ReactProviderExtension": {
"import": "./src/lexical-proxy/@lexical-react/ReactProviderExtension.ts",
"types": "./src/lexical-proxy/@lexical-react/ReactProviderExtension.ts",
"default": "./src/lexical-proxy/@lexical-react/ReactProviderExtension.ts"
},
"./lexical/react/TreeViewExtension": {
"import": "./src/lexical-proxy/@lexical-react/TreeViewExtension.ts",
"types": "./src/lexical-proxy/@lexical-react/TreeViewExtension.ts",
"default": "./src/lexical-proxy/@lexical-react/TreeViewExtension.ts"
},
"./lexical/react/useExtensionComponent": {
"import": "./src/lexical-proxy/@lexical-react/useExtensionComponent.ts",
"types": "./src/lexical-proxy/@lexical-react/useExtensionComponent.ts",
"default": "./src/lexical-proxy/@lexical-react/useExtensionComponent.ts"
},
"./lexical/react/useExtensionSignalValue": {
"import": "./src/lexical-proxy/@lexical-react/useExtensionSignalValue.ts",
"types": "./src/lexical-proxy/@lexical-react/useExtensionSignalValue.ts",
"default": "./src/lexical-proxy/@lexical-react/useExtensionSignalValue.ts"
},
"./lexical/react/useLexicalAriaLiveRegion": {
"import": "./src/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.ts",
"types": "./src/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.ts",
"default": "./src/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.ts"
},
"./lexical/react/useLexicalFocusManagerRef": {
"import": "./src/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.ts",
"types": "./src/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.ts",
"default": "./src/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.ts"
},
"./lexical/react/useLexicalFocusTrapRef": {
"import": "./src/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.ts",
"types": "./src/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.ts",
"default": "./src/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.ts"
},
"./lexical/react/useLexicalRovingTabIndexRef": {
"import": "./src/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.ts",
"types": "./src/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.ts",
"default": "./src/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.ts"
},
"./lexical/react/useLexicalSlotRef": {
"import": "./src/lexical-proxy/@lexical-react/useLexicalSlotRef.ts",
"types": "./src/lexical-proxy/@lexical-react/useLexicalSlotRef.ts",
"default": "./src/lexical-proxy/@lexical-react/useLexicalSlotRef.ts"
},
"./ast/mdx": {
"import": "./src/exports/server/ast/mdx.ts",
"types": "./src/exports/server/ast/mdx.ts",
@@ -372,17 +442,17 @@
]
},
"dependencies": {
"@lexical/clipboard": "0.41.0",
"@lexical/headless": "0.41.0",
"@lexical/html": "0.41.0",
"@lexical/link": "0.41.0",
"@lexical/list": "0.41.0",
"@lexical/mark": "0.41.0",
"@lexical/react": "0.41.0",
"@lexical/rich-text": "0.41.0",
"@lexical/selection": "0.41.0",
"@lexical/table": "0.41.0",
"@lexical/utils": "0.41.0",
"@lexical/clipboard": "0.50.0",
"@lexical/headless": "0.50.0",
"@lexical/html": "0.50.0",
"@lexical/link": "0.50.0",
"@lexical/list": "0.50.0",
"@lexical/mark": "0.50.0",
"@lexical/react": "0.50.0",
"@lexical/rich-text": "0.50.0",
"@lexical/selection": "0.50.0",
"@lexical/table": "0.50.0",
"@lexical/utils": "0.50.0",
"@payloadcms/translations": "workspace:*",
"@payloadcms/ui": "workspace:*",
"acorn": "8.16.0",
@@ -391,7 +461,7 @@
"dequal": "2.0.3",
"escape-html": "1.0.3",
"jsox": "1.2.121",
"lexical": "0.41.0",
"lexical": "0.50.0",
"mdast-util-from-markdown": "2.0.2",
"mdast-util-mdx-jsx": "3.1.3",
"micromark-extension-mdx-jsx": "3.0.1",
@@ -406,7 +476,7 @@
"@babel/preset-env": "7.27.2",
"@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "7.27.1",
"@lexical/eslint-plugin": "0.41.0",
"@lexical/eslint-plugin": "0.50.0",
"@payloadcms/eslint-config": "workspace:*",
"@types/escape-html": "1.0.4",
"@types/json-schema": "7.0.15",
@@ -593,11 +663,6 @@
"types": "./dist/lexical-proxy/@lexical-react/LexicalContentEditable.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/LexicalContentEditable.js"
},
"./lexical/react/LexicalContextMenuPlugin": {
"import": "./dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.js",
"types": "./dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.js"
},
"./lexical/react/LexicalNodeContextMenuPlugin": {
"import": "./dist/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.js",
"types": "./dist/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.d.ts",
@@ -738,6 +803,81 @@
"types": "./dist/lexical-proxy/@lexical-react/useLexicalTextEntity.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useLexicalTextEntity.js"
},
"./lexical/react/ExtensionComponent": {
"import": "./dist/lexical-proxy/@lexical-react/ExtensionComponent.js",
"types": "./dist/lexical-proxy/@lexical-react/ExtensionComponent.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/ExtensionComponent.js"
},
"./lexical/react/LexicalExtensionComposer": {
"import": "./dist/lexical-proxy/@lexical-react/LexicalExtensionComposer.js",
"types": "./dist/lexical-proxy/@lexical-react/LexicalExtensionComposer.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/LexicalExtensionComposer.js"
},
"./lexical/react/LexicalExtensionEditorComposer": {
"import": "./dist/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.js",
"types": "./dist/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.js"
},
"./lexical/react/LexicalSelectionAlwaysOnDisplay": {
"import": "./dist/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.js",
"types": "./dist/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.js"
},
"./lexical/react/ReactExtension": {
"import": "./dist/lexical-proxy/@lexical-react/ReactExtension.js",
"types": "./dist/lexical-proxy/@lexical-react/ReactExtension.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/ReactExtension.js"
},
"./lexical/react/ReactPluginHostExtension": {
"import": "./dist/lexical-proxy/@lexical-react/ReactPluginHostExtension.js",
"types": "./dist/lexical-proxy/@lexical-react/ReactPluginHostExtension.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/ReactPluginHostExtension.js"
},
"./lexical/react/ReactProviderExtension": {
"import": "./dist/lexical-proxy/@lexical-react/ReactProviderExtension.js",
"types": "./dist/lexical-proxy/@lexical-react/ReactProviderExtension.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/ReactProviderExtension.js"
},
"./lexical/react/TreeViewExtension": {
"import": "./dist/lexical-proxy/@lexical-react/TreeViewExtension.js",
"types": "./dist/lexical-proxy/@lexical-react/TreeViewExtension.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/TreeViewExtension.js"
},
"./lexical/react/useExtensionComponent": {
"import": "./dist/lexical-proxy/@lexical-react/useExtensionComponent.js",
"types": "./dist/lexical-proxy/@lexical-react/useExtensionComponent.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useExtensionComponent.js"
},
"./lexical/react/useExtensionSignalValue": {
"import": "./dist/lexical-proxy/@lexical-react/useExtensionSignalValue.js",
"types": "./dist/lexical-proxy/@lexical-react/useExtensionSignalValue.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useExtensionSignalValue.js"
},
"./lexical/react/useLexicalAriaLiveRegion": {
"import": "./dist/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.js",
"types": "./dist/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.js"
},
"./lexical/react/useLexicalFocusManagerRef": {
"import": "./dist/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.js",
"types": "./dist/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.js"
},
"./lexical/react/useLexicalFocusTrapRef": {
"import": "./dist/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.js",
"types": "./dist/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.js"
},
"./lexical/react/useLexicalRovingTabIndexRef": {
"import": "./dist/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.js",
"types": "./dist/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.js"
},
"./lexical/react/useLexicalSlotRef": {
"import": "./dist/lexical-proxy/@lexical-react/useLexicalSlotRef.js",
"types": "./dist/lexical-proxy/@lexical-react/useLexicalSlotRef.d.ts",
"default": "./dist/lexical-proxy/@lexical-react/useLexicalSlotRef.js"
},
"./ast/mdx": {
"import": "./dist/exports/server/ast/mdx.js",
"types": "./dist/exports/server/ast/mdx.d.ts",
@@ -0,0 +1,18 @@
import type { TableSelection } from '@lexical/table'
import { $computeTableCellRectBoundary, $computeTableMap, $getNodeTriplet } from '@lexical/table'
export function $computeSelectionCount({ selection }: { selection: TableSelection }): {
columns: number
rows: number
} {
const [anchorCell, , table] = $getNodeTriplet(selection.anchor)
const [focusCell] = $getNodeTriplet(selection.focus)
const [map, anchor, focus] = $computeTableMap(table, anchorCell, focusCell)
const { maxColumn, maxRow, minColumn, minRow } = $computeTableCellRectBoundary(map, anchor, focus)
return {
columns: maxColumn - minColumn + 1,
rows: maxRow - minRow + 1,
}
}
@@ -1,18 +1,17 @@
'use client'
import type { TableObserver, TableSelection } from '@lexical/table'
import type { TableObserver } from '@lexical/table'
import type { ElementNode } from 'lexical'
import type { JSX } from 'react'
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
import { useLexicalEditable } from '@lexical/react/useLexicalEditable'
import {
$computeTableMapSkipCellCheck,
$computeTableMap,
$deleteTableColumnAtSelection,
$deleteTableRowAtSelection,
$getNodeTriplet,
$getTableCellNodeFromLexicalNode,
$getTableColumnIndexFromTableCellNode,
$getTableNodeFromLexicalNodeOrThrow,
$getTableRowIndexFromTableCellNode,
$insertTableColumnAtSelection,
@@ -20,6 +19,8 @@ import {
$isTableCellNode,
$isTableSelection,
$mergeCells,
$setTableColumnIsHeader,
$setTableRowIsHeader,
$unmergeCell,
getTableElement,
getTableObserverFromTableElement,
@@ -47,17 +48,7 @@ import type { PluginComponentWithAnchor } from '../../../../typesClient.js'
import './index.scss'
import { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'
function computeSelectionCount(selection: TableSelection): {
columns: number
rows: number
} {
const selectionShape = selection.getShape()
return {
columns: selectionShape.toX - selectionShape.fromX + 1,
rows: selectionShape.toY - selectionShape.fromY + 1,
}
}
import { $computeSelectionCount } from './computeSelectionCount.js'
function $canUnmerge(): boolean {
const selection = $getSelection()
@@ -130,10 +121,14 @@ function TableActionMenu({
const selection = $getSelection()
// Merge cells
if ($isTableSelection(selection)) {
const currentSelectionCounts = computeSelectionCount(selection)
updateSelectionCounts(computeSelectionCount(selection))
const currentSelectionCounts = $computeSelectionCount({ selection })
updateSelectionCounts(currentSelectionCounts)
setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1)
const isCollapsedTableSelection = selection.anchor.is(selection.focus)
setCanMergeCells(
!isCollapsedTableSelection &&
(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1),
)
}
// Unmerge cell
setCanUnmergeCell($canUnmerge())
@@ -232,6 +227,7 @@ function TableActionMenu({
editor.update(() => {
$unmergeCell()
})
clearTableSelection()
}
const insertTableRowAtSelection = useCallback(
@@ -286,27 +282,9 @@ function TableActionMenu({
editor.update(() => {
const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)
const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)
const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)
const rowCells = new Set<TableCellNode>()
const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW
if (gridMap[tableRowIndex]) {
for (let col = 0; col < gridMap[tableRowIndex].length; col++) {
const mapCell = gridMap[tableRowIndex][col]
if (!mapCell?.cell) {
continue
}
if (!rowCells.has(mapCell.cell)) {
rowCells.add(mapCell.cell)
mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW)
}
}
}
const rowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)
const isHeader = !tableCellNode.hasHeaderState(TableCellHeaderStates.ROW)
$setTableRowIsHeader(tableNode, rowIndex, isHeader)
clearTableSelection()
onClose()
@@ -317,27 +295,10 @@ function TableActionMenu({
editor.update(() => {
const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)
const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode)
const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)
const columnCells = new Set<TableCellNode>()
const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN
if (gridMap) {
for (let row = 0; row < gridMap.length; row++) {
const mapCell = gridMap?.[row]?.[tableColumnIndex]
if (!mapCell?.cell) {
continue
}
if (!columnCells.has(mapCell.cell)) {
columnCells.add(mapCell.cell)
mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN)
}
}
}
// Merged cells can make the grid column differ from the cell's index in its row.
const [, cellMap] = $computeTableMap(tableNode, tableCellNode, tableCellNode)
const isHeader = !tableCellNode.hasHeaderState(TableCellHeaderStates.COLUMN)
$setTableColumnIsHeader(tableNode, cellMap.startColumn, isHeader)
clearTableSelection()
onClose()
@@ -141,7 +141,9 @@ export function useToolbarStates(
useEffect(() => {
void runDeprioritized(updateStates)
const listener = () => runDeprioritized(updateStates)
const listener = () => {
void runDeprioritized(updateStates)
}
const cleanup = mergeRegister(editor.registerUpdateListener(listener))
document.addEventListener('mouseup', listener)
@@ -20,13 +20,13 @@ import React, { useCallback, useId, useReducer, useRef, useState } from 'react'
import type { BaseClientFeatureProps } from '../../../typesClient.js'
import type { UploadData } from '../../server/nodes/UploadNode.js'
import type { UploadFeaturePropsClient } from '../index.js'
import type { UploadNode } from '../nodes/UploadNode.js'
import { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'
import { FieldsDrawer } from '../../../../utilities/fieldsDrawer/Drawer.js'
import { useLexicalDocumentDrawer } from '../../../../utilities/fieldsDrawer/useLexicalDocumentDrawer.js'
import { useLexicalDrawer } from '../../../../utilities/fieldsDrawer/useLexicalDrawer.js'
import { INSERT_UPLOAD_WITH_DRAWER_COMMAND } from '../drawer/commands.js'
import { $isUploadNode } from '../nodes/UploadNode.js'
import './index.scss'
const initialParams = {
@@ -128,8 +128,8 @@ export const UploadComponent: React.FC<ElementProps> = (props) => {
(_: FormState, data: JsonObject) => {
// Update lexical node (with key nodeKey) with new data
editor.update(() => {
const uploadNode: null | UploadNode = $getNodeByKey(nodeKey)
if (uploadNode) {
const uploadNode = $getNodeByKey(nodeKey)
if ($isUploadNode(uploadNode)) {
const newData: UploadData = {
...uploadNode.getData(),
fields: data,
+1 -1
View File
@@ -28,7 +28,7 @@ import { richTextValidateHOC } from './validate/index.js'
let checkedDependencies = false
export const lexicalTargetVersion = '0.41.0'
export const lexicalTargetVersion = '0.50.0'
export function lexicalEditor(args?: LexicalEditorProps): LexicalRichTextAdapterProvider {
if (
@@ -0,0 +1 @@
export * from '@lexical/react/ExtensionComponent'
@@ -1 +0,0 @@
export * from '@lexical/react/LexicalContextMenuPlugin'
@@ -0,0 +1 @@
export * from '@lexical/react/LexicalExtensionComposer'
@@ -0,0 +1 @@
export * from '@lexical/react/LexicalExtensionEditorComposer'
@@ -0,0 +1 @@
export * from '@lexical/react/LexicalSelectionAlwaysOnDisplay'
@@ -0,0 +1 @@
export * from '@lexical/react/ReactExtension'
@@ -0,0 +1 @@
export * from '@lexical/react/ReactPluginHostExtension'
@@ -0,0 +1 @@
export * from '@lexical/react/ReactProviderExtension'
@@ -0,0 +1 @@
export * from '@lexical/react/TreeViewExtension'
@@ -0,0 +1 @@
export * from '@lexical/react/useExtensionComponent'
@@ -0,0 +1 @@
export * from '@lexical/react/useExtensionSignalValue'
@@ -0,0 +1 @@
export * from '@lexical/react/useLexicalAriaLiveRegion'
@@ -0,0 +1 @@
export * from '@lexical/react/useLexicalFocusManagerRef'
@@ -0,0 +1 @@
export * from '@lexical/react/useLexicalFocusTrapRef'
@@ -0,0 +1 @@
export * from '@lexical/react/useLexicalRovingTabIndexRef'
@@ -0,0 +1 @@
export * from '@lexical/react/useLexicalSlotRef'
@@ -62,7 +62,7 @@ export const LexicalEditor: React.FC<
editorConfigContext.blurEditor(editorConfigContext)
}
const unregisterFocus = editor.registerCommand<MouseEvent>(
const unregisterFocus = editor.registerCommand(
FOCUS_COMMAND,
() => {
handleFocus()
@@ -71,7 +71,7 @@ export const LexicalEditor: React.FC<
COMMAND_PRIORITY_LOW,
)
const unregisterBlur = editor.registerCommand<MouseEvent>(
const unregisterBlur = editor.registerCommand(
BLUR_COMMAND,
() => {
handleBlur()
+425 -227
View File
@@ -1380,38 +1380,38 @@ importers:
specifier: 2.0.0
version: 2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@lexical/clipboard':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/headless':
specifier: 0.41.0
version: 0.41.0(bufferutil@4.1.0)
specifier: 0.50.0
version: 0.50.0(bufferutil@4.1.0)(typescript@5.7.3)
'@lexical/html':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/link':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/list':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/mark':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/react':
specifier: 0.41.0
version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)
specifier: 0.50.0
version: 0.50.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)(yjs@13.6.31)
'@lexical/rich-text':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/selection':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/table':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@lexical/utils':
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
'@payloadcms/next':
specifier: workspace:*
version: link:../next
@@ -1440,8 +1440,8 @@ importers:
specifier: 1.2.121
version: 1.2.121
lexical:
specifier: 0.41.0
version: 0.41.0
specifier: 0.50.0
version: 0.50.0(typescript@5.7.3)
mdast-util-from-markdown:
specifier: 2.0.2
version: 2.0.2
@@ -1486,8 +1486,8 @@ importers:
specifier: 7.27.1
version: 7.27.1(@babel/core@7.27.3)
'@lexical/eslint-plugin':
specifier: 0.41.0
version: 0.41.0(eslint@9.39.2(jiti@2.7.0))
specifier: 0.50.0
version: 0.50.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.7.3)
'@payloadcms/eslint-config':
specifier: workspace:*
version: link:../eslint-config
@@ -5578,87 +5578,214 @@ packages:
'@keyv/serialize@1.1.1':
resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
'@lexical/clipboard@0.41.0':
resolution: {integrity: sha512-Ex5lPkb4NBBX1DCPzOAIeHBJFH1bJcmATjREaqpnTfxCbuOeQkt44wchezUA0oDl+iAxNZ3+pLLWiUju9icoSA==}
'@lexical/a11y@0.50.0':
resolution: {integrity: sha512-qxEe+ZOeti/jueuVTx0fNc0GO8aD6OOBLP6z48VP2ACJkEW+jI15bidI9rfT+FHpDnmWCmYChHUiVL477q6JeQ==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/code@0.41.0':
resolution: {integrity: sha512-0hoNi1KC9/N3SBOGcOcFqnT0OpwmcRRAhfxTKMGqfCtCvAMzULVwZ8RWc9/NV9bKYESgBTW5D9xkDANP2mspHg==}
'@lexical/clipboard@0.50.0':
resolution: {integrity: sha512-Sb+bDluH0JZNRrSURIfry2ZwdkQPTSRMtpV6XHRRKMFh86o4KcR9PMbfSdaGxZOHctHNabTp0JRmkpt/zrItjQ==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/devtools-core@0.41.0':
resolution: {integrity: sha512-FzJtluBhBc8bKS11TUZe72KoZN/hnzIyiiM0SPJAsPwGpoXuM01jqpXQGybWf/1bWB+bmmhOae7O4Nywi/Csuw==}
'@lexical/code-core@0.50.0':
resolution: {integrity: sha512-0KPTDmcPL/4ObLy5N/yFo+t6l/bHE63NODPOsyUN1NACc62i0Pc8NXGwo4xhaLcpgIRDiN1ABZ+h3AVLp5GlWQ==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/devtools-core@0.50.0':
resolution: {integrity: sha512-70m994RIZ5sdYjtGEHTo6nIOkUddaWVVl920WGWR0zqNblxYmFuDQAsMgz6nJmA9TNbCbLLufFi5RMPwnBVVOA==}
peerDependencies:
react: 19.2.6
react-dom: 19.2.6
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/dragon@0.41.0':
resolution: {integrity: sha512-gBEqkk8Q6ZPruvDaRcOdF1EK9suCVBODzOCcR+EnoJTaTjfDkCM7pkPAm4w90Wa1wCZEtFHvCfas+jU9MDSumg==}
'@lexical/eslint-plugin@0.41.0':
resolution: {integrity: sha512-6nxniBiMd1jQJi44Aw/VZyufWrl1rvzcm3Ey0eQTVxKn/SFzTtLO0AmxjjFdvcA/amWL0A8p+rpdAax5NpzQ9A==}
'@lexical/dragon@0.50.0':
resolution: {integrity: sha512-JX+uzkRn4QLIljS6bWS93Vg1TYIohTP7TXP2mUz6RrxW+x8iqzJuaAR8tjN4SkpCTxI8VpBNWFU8d6B7I9qnXg==}
peerDependencies:
eslint: '>=7.31.0 || ^8.0.0'
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/extension@0.41.0':
resolution: {integrity: sha512-sF4SPiP72yXvIGchmmIZ7Yg2XZTxNLOpFEIIzdqG7X/1fa1Ham9P/T7VbrblWpF6Ei5LJtK9JgNVB0hb4l3o1g==}
'@lexical/eslint-plugin@0.50.0':
resolution: {integrity: sha512-PfQR9zSoUTLU//65tKmtA5wrkezgyksmBJIBaCTXpB5ohcWYH1ISF2YtKO0gmMbNYTl5/bA38NugumtP6KZacA==}
peerDependencies:
eslint: '>=7.31.0'
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/hashtag@0.41.0':
resolution: {integrity: sha512-tFWM74RW4KU0E/sj2aowfWl26vmLUTp331CgVESnhQKcZBfT40KJYd57HEqBDTfQKn4MUhylQCCA0hbpw6EeFQ==}
'@lexical/extension@0.50.0':
resolution: {integrity: sha512-iktLl+eLOVT6hE4BOy2GIQeuIOmsksWoPDT9WhEkIlV5IEM/OBLGAzO23Q2G0UV89tXDq1wKa4p6vwLWlCHWLA==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/headless@0.41.0':
resolution: {integrity: sha512-MH8oDuUKdM/Jq0c9vlEEkCL9pEQg4SwyrABBGIbFf+87VBJ5EWDdG9g1vJq7fKSDxfhFux7F5+i+zgUnxOQR/g==}
'@lexical/hashtag@0.50.0':
resolution: {integrity: sha512-KnkJU+49HV47KrgCoS+zqUQuTZ/e5CtH7ttu0ZgAcZJyNojZ7kHbqtdiH78kZSuqBknD75l+VCNJBpg6ShdtlQ==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/history@0.41.0':
resolution: {integrity: sha512-kGoVWsiOn62+RMjRolRa+NXZl8jFwxav6GNDiHH8yzivtoaH8n1SwUfLJELXCzeqzs81HySqD4q30VLJVTGoDg==}
'@lexical/headless@0.50.0':
resolution: {integrity: sha512-UkJsks5yNZFiBvlr1SM6M6n4D66Tayj7R3ylxpaL/gXbKgOCMUz06Q57QhMIRqaSGGiSIrzZw1Ge5WZE70imGg==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/html@0.41.0':
resolution: {integrity: sha512-3RyZy+H/IDKz2D66rNN/NqYx87xVFrngfEbyu1OWtbY963RUFnopiVHCQvsge/8kT04QSZ7U/DzjVFqeNS6clg==}
'@lexical/history@0.50.0':
resolution: {integrity: sha512-UMbvTWOHxfS3SQA0oWN8uvmG64WrFgurojM1KoYjxuUbPFGjumD6al5zsA06d6+TkCDSw6l639tJ43bFr3HE5A==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/link@0.41.0':
resolution: {integrity: sha512-Rjtx5cGWAkKcnacncbVsZ1TqRnUB2Wm4eEVKpaAEG41+kHgqghzM2P+UGT15yROroxJu8KvAC9ISiYFiU4XE1w==}
'@lexical/html@0.50.0':
resolution: {integrity: sha512-vMdMWvOyD9EXljNCJk3thms/WEBMUR0rLLaJdzcOk/CwUiAv1KPopGp/8vW0zFmnu42n5i9ufERv0BZ/UGzZMw==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/list@0.41.0':
resolution: {integrity: sha512-RXvB+xcbzVoQLGRDOBRCacztG7V+bI95tdoTwl8pz5xvgPtAaRnkZWMDP+yMNzMJZsqEChdtpxbf0NgtMkun6g==}
'@lexical/internal@0.50.0':
resolution: {integrity: sha512-FGfEKY1L1aIHEh/O+RcRxeLRQV0g95MuU5b26YuzGGyd0IX90pliK9bVph54OaqDdS1AQ0MEVEFGXfSXaGJzxg==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/mark@0.41.0':
resolution: {integrity: sha512-UO5WVs9uJAYIKHSlYh4Z1gHrBBchTOi21UCYBIZ7eAs4suK84hPzD+3/LAX5CB7ZltL6ke5Sly3FOwNXv/wfpA==}
'@lexical/link@0.50.0':
resolution: {integrity: sha512-J/Wn7+XzW3Tm56RKCaHeISPIRJrWaSywGasna7yaMwvZykTM9JS5D/bzPCg0pCCxw8qsPeRX29oDQ+nUEixmUA==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/markdown@0.41.0':
resolution: {integrity: sha512-bzI73JMXpjGFhqUWNV6KqfjWcgAWzwFT+J3RHtbCF5rysC8HLldBYojOgAAtPfXqfxyv2mDzsY7SoJ75s9uHZA==}
'@lexical/list@0.50.0':
resolution: {integrity: sha512-eSGU10DUqS+seXkGfTVGJ475M4scdaDE15Vk52nuYODhi0lbO6zNbIoDDGKxaxvzs/CfrHHT3AUGYmruIp/LPw==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/offset@0.41.0':
resolution: {integrity: sha512-2RHBXZqC8gm3X9C0AyRb0M8w7zJu5dKiasrif+jSKzsxPjAUeF1m95OtIOsWs1XLNUgASOSUqGovDZxKJslZfA==}
'@lexical/mark@0.50.0':
resolution: {integrity: sha512-FClGXbLzEHFX0hJRslXb/YdO5xSZLMuPOj9skRoA3fwbWRLsBhfaIYSEz+7pjMF4P8fFqW2vPCFHvgJD+SgYXw==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/overflow@0.41.0':
resolution: {integrity: sha512-Iy6ZiJip8X14EBYt1zKPOrXyQ4eG9JLBEoPoSVBTiSbVd+lYicdUvaOThT0k0/qeVTN9nqTaEltBjm56IrVKCQ==}
'@lexical/markdown@0.50.0':
resolution: {integrity: sha512-H2z7Eed7sVCX+K/UmULqPCpkB5Ch86+/vRHs+VCe7xmDkvBRYZQmErUqx14cV7QwcrQ+wclcDlCojJTUh5MBOQ==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/plain-text@0.41.0':
resolution: {integrity: sha512-HIsGgmFUYRUNNyvckun33UQfU7LRzDlxymHUq67+Bxd5bXqdZOrStEKJXuDX+LuLh/GXZbaWNbDLqwLBObfbQg==}
'@lexical/overflow@0.50.0':
resolution: {integrity: sha512-jeBFFaViAWxg+i7UKoWxN+VImvwNXq9fuRUMEMXFZqfWhgsC37/NvUOMF4oNVf3mppTMsv38n2y1qR51JLujcQ==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/react@0.41.0':
resolution: {integrity: sha512-7+GUdZUm6sofWm+zdsWAs6cFBwKNsvsHezZTrf6k8jrZxL461ZQmbz/16b4DvjCGL9r5P1fR7md9/LCmk8TiCg==}
'@lexical/plain-text@0.50.0':
resolution: {integrity: sha512-X1iH6yamtE6PZRlUB4T2epUOzKA19ONozWja3A87mlXEDVhCM7hxeDFzxzWnbqY1/TWsyy8ZCaFktz8GRzTFvw==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/react@0.50.0':
resolution: {integrity: sha512-q9USUeO5tunqPmxDG9D11kydRts5jgXO1WJ62u86WXeHOGjMtSjvVwLY+PfQDhCn0aNYF7XvGaIM3Aa04UxF7A==}
peerDependencies:
react: 19.2.6
react-dom: 19.2.6
typescript: 5.7.3
yjs: '>=13.5.37'
peerDependenciesMeta:
typescript:
optional: true
yjs:
optional: true
'@lexical/rich-text@0.41.0':
resolution: {integrity: sha512-yUcr7ZaaVTZNi8bow4CK1M8jy2qyyls1Vr+5dVjwBclVShOL/F/nFyzBOSb6RtXXRbd3Ahuk9fEleppX/RNIdw==}
'@lexical/selection@0.41.0':
resolution: {integrity: sha512-1s7/kNyRzcv5uaTwsUL28NpiisqTf5xZ1zNukLsCN1xY+TWbv9RE9OxIv+748wMm4pxNczQe/UbIBODkbeknLw==}
'@lexical/table@0.41.0':
resolution: {integrity: sha512-d3SPThBAr+oZ8O74TXU0iXM3rLbrAVC7/HcOnSAq7/AhWQW8yMutT51JQGN+0fMLP9kqoWSAojNtkdvzXfU/+A==}
'@lexical/text@0.41.0':
resolution: {integrity: sha512-gGA+Anc7ck110EXo4KVKtq6Ui3M7Vz3OpGJ4QE6zJHWW8nV5h273koUGSutAMeoZgRVb6t01Izh3ORoFt/j1CA==}
'@lexical/utils@0.41.0':
resolution: {integrity: sha512-Wlsokr5NQCq83D+7kxZ9qs5yQ3dU3Qaf2M+uXxLRoPoDaXqW8xTWZq1+ZFoEzsHzx06QoPa4Vu/40BZR91uQPg==}
'@lexical/yjs@0.41.0':
resolution: {integrity: sha512-PaKTxSbVC4fpqUjQ7vUL9RkNF1PjL8TFl5jRe03PqoPYpE33buf3VXX6+cOUEfv9+uknSqLCPHoBS/4jN3a97w==}
'@lexical/rich-text@0.50.0':
resolution: {integrity: sha512-4EDspglulL6zHlV53Azsq4OduRunJqyrDkldZ8ekrE8ujHhvu2UB3Utzq98Z8TSIllFPvNKmW0Qp/9lJ7378Ag==}
peerDependencies:
yjs: '>=13.5.22'
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/selection@0.50.0':
resolution: {integrity: sha512-Lu4W+Ht7xd3+R8fXorzsl1LbDMF7UALgvh0LA/nbY5qlmozEyfHr1z4oaV4HAzXN5F8NxSrxCfDEXt5EHU1bfA==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/table@0.50.0':
resolution: {integrity: sha512-K5GDw8oIsujL8IQY9L5PJXxkODs0c9gqL1CROcfLw7kE4icNXeIVrK/kQ7K3SxQ/stpb5NnBLERTK9ohzPEuLQ==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/text@0.50.0':
resolution: {integrity: sha512-K2bf6NfzS+PutNrrNlWr47kZx34fCYyiX1vPT4a1/sob8LsGrYwy9mseyFFlNYDlWSP2U/xIKLv2JuaYZX8ohw==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/utils@0.50.0':
resolution: {integrity: sha512-iFEKYQufeCtx9I918SteutyMkEKlR6VNldovnCE2ue9ilfKMnj8ghhenMaLzRfslzttvMLrn8d9DP5TWysZqZw==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
'@lexical/yjs@0.50.0':
resolution: {integrity: sha512-AfKaHZs0IpHDUS1uoB7yWbhP1VRVWuUbHZ3HnNI2bqhn0h05SWfxxwt/QCwaldLM0WzY9wszpQc8VFSHipjldA==}
peerDependencies:
typescript: 5.7.3
yjs: '>=13.5.37'
peerDependenciesMeta:
typescript:
optional: true
'@libsql/client@0.14.0':
resolution: {integrity: sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==}
@@ -11802,8 +11929,13 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
lexical@0.41.0:
resolution: {integrity: sha512-pNIm5+n+hVnJHB9gYPDYsIO5Y59dNaDU9rJmPPsfqQhP2ojKFnUoPbcRnrI9FJLXB14sSumcY8LUw7Sq70TZqA==}
lexical@0.50.0:
resolution: {integrity: sha512-m/uySKGi66CEjCjIvmMeLjLgMnckCKAQn1ynFGj+YJfjlr6KtkodH/dpFL+hdLDqqEZHhR75EP64J96MNIMwDw==}
peerDependencies:
typescript: 5.7.3
peerDependenciesMeta:
typescript:
optional: true
lib0@0.2.117:
resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==}
@@ -13072,10 +13204,6 @@ packages:
peerDependencies:
react: 19.2.6
prismjs@1.30.0:
resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
engines: {node: '>=6'}
proc-log@6.1.0:
resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -13174,11 +13302,6 @@ packages:
peerDependencies:
react: 19.2.6
react-error-boundary@6.1.2:
resolution: {integrity: sha512-3DpCr5HVdZ0caUjYE/kIHBEJN0mNP3ZCgf16c48uJ5TbWjorKVp+YG8W3XqlJ7vJAVNw6wNIImyPXmFydwmyng==}
peerDependencies:
react: 19.2.6
react-hook-form@7.71.1:
resolution: {integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==}
engines: {node: '>=18.0.0'}
@@ -18314,177 +18437,255 @@ snapshots:
'@keyv/serialize@1.1.1': {}
'@lexical/clipboard@0.41.0':
'@lexical/a11y@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/html': 0.41.0
'@lexical/list': 0.41.0
'@lexical/selection': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/code@0.41.0':
'@lexical/clipboard@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/utils': 0.41.0
lexical: 0.41.0
prismjs: 1.30.0
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/html': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/list': 0.50.0(typescript@5.7.3)
'@lexical/selection': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
'@types/trusted-types': 2.0.7
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/devtools-core@0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
'@lexical/code-core@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/html': 0.41.0
'@lexical/link': 0.41.0
'@lexical/mark': 0.41.0
'@lexical/table': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/html': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/devtools-core@0.50.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)':
dependencies:
'@lexical/html': 0.50.0(typescript@5.7.3)
'@lexical/link': 0.50.0(typescript@5.7.3)
'@lexical/mark': 0.50.0(typescript@5.7.3)
'@lexical/table': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
react: 19.2.6
react-dom: 19.2.6(react@19.2.6)
optionalDependencies:
typescript: 5.7.3
'@lexical/dragon@0.41.0':
'@lexical/dragon@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/extension': 0.41.0
lexical: 0.41.0
'@lexical/extension': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/eslint-plugin@0.41.0(eslint@9.39.2(jiti@2.7.0))':
'@lexical/eslint-plugin@0.50.0(eslint@9.39.2(jiti@2.7.0))(typescript@5.7.3)':
dependencies:
eslint: 9.39.2(jiti@2.7.0)
optionalDependencies:
typescript: 5.7.3
'@lexical/extension@0.41.0':
'@lexical/extension@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/utils': 0.41.0
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
'@preact/signals-core': 1.14.2
lexical: 0.41.0
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/hashtag@0.41.0':
'@lexical/hashtag@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/text': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/text': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/headless@0.41.0(bufferutil@4.1.0)':
'@lexical/headless@0.50.0(bufferutil@4.1.0)(typescript@5.7.3)':
dependencies:
'@lexical/internal': 0.50.0(typescript@5.7.3)
happy-dom: 20.9.0(bufferutil@4.1.0)
lexical: 0.41.0
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@lexical/history@0.41.0':
'@lexical/history@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/extension': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/html@0.41.0':
'@lexical/html@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/selection': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/selection': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/link@0.41.0':
'@lexical/internal@0.50.0(typescript@5.7.3)':
optionalDependencies:
typescript: 5.7.3
'@lexical/link@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/extension': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/a11y': 0.50.0(typescript@5.7.3)
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/html': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/list@0.41.0':
'@lexical/list@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/extension': 0.41.0
'@lexical/selection': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/html': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/mark@0.41.0':
'@lexical/mark@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/markdown@0.41.0':
'@lexical/markdown@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/code': 0.41.0
'@lexical/link': 0.41.0
'@lexical/list': 0.41.0
'@lexical/rich-text': 0.41.0
'@lexical/text': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/code-core': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/link': 0.50.0(typescript@5.7.3)
'@lexical/list': 0.50.0(typescript@5.7.3)
'@lexical/rich-text': 0.50.0(typescript@5.7.3)
'@lexical/selection': 0.50.0(typescript@5.7.3)
'@lexical/text': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/offset@0.41.0':
'@lexical/overflow@0.50.0(typescript@5.7.3)':
dependencies:
lexical: 0.41.0
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/overflow@0.41.0':
'@lexical/plain-text@0.50.0(typescript@5.7.3)':
dependencies:
lexical: 0.41.0
'@lexical/clipboard': 0.50.0(typescript@5.7.3)
'@lexical/dragon': 0.50.0(typescript@5.7.3)
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/selection': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/plain-text@0.41.0':
dependencies:
'@lexical/clipboard': 0.41.0
'@lexical/dragon': 0.41.0
'@lexical/selection': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/react@0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)':
'@lexical/react@0.50.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)(yjs@13.6.31)':
dependencies:
'@floating-ui/react': 0.27.19(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@lexical/devtools-core': 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@lexical/dragon': 0.41.0
'@lexical/extension': 0.41.0
'@lexical/hashtag': 0.41.0
'@lexical/history': 0.41.0
'@lexical/link': 0.41.0
'@lexical/list': 0.41.0
'@lexical/mark': 0.41.0
'@lexical/markdown': 0.41.0
'@lexical/overflow': 0.41.0
'@lexical/plain-text': 0.41.0
'@lexical/rich-text': 0.41.0
'@lexical/table': 0.41.0
'@lexical/text': 0.41.0
'@lexical/utils': 0.41.0
'@lexical/yjs': 0.41.0(yjs@13.6.31)
lexical: 0.41.0
'@lexical/a11y': 0.50.0(typescript@5.7.3)
'@lexical/devtools-core': 0.50.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)
'@lexical/dragon': 0.50.0(typescript@5.7.3)
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/hashtag': 0.50.0(typescript@5.7.3)
'@lexical/history': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/link': 0.50.0(typescript@5.7.3)
'@lexical/list': 0.50.0(typescript@5.7.3)
'@lexical/mark': 0.50.0(typescript@5.7.3)
'@lexical/markdown': 0.50.0(typescript@5.7.3)
'@lexical/overflow': 0.50.0(typescript@5.7.3)
'@lexical/plain-text': 0.50.0(typescript@5.7.3)
'@lexical/rich-text': 0.50.0(typescript@5.7.3)
'@lexical/table': 0.50.0(typescript@5.7.3)
'@lexical/text': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
'@lexical/yjs': 0.50.0(typescript@5.7.3)(yjs@13.6.31)
lexical: 0.50.0(typescript@5.7.3)
react: 19.2.6
react-dom: 19.2.6(react@19.2.6)
react-error-boundary: 6.1.2(react@19.2.6)
transitivePeerDependencies:
- yjs
'@lexical/rich-text@0.41.0':
dependencies:
'@lexical/clipboard': 0.41.0
'@lexical/dragon': 0.41.0
'@lexical/selection': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/selection@0.41.0':
dependencies:
lexical: 0.41.0
'@lexical/table@0.41.0':
dependencies:
'@lexical/clipboard': 0.41.0
'@lexical/extension': 0.41.0
'@lexical/utils': 0.41.0
lexical: 0.41.0
'@lexical/text@0.41.0':
dependencies:
lexical: 0.41.0
'@lexical/utils@0.41.0':
dependencies:
'@lexical/selection': 0.41.0
lexical: 0.41.0
'@lexical/yjs@0.41.0(yjs@13.6.31)':
dependencies:
'@lexical/offset': 0.41.0
'@lexical/selection': 0.41.0
lexical: 0.41.0
optionalDependencies:
typescript: 5.7.3
yjs: 13.6.31
'@lexical/rich-text@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/a11y': 0.50.0(typescript@5.7.3)
'@lexical/clipboard': 0.50.0(typescript@5.7.3)
'@lexical/dragon': 0.50.0(typescript@5.7.3)
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/html': 0.50.0(typescript@5.7.3)
'@lexical/selection': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/selection@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/internal': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/table@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/clipboard': 0.50.0(typescript@5.7.3)
'@lexical/extension': 0.50.0(typescript@5.7.3)
'@lexical/html': 0.50.0(typescript@5.7.3)
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/utils': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/text@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/internal': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/utils@0.50.0(typescript@5.7.3)':
dependencies:
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/selection': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
'@lexical/yjs@0.50.0(typescript@5.7.3)(yjs@13.6.31)':
dependencies:
'@lexical/internal': 0.50.0(typescript@5.7.3)
'@lexical/selection': 0.50.0(typescript@5.7.3)
lexical: 0.50.0(typescript@5.7.3)
yjs: 13.6.31
optionalDependencies:
typescript: 5.7.3
'@libsql/client@0.14.0(bufferutil@4.1.0)':
dependencies:
'@libsql/core': 0.14.0
@@ -21381,8 +21582,7 @@ snapshots:
'@types/tough-cookie@4.0.5': {}
'@types/trusted-types@2.0.7':
optional: true
'@types/trusted-types@2.0.7': {}
'@types/unist@2.0.11': {}
@@ -25480,7 +25680,11 @@ snapshots:
prelude-ls: 1.2.1
type-check: 0.4.0
lexical@0.41.0: {}
lexical@0.50.0(typescript@5.7.3):
dependencies:
'@lexical/internal': 0.50.0(typescript@5.7.3)
optionalDependencies:
typescript: 5.7.3
lib0@0.2.117:
dependencies:
@@ -26982,8 +27186,6 @@ snapshots:
clsx: 2.1.1
react: 19.2.6
prismjs@1.30.0: {}
proc-log@6.1.0: {}
process-nextick-args@2.0.1: {}
@@ -27078,10 +27280,6 @@ snapshots:
'@babel/runtime': 7.29.7
react: 19.2.6
react-error-boundary@6.1.2(react@19.2.6):
dependencies:
react: 19.2.6
react-hook-form@7.71.1(react@19.2.6):
dependencies:
react: 19.2.6
@@ -73,7 +73,7 @@ describe('Lexical Fully Featured', () => {
await lexical.drawer.locator('.file-field__remote-file').fill(url)
await lexical.drawer.getByText('Add file').click()
await lexical.save('drawer')
const img = lexical.editor.locator('img').first()
const img = lexical.editor.locator('.LexicalEditorTheme__upload img').first()
await img.click()
const imgBoxBeforeCenter = await img.boundingBox()
await expect(() => {