add support for react 19 ref props (#6405)
Some checks are pending
build / build (20) (push) Waiting to run
build / test (20, map[name:Demos/Commands spec:./demos/src/Commands/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Examples spec:./demos/src/Examples/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Experiments spec:./demos/src/Experiments/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Extensions spec:./demos/src/Extensions/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/GuideContent spec:./demos/src/GuideContent/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/GuideGettingStarted spec:./demos/src/GuideGettingStarted/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Marks spec:./demos/src/Marks/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Demos/Nodes spec:./demos/src/Nodes/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / test (20, map[name:Integration spec:./tests/cypress/integration/**/*.spec.{js,ts}]) (push) Blocked by required conditions
build / release (20) (push) Blocked by required conditions
Publish / Release (20) (push) Waiting to run

* add support for react 19 ref props

* added changeset

* Update packages/react/src/ReactRenderer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* use partial imports instead of importing the whole React library

* fix react renderer not passing ref prop

* upgrade dev dependencies for react

* updated lockfile

* upgrade dev dependencies

* update package.json

* remove optionalDependencies and move react deps to peerDependencies

* enhance ReactRenderer for React 19 compatibility and improve ref handling

* remove unused 'node' property from ReactNodeViewProps type definition

* fix: update ref type in ReactNodeView to be generic

* fix: replace FunctionComponent with NamedExoticComponent for better performance in ReactNodeView

* cloned react renderer element props to avoid side effects

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
bdbch 2025-06-04 13:48:27 +02:00 committed by GitHub
parent 4f498944b5
commit ef12b32623
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 173 additions and 114 deletions

View File

@ -0,0 +1,5 @@
---
'@tiptap/react': minor
---
Added support for React 19 ref in props

View File

@ -56,8 +56,8 @@
"iframe-resizer": "^4.4.5",
"postcss": "^8.4.49",
"postcss-import": "^15.1.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"sass": "^1.83.0",
"svelte": "^4.2.19",
"tailwindcss": "^3.4.17",

View File

@ -1,8 +1,8 @@
import type { NodeViewProps } from '@tiptap/react'
import type { ReactNodeViewProps } from '@tiptap/react'
import { NodeViewWrapper } from '@tiptap/react'
import React from 'react'
export default (props: NodeViewProps) => {
export default (props: ReactNodeViewProps<HTMLLabelElement>) => {
const increase = () => {
props.updateAttributes({
count: props.node.attrs.count + 1,
@ -11,7 +11,7 @@ export default (props: NodeViewProps) => {
return (
<NodeViewWrapper className="react-component">
<label>React Component</label>
<label ref={props.ref}>React Component</label>
<div className="content">
<button onClick={increase}>This button has been clicked {props.node.attrs.count} times.</button>

View File

@ -1,10 +1,10 @@
import type { NodeViewProps } from '@tiptap/react'
import type { ReactNodeViewProps } from '@tiptap/react'
import { NodeViewWrapper } from '@tiptap/react'
import React, { useContext } from 'react'
import { Context } from './Context.js'
export default (props: NodeViewProps) => {
export default (props: ReactNodeViewProps) => {
const { value } = useContext(Context)
const increase = () => {

View File

@ -1,8 +1,8 @@
import './MentionList.scss'
import React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react'
import React, { useEffect, useImperativeHandle, useState } from 'react'
export default forwardRef((props, ref) => {
export default props => {
const [selectedIndex, setSelectedIndex] = useState(0)
const selectItem = index => {
@ -27,7 +27,7 @@ export default forwardRef((props, ref) => {
useEffect(() => setSelectedIndex(0), [props.items])
useImperativeHandle(ref, () => ({
useImperativeHandle(props.ref, () => ({
onKeyDown: ({ event }) => {
if (event.key === 'ArrowUp') {
upHandler()
@ -65,4 +65,4 @@ export default forwardRef((props, ref) => {
)}
</div>
)
})
}

View File

@ -43,8 +43,8 @@
"@commitlint/config-conventional": "^19.6.0",
"@cypress/webpack-preprocessor": "^6.0.2",
"@testing-library/react": "16.2.0",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"@typescript-eslint/eslint-plugin": "^8.19.0",
"@typescript-eslint/parser": "^8.19.0",
"babel-loader": "^9.2.1",
@ -66,7 +66,7 @@
"minimist": "^1.2.8",
"pkg-pr-new": "0.0.32",
"prettier": "3.3.3",
"react": "^18.0.0",
"react": "^19.0.0",
"tinyglobby": "0.2.10",
"ts-loader": "9.3.1",
"tsup": "^8.3.5",

View File

@ -48,8 +48,8 @@
"@tiptap/pm": "workspace:*",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"react": "^18.3.1",
"react-dom": "^18.3.1"
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"optionalDependencies": {
"@tiptap/extension-bubble-menu": "workspace:*",

View File

@ -1,12 +1,13 @@
import type { DecorationWithType, Editor, NodeViewProps, NodeViewRenderer, NodeViewRendererOptions } from '@tiptap/core'
import type { DecorationWithType, Editor, NodeViewRenderer, NodeViewRendererOptions } from '@tiptap/core'
import { getRenderedAttributes, NodeView } from '@tiptap/core'
import type { Node, Node as ProseMirrorNode } from '@tiptap/pm/model'
import type { Decoration, DecorationSource, NodeView as ProseMirrorNodeView } from '@tiptap/pm/view'
import type { ComponentType } from 'react'
import React from 'react'
import type { ComponentType, NamedExoticComponent } from 'react'
import { createElement, createRef, memo } from 'react'
import type { EditorWithContentComponent } from './Editor.js'
import { ReactRenderer } from './ReactRenderer.js'
import type { ReactNodeViewProps } from './types.js'
import type { ReactNodeViewContextProps } from './useReactNodeView.js'
import { ReactNodeViewContext } from './useReactNodeView.js'
@ -45,14 +46,15 @@ export interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {
}
export class ReactNodeView<
Component extends ComponentType<NodeViewProps> = ComponentType<NodeViewProps>,
T = HTMLElement,
Component extends ComponentType<ReactNodeViewProps<T>> = ComponentType<ReactNodeViewProps<T>>,
NodeEditor extends Editor = Editor,
Options extends ReactNodeViewRendererOptions = ReactNodeViewRendererOptions,
> extends NodeView<Component, NodeEditor, Options> {
/**
* The renderer instance.
*/
renderer!: ReactRenderer<unknown, NodeViewProps>
renderer!: ReactRenderer<unknown, ReactNodeViewProps<T>>
/**
* The element that holds the rich-text content of the node.
@ -76,7 +78,8 @@ export class ReactNodeView<
getPos: () => this.getPos(),
updateAttributes: (attributes = {}) => this.updateAttributes(attributes),
deleteNode: () => this.deleteNode(),
} satisfies NodeViewProps
ref: createRef<T>(),
} satisfies ReactNodeViewProps<T>
if (!(this.component as any).displayName) {
const capitalizeFirstChar = (string: string): string => {
@ -96,10 +99,10 @@ export class ReactNodeView<
const Component = this.component
// For performance reasons, we memoize the provider component
// And all of the things it requires are declared outside of the component, so it doesn't need to re-render
const ReactNodeViewProvider: React.FunctionComponent<NodeViewProps> = React.memo(componentProps => {
const ReactNodeViewProvider: NamedExoticComponent<ReactNodeViewProps<T>> = memo(componentProps => {
return (
<ReactNodeViewContext.Provider value={context}>
{React.createElement(Component, componentProps)}
{createElement(Component, componentProps)}
</ReactNodeViewContext.Provider>
)
})
@ -302,8 +305,8 @@ export class ReactNodeView<
/**
* Create a React node view renderer.
*/
export function ReactNodeViewRenderer(
component: ComponentType<NodeViewProps>,
export function ReactNodeViewRenderer<T = HTMLElement>(
component: ComponentType<ReactNodeViewProps<T>>,
options?: Partial<ReactNodeViewRendererOptions>,
): NodeViewRenderer {
return props => {
@ -314,6 +317,6 @@ export function ReactNodeViewRenderer(
return {} as unknown as ProseMirrorNodeView
}
return new ReactNodeView(component, props, options)
return new ReactNodeView<T>(component, props, options)
}
}

View File

@ -1,5 +1,13 @@
import type { Editor } from '@tiptap/core'
import React from 'react'
import type {
ComponentClass,
ForwardRefExoticComponent,
FunctionComponent,
PropsWithoutRef,
ReactNode,
RefAttributes,
} from 'react'
import { version as reactVersion } from 'react'
import { flushSync } from 'react-dom'
import type { EditorWithContentComponent } from './Editor.js'
@ -22,6 +30,26 @@ function isForwardRefComponent(Component: any) {
return !!(typeof Component === 'object' && Component.$$typeof?.toString() === 'Symbol(react.forward_ref)')
}
/**
* Check if we're running React 19+ by detecting if function components support ref props
* @returns {boolean}
*/
function isReact19Plus(): boolean {
// React 19 is detected by checking React version if available
// In practice, we'll use a more conservative approach and assume React 18 behavior
// unless we can definitively detect React 19
try {
// @ts-ignore
if (reactVersion) {
const majorVersion = parseInt(reactVersion.split('.')[0], 10)
return majorVersion >= 19
}
} catch {
// Fallback to React 18 behavior if we can't determine version
}
return false
}
export interface ReactRendererOptions {
/**
* The editor instance.
@ -53,9 +81,9 @@ export interface ReactRendererOptions {
}
type ComponentType<R, P> =
| React.ComponentClass<P>
| React.FunctionComponent<P>
| React.ForwardRefExoticComponent<React.PropsWithoutRef<P> & React.RefAttributes<R>>
| ComponentClass<P>
| FunctionComponent<P>
| ForwardRefExoticComponent<PropsWithoutRef<P> & RefAttributes<R>>
/**
* The ReactRenderer class. It's responsible for rendering React components inside the editor.
@ -79,7 +107,7 @@ export class ReactRenderer<R = unknown, P extends Record<string, any> = object>
props: P
reactElement: React.ReactNode
reactElement: ReactNode
ref: R | null = null
@ -120,14 +148,32 @@ export class ReactRenderer<R = unknown, P extends Record<string, any> = object>
const props = this.props
const editor = this.editor as EditorWithContentComponent
if (isClassComponent(Component) || isForwardRefComponent(Component)) {
// @ts-ignore This is a hack to make the ref work
props.ref = (ref: R) => {
this.ref = ref
// Handle ref forwarding with React 18/19 compatibility
const isReact19 = isReact19Plus()
const isClassComp = isClassComponent(Component)
const isForwardRefComp = isForwardRefComponent(Component)
const elementProps = { ...props }
if (!elementProps.ref) {
if (isReact19) {
// React 19: ref is a standard prop for all components
// @ts-ignore - Setting ref prop for React 19 compatibility
elementProps.ref = (ref: R) => {
this.ref = ref
}
} else if (isClassComp || isForwardRefComp) {
// React 18 and prior: only set ref for class components and forwardRef components
// @ts-ignore - Setting ref prop for React 18 class/forwardRef components
elementProps.ref = (ref: R) => {
this.ref = ref
}
}
// For function components in React 18, we can't use ref - the component won't receive it
// This is a limitation we have to accept for React 18 function components without forwardRef
}
this.reactElement = <Component {...props} />
this.reactElement = <Component {...elementProps} />
editor?.contentComponent?.setRenderer(this.id, this)
}

View File

@ -5,6 +5,7 @@ export * from './NodeViewWrapper.js'
export * from './ReactMarkViewRenderer.js'
export * from './ReactNodeViewRenderer.js'
export * from './ReactRenderer.js'
export * from './types.js'
export * from './useEditor.js'
export * from './useEditorState.js'
export * from './useReactNodeView.js'

View File

@ -0,0 +1,6 @@
import type { NodeViewProps as CoreNodeViewProps } from '@tiptap/core'
import type React from 'react'
export type ReactNodeViewProps<T = HTMLElement> = CoreNodeViewProps & {
ref: React.RefObject<T>
}

View File

@ -74,18 +74,14 @@
"devDependencies": {
"@tiptap/core": "workspace:*",
"@tiptap/pm": "workspace:*",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"peerDependencies": {
"@tiptap/core": "workspace:*",
"@tiptap/pm": "workspace:*"
},
"optionalDependencies": {
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"@tiptap/pm": "workspace:*",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
},

View File

@ -37,13 +37,13 @@ importers:
version: 6.0.2(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.97.1(esbuild@0.24.2)))(webpack@5.97.1(esbuild@0.24.2))
'@testing-library/react':
specifier: 16.2.0
version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.5(@types/react@19.1.6))(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@types/react':
specifier: ^18.3.18
version: 18.3.18
specifier: ^19.0.0
version: 19.1.6
'@types/react-dom':
specifier: ^18.3.5
version: 18.3.5(@types/react@18.3.18)
specifier: ^19.0.0
version: 19.1.5(@types/react@19.1.6)
'@typescript-eslint/eslint-plugin':
specifier: ^8.19.0
version: 8.21.0(@typescript-eslint/parser@8.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)
@ -108,8 +108,8 @@ importers:
specifier: 3.3.3
version: 3.3.3
react:
specifier: ^18.0.0
version: 18.3.1
specifier: ^19.0.0
version: 19.1.0
tinyglobby:
specifier: 0.2.10
version: 0.2.10
@ -160,7 +160,7 @@ importers:
version: 2.15.0(y-protocols@1.0.6(yjs@13.6.23))(yjs@13.6.23)
'@lexical/react':
specifier: ^0.11.3
version: 0.11.3(lexical@0.11.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.23)
version: 0.11.3(lexical@0.11.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.23)
'@lifeomic/attempt':
specifier: 3.1.0
version: 3.1.0
@ -286,11 +286,11 @@ importers:
specifier: ^15.1.0
version: 15.1.0(postcss@8.5.1)
react:
specifier: ^18.3.1
version: 18.3.1
specifier: ^19.0.0
version: 19.1.0
react-dom:
specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
specifier: ^19.0.0
version: 19.1.0(react@19.1.0)
sass:
specifier: ^1.83.0
version: 1.83.4
@ -769,7 +769,7 @@ importers:
version: 3.1.3
use-sync-external-store:
specifier: ^1.4.0
version: 1.4.0(react@18.3.1)
version: 1.4.0(react@19.1.0)
optionalDependencies:
'@tiptap/extension-bubble-menu':
specifier: workspace:*
@ -791,11 +791,11 @@ importers:
specifier: ^18.3.5
version: 18.3.5(@types/react@18.3.18)
react:
specifier: ^18.3.1
version: 18.3.1
specifier: ^19.0.0
version: 19.1.0
react-dom:
specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
specifier: ^19.0.0
version: 19.1.0(react@19.1.0)
packages/starter-kit:
dependencies:
@ -873,19 +873,6 @@ importers:
version: link:../pm
packages/static-renderer:
optionalDependencies:
'@types/react':
specifier: ^18.2.14
version: 18.3.18
'@types/react-dom':
specifier: ^18.2.6
version: 18.3.5(@types/react@18.3.18)
react:
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0
version: 18.3.1
react-dom:
specifier: ^17.0.0 || ^18.0.0 || ^19.0.0
version: 18.3.1(react@18.3.1)
devDependencies:
'@tiptap/core':
specifier: workspace:*
@ -893,6 +880,18 @@ importers:
'@tiptap/pm':
specifier: workspace:*
version: link:../pm
'@types/react':
specifier: ^19.0.0
version: 19.1.6
'@types/react-dom':
specifier: ^19.0.0
version: 19.1.5(@types/react@19.1.6)
react:
specifier: ^19.0.0
version: 19.1.0
react-dom:
specifier: ^19.0.0
version: 19.1.0(react@19.1.0)
packages/suggestion:
devDependencies:
@ -2728,9 +2727,17 @@ packages:
peerDependencies:
'@types/react': ^18.0.0
'@types/react-dom@19.1.5':
resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==}
peerDependencies:
'@types/react': ^19.0.0
'@types/react@18.3.18':
resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==}
'@types/react@19.1.6':
resolution: {integrity: sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==}
'@types/sinonjs__fake-timers@8.1.1':
resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==}
@ -4934,10 +4941,6 @@ packages:
resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==}
engines: {node: '>=0.10.0'}
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
@ -5563,10 +5566,10 @@ packages:
randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
react-dom@18.3.1:
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
react-dom@19.1.0:
resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==}
peerDependencies:
react: ^18.3.1
react: ^19.1.0
react-error-boundary@3.1.4:
resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==}
@ -5584,8 +5587,8 @@ packages:
resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==}
engines: {node: '>=0.10.0'}
react@18.3.1:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
react@19.1.0:
resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==}
engines: {node: '>=0.10.0'}
read-cache@1.0.0:
@ -5765,8 +5768,8 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
scheduler@0.26.0:
resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
schema-utils@3.3.0:
resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
@ -8218,7 +8221,7 @@ snapshots:
'@lexical/utils': 0.11.3(lexical@0.11.3)
lexical: 0.11.3
'@lexical/react@0.11.3(lexical@0.11.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.23)':
'@lexical/react@0.11.3(lexical@0.11.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.23)':
dependencies:
'@lexical/clipboard': 0.11.3(lexical@0.11.3)
'@lexical/code': 0.11.3(lexical@0.11.3)
@ -8238,9 +8241,9 @@ snapshots:
'@lexical/utils': 0.11.3(lexical@0.11.3)
'@lexical/yjs': 0.11.3(lexical@0.11.3)(yjs@13.6.23)
lexical: 0.11.3
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-error-boundary: 3.1.4(react@18.3.1)
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
react-error-boundary: 3.1.4(react@19.1.0)
transitivePeerDependencies:
- yjs
@ -8584,15 +8587,15 @@ snapshots:
lz-string: 1.5.0
pretty-format: 27.5.1
'@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
'@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.5(@types/react@19.1.6))(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.0
'@testing-library/dom': 10.4.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
optionalDependencies:
'@types/react': 18.3.18
'@types/react-dom': 18.3.5(@types/react@18.3.18)
'@types/react': 19.1.6
'@types/react-dom': 19.1.5(@types/react@19.1.6)
'@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.24.1)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.23))(yjs@13.6.23)':
dependencies:
@ -8663,11 +8666,19 @@ snapshots:
dependencies:
'@types/react': 18.3.18
'@types/react-dom@19.1.5(@types/react@19.1.6)':
dependencies:
'@types/react': 19.1.6
'@types/react@18.3.18':
dependencies:
'@types/prop-types': 15.7.14
csstype: 3.1.3
'@types/react@19.1.6':
dependencies:
csstype: 3.1.3
'@types/sinonjs__fake-timers@8.1.1': {}
'@types/sizzle@2.3.9': {}
@ -11253,10 +11264,6 @@ snapshots:
longest@2.0.1: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
loupe@2.3.7:
dependencies:
get-func-name: 2.0.2
@ -11895,16 +11902,15 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
react-dom@18.3.1(react@18.3.1):
react-dom@19.1.0(react@19.1.0):
dependencies:
loose-envify: 1.4.0
react: 18.3.1
scheduler: 0.23.2
react: 19.1.0
scheduler: 0.26.0
react-error-boundary@3.1.4(react@18.3.1):
react-error-boundary@3.1.4(react@19.1.0):
dependencies:
'@babel/runtime': 7.26.0
react: 18.3.1
react: 19.1.0
react-is@17.0.2: {}
@ -11912,9 +11918,7 @@ snapshots:
react-refresh@0.13.0: {}
react@18.3.1:
dependencies:
loose-envify: 1.4.0
react@19.1.0: {}
read-cache@1.0.0:
dependencies:
@ -12135,9 +12139,7 @@ snapshots:
optionalDependencies:
'@parcel/watcher': 2.5.0
scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
scheduler@0.26.0: {}
schema-utils@3.3.0:
dependencies:
@ -12767,9 +12769,9 @@ snapshots:
url-join@5.0.0: {}
use-sync-external-store@1.4.0(react@18.3.1):
use-sync-external-store@1.4.0(react@19.1.0):
dependencies:
react: 18.3.1
react: 19.1.0
util-deprecate@1.0.2: {}