diff --git a/examples/07-collaboration/01-partykit/App.tsx b/examples/07-collaboration/01-partykit/App.tsx
index cecfb6767..f2304c7b5 100644
--- a/examples/07-collaboration/01-partykit/App.tsx
+++ b/examples/07-collaboration/01-partykit/App.tsx
@@ -4,13 +4,15 @@ import { BlockNoteView } from "@blocknote/mantine";
import "@blocknote/mantine/style.css";
import YPartyKitProvider from "y-partykit/provider";
import * as Y from "yjs";
+import { useEffect } from "react";
+import { useState } from "react";
// Sets up Yjs document and PartyKit Yjs provider.
const doc = new Y.Doc();
const provider = new YPartyKitProvider(
"blocknote-dev.yousefed.partykit.dev",
// Use a unique name as a "room" for your application.
- "your-project-name",
+ "your-project-name-nick",
doc
);
@@ -28,7 +30,36 @@ export default function App() {
},
},
});
+ const [forked, setForked] = useState(false);
+ useEffect(() => {
+ editor.on("forked", setForked);
+ }, [editor]);
// Renders the editor instance.
- return ;
+ return (
+ <>
+
+
+
+
+
Forked: {forked ? "Yes" : "No"}
+
+
+ >
+ );
}
diff --git a/package.json b/package.json
index a4a34feee..159c30fb6 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,10 @@
"canvas",
"esbuild",
"nx"
- ]
+ ],
+ "overrides": {
+ "yjs": "^14.0.0-0"
+ }
},
"packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808",
"private": true,
diff --git a/packages/core/package.json b/packages/core/package.json
index 8f26e5234..844f2bb07 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -77,8 +77,6 @@
"@tiptap/core": "^2.11.5",
"@tiptap/extension-bold": "^2.11.5",
"@tiptap/extension-code": "^2.11.5",
- "@tiptap/extension-collaboration": "^2.11.5",
- "@tiptap/extension-collaboration-cursor": "^2.11.5",
"@tiptap/extension-gapcursor": "^2.11.5",
"@tiptap/extension-history": "^2.11.5",
"@tiptap/extension-horizontal-rule": "^2.11.5",
@@ -111,9 +109,9 @@
"remark-stringify": "^11.0.0",
"unified": "^11.0.5",
"uuid": "^8.3.2",
- "y-prosemirror": "^1.3.4",
+ "y-prosemirror": "npm:@y/prosemirror@2.0.0-0",
"y-protocols": "^1.0.6",
- "yjs": "^13.6.15"
+ "yjs": "^14.0.0-0"
},
"devDependencies": {
"@types/emoji-mart": "^3.0.14",
diff --git a/packages/core/src/editor/BlockNoteEditor.ts b/packages/core/src/editor/BlockNoteEditor.ts
index f79362f90..6af37ec18 100644
--- a/packages/core/src/editor/BlockNoteEditor.ts
+++ b/packages/core/src/editor/BlockNoteEditor.ts
@@ -93,6 +93,7 @@ import {
import { Dictionary } from "../i18n/dictionary.js";
import { en } from "../i18n/locales/index.js";
+import { redo, undo } from "@tiptap/pm/history";
import {
TextSelection,
type Command,
@@ -101,8 +102,13 @@ import {
} from "@tiptap/pm/state";
import { dropCursor } from "prosemirror-dropcursor";
import { EditorView } from "prosemirror-view";
-import { undoCommand, redoCommand, ySyncPluginKey } from "y-prosemirror";
-import { undo, redo } from "@tiptap/pm/history";
+import {
+ redoCommand,
+ undoCommand,
+ yCursorPluginKey,
+ ySyncPluginKey,
+ yUndoPluginKey,
+} from "y-prosemirror";
import { createInternalHTMLSerializer } from "../api/exporters/html/internalHTMLSerializer.js";
import { inlineContentToNodes } from "../api/nodeConversions/blockToNode.js";
import { nodeToBlock } from "../api/nodeConversions/nodeToBlock.js";
@@ -113,8 +119,11 @@ import {
import { nestedListsToBlockNoteStructure } from "../api/parsers/html/util/nestedLists.js";
import { CodeBlockOptions } from "../blocks/CodeBlockContent/CodeBlockContent.js";
import type { ThreadStore, User } from "../comments/index.js";
+import { CursorPlugin } from "../extensions/Collaboration/CursorPlugin.js";
import "../style.css";
import { EventEmitter } from "../util/EventEmitter.js";
+import { SyncPlugin } from "../extensions/Collaboration/SyncPlugin.js";
+import { UndoPlugin } from "../extensions/Collaboration/UndoPlugin.js";
export type BlockNoteExtensionFactory = (
editor: BlockNoteEditor
@@ -124,6 +133,7 @@ export type BlockNoteExtension =
| AnyExtension
| {
plugin: Plugin;
+ priority?: number;
};
export type BlockCache<
@@ -393,6 +403,7 @@ export class BlockNoteEditor<
SSchema extends StyleSchema = DefaultStyleSchema
> extends EventEmitter<{
create: void;
+ forked: boolean;
}> {
/**
* The underlying prosemirror schema
@@ -472,6 +483,8 @@ export class BlockNoteEditor<
private readonly showSelectionPlugin: ShowSelectionPlugin;
+ private cursorPlugin: CursorPlugin;
+
/**
* The `uploadFile` method is what the editor uses when files need to be uploaded (for example when selecting an image to upload).
* This method should set when creating the editor as this is application-specific.
@@ -622,6 +635,7 @@ export class BlockNoteEditor<
this.tableHandles = this.extensions["tableHandles"] as any;
this.comments = this.extensions["comments"] as any;
this.showSelectionPlugin = this.extensions["showSelection"] as any;
+ this.cursorPlugin = this.extensions["yCursorPlugin"] as any;
if (newOptions.uploadFile) {
const uploadFile = newOptions.uploadFile;
@@ -643,7 +657,7 @@ export class BlockNoteEditor<
this.headless = newOptions._headless;
const collaborationEnabled =
- "collaboration" in this.extensions ||
+ "ySyncPlugin" in this.extensions ||
"liveblocksExtension" in this.extensions;
if (collaborationEnabled && newOptions.initialContent) {
@@ -696,6 +710,7 @@ export class BlockNoteEditor<
// "blocknote" extensions (prosemirror plugins)
return Extension.create({
name: key,
+ priority: ext.priority,
addProseMirrorPlugins: () => [ext.plugin],
});
}),
@@ -928,6 +943,139 @@ export class BlockNoteEditor<
};
}
+ /**
+ * To find a fragment in another ydoc, we need to search for it.
+ */
+ private findTypeInOtherYdoc>(
+ ytype: T,
+ otherYdoc: Y.Doc
+ ): T {
+ const ydoc = ytype.doc!;
+ if (ytype._item === null) {
+ /**
+ * If is a root type, we need to find the root key in the original ydoc
+ * and use it to get the type in the other ydoc.
+ */
+ const rootKey = Array.from(ydoc.share.keys()).find(
+ (key) => ydoc.share.get(key) === ytype
+ );
+ if (rootKey == null) {
+ throw new Error("type does not exist in other ydoc");
+ }
+ return otherYdoc.get(rootKey, ytype.constructor as new () => T) as T;
+ } else {
+ /**
+ * If it is a sub type, we use the item id to find the history type.
+ */
+ const ytypeItem = ytype._item;
+ const otherStructs =
+ otherYdoc.store.clients.get(ytypeItem.id.client) ?? [];
+ const itemIndex = Y.findIndexSS(otherStructs, ytypeItem.id.clock);
+ const otherItem = otherStructs[itemIndex] as Y.Item;
+ const otherContent = otherItem.content as Y.ContentType;
+ return otherContent.type as T;
+ }
+ }
+
+ /**
+ * Whether the editor is editing a forked document,
+ * preserving a reference to the original document and the forked document.
+ */
+ public get isForkedFromRemote() {
+ return this.forkedState !== undefined;
+ }
+
+ /**
+ * Stores whether the editor is editing a forked document,
+ * preserving a reference to the original document and the forked document.
+ */
+ private forkedState:
+ | {
+ originalFragment: Y.XmlFragment;
+ forkedFragment: Y.XmlFragment;
+ }
+ | undefined;
+
+ /**
+ * Fork the Y.js document from syncing to the remote,
+ * allowing modifications to the document without affecting the remote.
+ * These changes can later be rolled back or applied to the remote.
+ */
+ public forkYjsSync() {
+ if (this.forkedState) {
+ return;
+ }
+
+ const originalFragment = this.options.collaboration?.fragment;
+
+ if (!originalFragment) {
+ // No original fragment found, so no need to fork
+ return;
+ }
+
+ const doc = new Y.Doc();
+ // Copy the original document to a new Yjs document
+ Y.applyUpdate(doc, Y.encodeStateAsUpdate(originalFragment.doc!));
+
+ const update = Y.encodeStateAsUpdate(doc);
+ const blob = new Blob([update], { type: "application/octet-stream" });
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement("a");
+ a.href = url;
+ a.download = `${Date.now()}.update`;
+ document.body.appendChild(a);
+ a.click();
+ document.body.removeChild(a);
+ URL.revokeObjectURL(url);
+
+ // Find the forked fragment in the new Yjs document
+ const forkedFragment = this.findTypeInOtherYdoc(originalFragment, doc);
+
+ this.forkedState = {
+ originalFragment,
+ forkedFragment,
+ };
+
+ // Need to reset all the yjs plugins
+ [yCursorPluginKey, yUndoPluginKey, ySyncPluginKey].forEach((key) => {
+ this._tiptapEditor.unregisterPlugin(key);
+ });
+ // Register them again, based on the new forked fragment
+ this._tiptapEditor.registerPlugin(new SyncPlugin(forkedFragment).plugin);
+ this._tiptapEditor.registerPlugin(new UndoPlugin().plugin);
+ // No need to register the cursor plugin again, it's a local fork
+ this.emit("forked", true);
+ }
+
+ /**
+ * Resume syncing the Y.js document to the remote
+ * If `keepChanges` is true, any changes that have been made to the forked document will be applied to the original document.
+ * Otherwise, the original document will be restored and the changes will be discarded.
+ */
+ public resumeYjsSync(keepChanges = false) {
+ if (!this.forkedState) {
+ return;
+ }
+ // Remove the forked fragment's plugins
+ this._tiptapEditor.unregisterPlugin(ySyncPluginKey);
+ this._tiptapEditor.unregisterPlugin(yUndoPluginKey);
+
+ const { originalFragment, forkedFragment } = this.forkedState!;
+ if (keepChanges) {
+ // Apply any changes that have been made to the fork, onto the original doc
+ const update = Y.encodeStateAsUpdate(forkedFragment.doc!);
+ Y.applyUpdate(originalFragment.doc!, update);
+ }
+ // Register the plugins again, based on the original fragment
+ this._tiptapEditor.registerPlugin(new SyncPlugin(originalFragment).plugin);
+ this.cursorPlugin = new CursorPlugin(this.options.collaboration!);
+ this._tiptapEditor.registerPlugin(this.cursorPlugin.plugin);
+ this._tiptapEditor.registerPlugin(new UndoPlugin().plugin);
+ // Reset the forked state
+ this.forkedState = undefined;
+ this.emit("forked", false);
+ }
+
/**
* @deprecated, use `editor.document` instead
*/
@@ -1488,7 +1636,8 @@ export class BlockNoteEditor<
"Cannot update collaboration user info when collaboration is disabled."
);
}
- this._tiptapEditor.commands.updateUser(user);
+
+ this.cursorPlugin.updateUser(user);
}
/**
diff --git a/packages/core/src/editor/BlockNoteExtensions.ts b/packages/core/src/editor/BlockNoteExtensions.ts
index 932ca9128..b0c5db73b 100644
--- a/packages/core/src/editor/BlockNoteExtensions.ts
+++ b/packages/core/src/editor/BlockNoteExtensions.ts
@@ -10,7 +10,9 @@ import { createDropFileExtension } from "../api/clipboard/fromClipboard/fileDrop
import { createPasteFromClipboardExtension } from "../api/clipboard/fromClipboard/pasteExtension.js";
import { createCopyToClipboardExtension } from "../api/clipboard/toClipboard/copyExtension.js";
import { BackgroundColorExtension } from "../extensions/BackgroundColor/BackgroundColorExtension.js";
-import { createCollaborationExtensions } from "../extensions/Collaboration/createCollaborationExtensions.js";
+import { CursorPlugin } from "../extensions/Collaboration/CursorPlugin.js";
+import { UndoPlugin } from "../extensions/Collaboration/UndoPlugin.js";
+import { SyncPlugin } from "../extensions/Collaboration/SyncPlugin.js";
import { CommentMark } from "../extensions/Comments/CommentMark.js";
import { CommentsPlugin } from "../extensions/Comments/CommentsPlugin.js";
import type { ThreadStore } from "../comments/index.js";
@@ -106,6 +108,15 @@ export const getBlockNoteExtensions = <
ret[ext.name] = ext;
}
+ if (opts.collaboration) {
+ ret["ySyncPlugin"] = new SyncPlugin(opts.collaboration.fragment);
+ ret["yUndoPlugin"] = new UndoPlugin();
+
+ if (opts.collaboration.provider?.awareness) {
+ ret["yCursorPlugin"] = new CursorPlugin(opts.collaboration);
+ }
+ }
+
// Note: this is pretty hardcoded and will break when user provides plugins with same keys.
// Define name on plugins instead and not make this a map?
ret["formattingToolbar"] = new FormattingToolbarProsemirrorPlugin(
@@ -285,10 +296,8 @@ const getTipTapExtensions = <
LINKIFY_INITIALIZED = true;
- if (opts.collaboration) {
- tiptapExtensions.push(...createCollaborationExtensions(opts.collaboration));
- } else {
- // disable history extension when collaboration is enabled as Yjs takes care of undo / redo
+ if (!opts.collaboration) {
+ // disable history extension when collaboration is enabled as y-prosemirror takes care of undo / redo
tiptapExtensions.push(History);
}
diff --git a/packages/core/src/extensions/Collaboration/CursorPlugin.ts b/packages/core/src/extensions/Collaboration/CursorPlugin.ts
new file mode 100644
index 000000000..d6acf74c8
--- /dev/null
+++ b/packages/core/src/extensions/Collaboration/CursorPlugin.ts
@@ -0,0 +1,152 @@
+import { Plugin } from "prosemirror-state";
+import { defaultSelectionBuilder, yCursorPlugin } from "y-prosemirror";
+import { Awareness } from "y-protocols/awareness.js";
+import * as Y from "yjs";
+
+export type CollaborationUser = {
+ name: string;
+ color: string;
+ [key: string]: string;
+};
+
+export class CursorPlugin {
+ public plugin: Plugin;
+ private provider: { awareness: Awareness };
+ private recentlyUpdatedCursors: Map<
+ number,
+ { element: HTMLElement; hideTimeout: NodeJS.Timeout | undefined }
+ >;
+ constructor(
+ private collaboration: {
+ fragment: Y.XmlFragment;
+ user: CollaborationUser;
+ provider: { awareness: Awareness };
+ renderCursor?: (user: CollaborationUser) => HTMLElement;
+ showCursorLabels?: "always" | "activity";
+ }
+ ) {
+ this.provider = collaboration.provider;
+ this.recentlyUpdatedCursors = new Map();
+
+ this.provider.awareness.setLocalStateField("user", collaboration.user);
+
+ if (collaboration.showCursorLabels !== "always") {
+ this.provider.awareness.on(
+ "change",
+ ({
+ updated,
+ }: {
+ added: Array;
+ updated: Array;
+ removed: Array;
+ }) => {
+ for (const clientID of updated) {
+ const cursor = this.recentlyUpdatedCursors.get(clientID);
+
+ if (cursor) {
+ cursor.element.setAttribute("data-active", "");
+
+ if (cursor.hideTimeout) {
+ clearTimeout(cursor.hideTimeout);
+ }
+
+ this.recentlyUpdatedCursors.set(clientID, {
+ element: cursor.element,
+ hideTimeout: setTimeout(() => {
+ cursor.element.removeAttribute("data-active");
+ }, 2000),
+ });
+ }
+ }
+ }
+ );
+ }
+
+ this.plugin = yCursorPlugin(this.provider.awareness, {
+ selectionBuilder: defaultSelectionBuilder,
+ cursorBuilder: this.renderCursor,
+ });
+ }
+
+ public get priority() {
+ return 999;
+ }
+
+ private renderCursor = (user: CollaborationUser, clientID: number) => {
+ let cursorData = this.recentlyUpdatedCursors.get(clientID);
+
+ if (!cursorData) {
+ const cursorElement = (
+ this.collaboration.renderCursor ?? CursorPlugin.defaultCursorRender
+ )(user);
+
+ if (this.collaboration.showCursorLabels !== "always") {
+ cursorElement.addEventListener("mouseenter", () => {
+ const cursor = this.recentlyUpdatedCursors.get(clientID)!;
+ cursor.element.setAttribute("data-active", "");
+
+ if (cursor.hideTimeout) {
+ clearTimeout(cursor.hideTimeout);
+ this.recentlyUpdatedCursors.set(clientID, {
+ element: cursor.element,
+ hideTimeout: undefined,
+ });
+ }
+ });
+
+ cursorElement.addEventListener("mouseleave", () => {
+ const cursor = this.recentlyUpdatedCursors.get(clientID)!;
+
+ this.recentlyUpdatedCursors.set(clientID, {
+ element: cursor.element,
+ hideTimeout: setTimeout(() => {
+ cursor.element.removeAttribute("data-active");
+ }, 2000),
+ });
+ });
+ }
+
+ cursorData = {
+ element: cursorElement,
+ hideTimeout: undefined,
+ };
+
+ this.recentlyUpdatedCursors.set(clientID, cursorData);
+ }
+
+ return cursorData.element;
+ };
+
+ public updateUser = (user: {
+ name: string;
+ color: string;
+ [key: string]: string;
+ }) => {
+ this.provider.awareness.setLocalStateField("user", user);
+ };
+
+ public static defaultCursorRender = (user: CollaborationUser) => {
+ const cursorElement = document.createElement("span");
+
+ cursorElement.classList.add("bn-collaboration-cursor__base");
+
+ const caretElement = document.createElement("span");
+ caretElement.setAttribute("contentedEditable", "false");
+ caretElement.classList.add("bn-collaboration-cursor__caret");
+ caretElement.setAttribute("style", `background-color: ${user.color}`);
+
+ const labelElement = document.createElement("span");
+
+ labelElement.classList.add("bn-collaboration-cursor__label");
+ labelElement.setAttribute("style", `background-color: ${user.color}`);
+ labelElement.insertBefore(document.createTextNode(user.name), null);
+
+ caretElement.insertBefore(labelElement, null);
+
+ cursorElement.insertBefore(document.createTextNode("\u2060"), null); // Non-breaking space
+ cursorElement.insertBefore(caretElement, null);
+ cursorElement.insertBefore(document.createTextNode("\u2060"), null); // Non-breaking space
+
+ return cursorElement;
+ };
+}
diff --git a/packages/core/src/extensions/Collaboration/SyncPlugin.ts b/packages/core/src/extensions/Collaboration/SyncPlugin.ts
new file mode 100644
index 000000000..00e3cc700
--- /dev/null
+++ b/packages/core/src/extensions/Collaboration/SyncPlugin.ts
@@ -0,0 +1,15 @@
+import { Plugin } from "prosemirror-state";
+import { ySyncPlugin } from "y-prosemirror";
+import type * as Y from "yjs";
+
+export class SyncPlugin {
+ public plugin: Plugin;
+
+ constructor(fragment: Y.XmlFragment) {
+ this.plugin = ySyncPlugin(fragment);
+ }
+
+ public get priority() {
+ return 1001;
+ }
+}
diff --git a/packages/core/src/extensions/Collaboration/UndoPlugin.ts b/packages/core/src/extensions/Collaboration/UndoPlugin.ts
new file mode 100644
index 000000000..87d39ee5e
--- /dev/null
+++ b/packages/core/src/extensions/Collaboration/UndoPlugin.ts
@@ -0,0 +1,14 @@
+import { Plugin } from "prosemirror-state";
+import { yUndoPlugin } from "y-prosemirror";
+
+export class UndoPlugin {
+ public plugin: Plugin;
+
+ constructor() {
+ this.plugin = yUndoPlugin();
+ }
+
+ public get priority() {
+ return 1000;
+ }
+}
diff --git a/packages/core/src/extensions/Collaboration/createCollaborationExtensions.ts b/packages/core/src/extensions/Collaboration/createCollaborationExtensions.ts
deleted file mode 100644
index 919c3029f..000000000
--- a/packages/core/src/extensions/Collaboration/createCollaborationExtensions.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-import Collaboration from "@tiptap/extension-collaboration";
-import CollaborationCursor from "@tiptap/extension-collaboration-cursor";
-import { Awareness } from "y-protocols/awareness";
-import * as Y from "yjs";
-
-export const createCollaborationExtensions = (collaboration: {
- fragment: Y.XmlFragment;
- user: {
- name: string;
- color: string;
- [key: string]: string;
- };
- provider: any;
- renderCursor?: (user: any) => HTMLElement;
- showCursorLabels?: "always" | "activity";
-}) => {
- const tiptapExtensions = [];
-
- tiptapExtensions.push(
- Collaboration.configure({
- fragment: collaboration.fragment,
- })
- );
-
- const awareness = collaboration.provider?.awareness as Awareness | undefined;
-
- if (awareness) {
- const cursors = new Map<
- number,
- { element: HTMLElement; hideTimeout: NodeJS.Timeout | undefined }
- >();
-
- if (collaboration.showCursorLabels !== "always") {
- awareness.on(
- "change",
- ({
- updated,
- }: {
- added: Array;
- updated: Array;
- removed: Array;
- }) => {
- for (const clientID of updated) {
- const cursor = cursors.get(clientID);
-
- if (cursor) {
- cursor.element.setAttribute("data-active", "");
-
- if (cursor.hideTimeout) {
- clearTimeout(cursor.hideTimeout);
- }
-
- cursors.set(clientID, {
- element: cursor.element,
- hideTimeout: setTimeout(() => {
- cursor.element.removeAttribute("data-active");
- }, 2000),
- });
- }
- }
- }
- );
- }
-
- const renderCursor = (user: { name: string; color: string }) => {
- const cursorElement = document.createElement("span");
-
- cursorElement.classList.add("bn-collaboration-cursor__base");
-
- const caretElement = document.createElement("span");
- caretElement.setAttribute("contentedEditable", "false");
- caretElement.classList.add("bn-collaboration-cursor__caret");
- caretElement.setAttribute("style", `background-color: ${user.color}`);
-
- const labelElement = document.createElement("span");
-
- labelElement.classList.add("bn-collaboration-cursor__label");
- labelElement.setAttribute("style", `background-color: ${user.color}`);
- labelElement.insertBefore(document.createTextNode(user.name), null);
-
- caretElement.insertBefore(labelElement, null);
-
- cursorElement.insertBefore(document.createTextNode("\u2060"), null); // Non-breaking space
- cursorElement.insertBefore(caretElement, null);
- cursorElement.insertBefore(document.createTextNode("\u2060"), null); // Non-breaking space
-
- return cursorElement;
- };
-
- const render = (
- user: { color: string; name: string },
- clientID: number
- ) => {
- let cursorData = cursors.get(clientID);
-
- if (!cursorData) {
- const cursorElement =
- collaboration?.renderCursor?.(user) || renderCursor(user);
-
- if (collaboration?.showCursorLabels !== "always") {
- cursorElement.addEventListener("mouseenter", () => {
- const cursor = cursors.get(clientID)!;
- cursor.element.setAttribute("data-active", "");
-
- if (cursor.hideTimeout) {
- clearTimeout(cursor.hideTimeout);
- cursors.set(clientID, {
- element: cursor.element,
- hideTimeout: undefined,
- });
- }
- });
-
- cursorElement.addEventListener("mouseleave", () => {
- const cursor = cursors.get(clientID)!;
-
- cursors.set(clientID, {
- element: cursor.element,
- hideTimeout: setTimeout(() => {
- cursor.element.removeAttribute("data-active");
- }, 2000),
- });
- });
- }
-
- cursorData = {
- element: cursorElement,
- hideTimeout: undefined,
- };
-
- cursors.set(clientID, cursorData);
- }
-
- return cursorData.element;
- };
-
- tiptapExtensions.push(
- CollaborationCursor.configure({
- user: collaboration.user,
- render: render as any, // tiptap type not compatible with latest y-prosemirror
- provider: collaboration.provider,
- })
- );
- }
-
- return tiptapExtensions;
-};
diff --git a/packages/core/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts b/packages/core/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts
index 6bd69d978..d0abda0ab 100644
--- a/packages/core/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts
+++ b/packages/core/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts
@@ -605,6 +605,9 @@ export const KeyboardShortcutsExtension = Extension.create<{
this.options.editor.moveBlocksDown();
return true;
},
+ "Mod-z": () => this.options.editor.undo(),
+ "Mod-y": () => this.options.editor.redo(),
+ "Shift-Mod-z": () => this.options.editor.redo(),
};
},
});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a11febbcb..6ffca16b5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4,6 +4,9 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+overrides:
+ yjs: ^14.0.0-0
+
importers:
.:
@@ -135,8 +138,8 @@ importers:
specifier: ^0.0.25
version: 0.0.25
yjs:
- specifier: ^13.6.15
- version: 13.6.24
+ specifier: ^14.0.0-0
+ version: 14.0.0-4
devDependencies:
'@types/node':
specifier: ^20
@@ -2400,8 +2403,8 @@ importers:
specifier: ^0.0.25
version: 0.0.25
yjs:
- specifier: ^13.6.15
- version: 13.6.24
+ specifier: ^14.0.0-0
+ version: 14.0.0-4
devDependencies:
'@types/react':
specifier: ^18.0.25
@@ -2441,10 +2444,10 @@ importers:
version: 2.23.1(react@18.3.1)
'@liveblocks/react-blocknote':
specifier: ^2.23.1
- version: 2.23.1(a9fafa167a137f224b16cac05e678ac8)
+ version: 2.23.1(5ccc4b160c9122137e1878732f35766c)
'@liveblocks/react-tiptap':
specifier: ^2.23.1
- version: 2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@13.6.24))
+ version: 2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@14.0.0-4))
'@liveblocks/react-ui':
specifier: ^2.23.1
version: 2.23.1(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -2455,8 +2458,8 @@ importers:
specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
yjs:
- specifier: ^13.6.15
- version: 13.6.24
+ specifier: ^14.0.0-0
+ version: 14.0.0-4
devDependencies:
'@types/react':
specifier: ^18.0.25
@@ -2490,7 +2493,7 @@ importers:
version: link:../../../packages/shadcn
'@y-sweet/react':
specifier: ^0.6.3
- version: 0.6.4(react@18.3.1)(yjs@13.6.24)
+ version: 0.6.4(react@18.3.1)(yjs@14.0.0-4)
react:
specifier: ^18.3.1
version: 18.3.1
@@ -2533,7 +2536,7 @@ importers:
version: 7.17.3(@mantine/hooks@7.17.3(react@18.3.1))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@y-sweet/react':
specifier: ^0.6.3
- version: 0.6.4(react@18.3.1)(yjs@13.6.24)
+ version: 0.6.4(react@18.3.1)(yjs@14.0.0-4)
react:
specifier: ^18.3.1
version: 18.3.1
@@ -2576,7 +2579,7 @@ importers:
version: 7.17.3(@mantine/hooks@7.17.3(react@18.3.1))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@y-sweet/react':
specifier: ^0.6.3
- version: 0.6.4(react@18.3.1)(yjs@13.6.24)
+ version: 0.6.4(react@18.3.1)(yjs@14.0.0-4)
react:
specifier: ^18.3.1
version: 18.3.1
@@ -2866,12 +2869,6 @@ importers:
'@tiptap/extension-code':
specifier: ^2.11.5
version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))
- '@tiptap/extension-collaboration':
- specifier: ^2.11.5
- version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24))
- '@tiptap/extension-collaboration-cursor':
- specifier: ^2.11.5
- version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24))
'@tiptap/extension-gapcursor':
specifier: ^2.11.5
version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)
@@ -2969,14 +2966,14 @@ importers:
specifier: ^8.3.2
version: 8.3.2
y-prosemirror:
- specifier: ^1.3.4
- version: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)
+ specifier: npm:@y/prosemirror@2.0.0-0
+ version: '@y/prosemirror@2.0.0-0(@y/protocols@1.0.6-1(yjs@14.0.0-4))(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(yjs@14.0.0-4)'
y-protocols:
specifier: ^1.0.6
- version: 1.0.6(yjs@13.6.24)
+ version: 1.0.6(yjs@14.0.0-4)
yjs:
- specifier: ^13.6.15
- version: 13.6.24
+ specifier: ^14.0.0-0
+ version: 14.0.0-4
devDependencies:
'@types/emoji-mart':
specifier: ^3.0.14
@@ -3219,13 +3216,13 @@ importers:
version: 18.3.1(react@18.3.1)
y-prosemirror:
specifier: ^1.3.4
- version: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)
+ version: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)
y-protocols:
specifier: ^1.0.6
- version: 1.0.6(yjs@13.6.24)
+ version: 1.0.6(yjs@14.0.0-4)
yjs:
- specifier: ^13.6.15
- version: 13.6.24
+ specifier: ^14.0.0-0
+ version: 14.0.0-4
devDependencies:
'@types/jsdom':
specifier: ^21.1.7
@@ -3678,10 +3675,10 @@ importers:
version: 2.23.1(react@18.3.1)
'@liveblocks/react-blocknote':
specifier: ^2.23.1
- version: 2.23.1(a9fafa167a137f224b16cac05e678ac8)
+ version: 2.23.1(5ccc4b160c9122137e1878732f35766c)
'@liveblocks/react-tiptap':
specifier: ^2.23.1
- version: 2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@13.6.24))
+ version: 2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@14.0.0-4))
'@liveblocks/react-ui':
specifier: ^2.23.1
version: 2.23.1(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -3729,7 +3726,7 @@ importers:
version: 3.6.8(@uppy/core@3.13.1)
'@y-sweet/react':
specifier: ^0.6.3
- version: 0.6.4(react@18.3.1)(yjs@13.6.24)
+ version: 0.6.4(react@18.3.1)(yjs@14.0.0-4)
autoprefixer:
specifier: 10.4.21
version: 10.4.21(postcss@8.5.3)
@@ -3752,8 +3749,8 @@ importers:
specifier: ^0.0.25
version: 0.0.25
yjs:
- specifier: ^13.6.15
- version: 13.6.24
+ specifier: ^14.0.0-0
+ version: 14.0.0-4
devDependencies:
'@types/react':
specifier: ^18.0.25
@@ -5565,7 +5562,7 @@ packages:
'@liveblocks/yjs@2.23.1':
resolution: {integrity: sha512-fGSWQ+SD7b0B/aY5rcqunH5MAudsxCtf+IXdIW9OR4czOcHLFeB9kJEgg1WcU8erfqevlEcIv3+VMjEn2dAiKA==}
peerDependencies:
- yjs: ^13.6.1
+ yjs: ^14.0.0-0
'@mantine/core@7.17.3':
resolution: {integrity: sha512-N/AfV5eMnfEMx9WzI7AU5pNFBEzAfT/KtE2XDKS+0ht6RifUmolIxyIvoGMYz2yUEsCBMJZqmBq33Rabf5W7Ug==}
@@ -7833,17 +7830,33 @@ packages:
'@y-sweet/client@0.6.4':
resolution: {integrity: sha512-dRfnMulK9HJWzm1BnmViZP93FZ/RrXlIN3Uke3f9iIDDDFLPQs5YBDWZ4dc24Hd8/BnX/Xe/uZzDJcAvENx3fw==}
peerDependencies:
- yjs: ^13.0.0
+ yjs: ^14.0.0-0
'@y-sweet/react@0.6.4':
resolution: {integrity: sha512-FotyT2MN+wicBl3tHm7CrkJUQu2YFIkOQ7w6DAQTVs6/o+/8kuL7a2svKL15mMAR1TVary1GSCASyRix9VqUCA==}
peerDependencies:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
- yjs: ^13
+ yjs: ^14.0.0-0
'@y-sweet/sdk@0.6.4':
resolution: {integrity: sha512-px51qSbckGrucN83BM9jJyaBLLdYFT+zhvsootK+WW9t/9rQSQHQX54gdtF6M1kUktA4jOGfSiAXDzuTY0zYVg==}
+ '@y/prosemirror@2.0.0-0':
+ resolution: {integrity: sha512-k3FUjUWJpt+qT94q5HVp/2dxURMpwIIr8Dd3j1F1s5HIZI5oevm30cgoVlS6ys7zwdyAGZzfpL5SnFvTYfH6hw==}
+ engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+ peerDependencies:
+ '@y/protocols': ^1.0.6-1
+ prosemirror-model: ^1.7.1
+ prosemirror-state: ^1.2.3
+ prosemirror-view: ^1.9.10
+ yjs: ^14.0.0-0
+
+ '@y/protocols@1.0.6-1':
+ resolution: {integrity: sha512-6hyVR4Azg+JVqeyCkPQMsg9BMpB7fgAldsIDwb5EqJTPLXkQuk/mqK/j0rvIZUuPvJjlYSDBIOQWNsy92iXQsQ==}
+ engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+ peerDependencies:
+ yjs: ^14.0.0-0
+
'@yarnpkg/lockfile@1.1.0':
resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==}
@@ -10187,6 +10200,11 @@ packages:
engines: {node: '>=16'}
hasBin: true
+ lib0@0.2.105:
+ resolution: {integrity: sha512-5vtbuBi2P43ZYOfVMV+TZYkWEa0J9kijXirzEgrPA+nJDQCtMx805/rqW4G1nXbM9IRIhwW+OyNNgcQdbhKfSw==}
+ engines: {node: '>=16'}
+ hasBin: true
+
lie@3.3.0:
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
@@ -12979,7 +12997,7 @@ packages:
resolution: {integrity: sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==}
engines: {node: '>=16.0.0', npm: '>=8.0.0'}
peerDependencies:
- yjs: ^13.0.0
+ yjs: ^14.0.0-0
y-partykit@0.0.25:
resolution: {integrity: sha512-/EIL73TuYX6lYnxM4mb/kTTKllS1vNjBXk9KJXFwTXFrUqMo8hbJMqnE+glvBG2EDejEI06rk3jR50lpDB8Dqg==}
@@ -12992,13 +13010,13 @@ packages:
prosemirror-state: ^1.2.3
prosemirror-view: ^1.9.10
y-protocols: ^1.0.1
- yjs: ^13.5.38
+ yjs: ^14.0.0-0
y-protocols@1.0.6:
resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==}
engines: {node: '>=16.0.0', npm: '>=8.0.0'}
peerDependencies:
- yjs: ^13.0.0
+ yjs: ^14.0.0-0
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
@@ -13034,6 +13052,10 @@ packages:
resolution: {integrity: sha512-xn/pYLTZa3uD1uDG8lpxfLRo5SR/rp0frdASOl2a71aYNvUXdWcLtVL91s2y7j+Q8ppmjZ9H3jsGVgoFMbT2VA==}
engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+ yjs@14.0.0-4:
+ resolution: {integrity: sha512-HD0uhG537bS3Gy8DNoXy/DWdxMAAaJ+30myQ+jTSTtiJ7LfUflicgx6RweYQ4qjho1gSq9/s8v3ydt13Sip+YQ==}
+ engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
@@ -15011,16 +15033,16 @@ snapshots:
'@liveblocks/core@2.23.1': {}
- '@liveblocks/react-blocknote@2.23.1(a9fafa167a137f224b16cac05e678ac8)':
+ '@liveblocks/react-blocknote@2.23.1(5ccc4b160c9122137e1878732f35766c)':
dependencies:
'@blocknote/core': link:packages/core
'@blocknote/react': link:packages/react
'@liveblocks/client': 2.23.1
'@liveblocks/core': 2.23.1
'@liveblocks/react': 2.23.1(react@18.3.1)
- '@liveblocks/react-tiptap': 2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@13.6.24))
+ '@liveblocks/react-tiptap': 2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@14.0.0-4))
'@liveblocks/react-ui': 2.23.1(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@liveblocks/yjs': 2.23.1(yjs@13.6.24)
+ '@liveblocks/yjs': 2.23.1(yjs@14.0.0-4)
'@tiptap/core': 2.11.5(@tiptap/pm@2.11.5)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
@@ -15040,27 +15062,27 @@ snapshots:
- y-protocols
- yjs
- '@liveblocks/react-tiptap@2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@13.6.24))':
+ '@liveblocks/react-tiptap@2.23.1(@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)))(@tiptap/pm@2.11.5)(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@tiptap/suggestion@2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-protocols@1.0.6(yjs@14.0.0-4))':
dependencies:
'@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@liveblocks/client': 2.23.1
'@liveblocks/core': 2.23.1
'@liveblocks/react': 2.23.1(react@18.3.1)
'@liveblocks/react-ui': 2.23.1(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@liveblocks/yjs': 2.23.1(yjs@13.6.24)
+ '@liveblocks/yjs': 2.23.1(yjs@14.0.0-4)
'@radix-ui/react-select': 2.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@radix-ui/react-toggle': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tiptap/core': 2.11.5(@tiptap/pm@2.11.5)
- '@tiptap/extension-collaboration': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24))
- '@tiptap/extension-collaboration-cursor': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24))
+ '@tiptap/extension-collaboration': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4))
+ '@tiptap/extension-collaboration-cursor': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4))
'@tiptap/pm': 2.11.5
'@tiptap/react': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tiptap/suggestion': 2.11.7(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)
cmdk: 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- y-prosemirror: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)
- yjs: 13.6.24
+ y-prosemirror: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)
+ yjs: 14.0.0-4
transitivePeerDependencies:
- '@types/react'
- '@types/react-dom'
@@ -15097,13 +15119,13 @@ snapshots:
'@liveblocks/core': 2.23.1
react: 18.3.1
- '@liveblocks/yjs@2.23.1(yjs@13.6.24)':
+ '@liveblocks/yjs@2.23.1(yjs@14.0.0-4)':
dependencies:
'@liveblocks/client': 2.23.1
'@liveblocks/core': 2.23.1
js-base64: 3.7.7
- y-indexeddb: 9.0.12(yjs@13.6.24)
- yjs: 13.6.24
+ y-indexeddb: 9.0.12(yjs@14.0.0-4)
+ yjs: 14.0.0-4
'@mantine/core@7.17.3(@mantine/hooks@7.17.3(react@18.3.1))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
@@ -16995,16 +17017,16 @@ snapshots:
dependencies:
'@tiptap/core': 2.11.5(@tiptap/pm@2.11.5)
- '@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24))':
+ '@tiptap/extension-collaboration-cursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4))':
dependencies:
'@tiptap/core': 2.11.5(@tiptap/pm@2.11.5)
- y-prosemirror: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)
+ y-prosemirror: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)
- '@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24))':
+ '@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4))':
dependencies:
'@tiptap/core': 2.11.5(@tiptap/pm@2.11.5)
'@tiptap/pm': 2.11.5
- y-prosemirror: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24)
+ y-prosemirror: 1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4)
'@tiptap/extension-floating-menu@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)':
dependencies:
@@ -17780,24 +17802,38 @@ snapshots:
'@xtuc/long@4.2.2': {}
- '@y-sweet/client@0.6.4(yjs@13.6.24)':
+ '@y-sweet/client@0.6.4(yjs@14.0.0-4)':
dependencies:
'@y-sweet/sdk': 0.6.4
- y-protocols: 1.0.6(yjs@13.6.24)
- yjs: 13.6.24
+ y-protocols: 1.0.6(yjs@14.0.0-4)
+ yjs: 14.0.0-4
- '@y-sweet/react@0.6.4(react@18.3.1)(yjs@13.6.24)':
+ '@y-sweet/react@0.6.4(react@18.3.1)(yjs@14.0.0-4)':
dependencies:
- '@y-sweet/client': 0.6.4(yjs@13.6.24)
+ '@y-sweet/client': 0.6.4(yjs@14.0.0-4)
'@y-sweet/sdk': 0.6.4
react: 18.3.1
- y-protocols: 1.0.6(yjs@13.6.24)
- yjs: 13.6.24
+ y-protocols: 1.0.6(yjs@14.0.0-4)
+ yjs: 14.0.0-4
'@y-sweet/sdk@0.6.4':
dependencies:
'@types/node': 20.17.28
+ '@y/prosemirror@2.0.0-0(@y/protocols@1.0.6-1(yjs@14.0.0-4))(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(yjs@14.0.0-4)':
+ dependencies:
+ '@y/protocols': 1.0.6-1(yjs@14.0.0-4)
+ lib0: 0.2.101
+ prosemirror-model: 1.25.0
+ prosemirror-state: 1.4.3
+ prosemirror-view: 1.38.1
+ yjs: 14.0.0-4
+
+ '@y/protocols@1.0.6-1(yjs@14.0.0-4)':
+ dependencies:
+ lib0: 0.2.101
+ yjs: 14.0.0-4
+
'@yarnpkg/lockfile@1.1.0': {}
'@yarnpkg/parsers@3.0.2':
@@ -20592,6 +20628,10 @@ snapshots:
dependencies:
isomorphic.js: 0.2.5
+ lib0@0.2.105:
+ dependencies:
+ isomorphic.js: 0.2.5
+
lie@3.3.0:
dependencies:
immediate: 3.0.6
@@ -24293,33 +24333,38 @@ snapshots:
xtend@4.0.2: {}
- y-indexeddb@9.0.12(yjs@13.6.24):
+ y-indexeddb@9.0.12(yjs@14.0.0-4):
dependencies:
lib0: 0.2.101
- yjs: 13.6.24
+ yjs: 14.0.0-4
y-partykit@0.0.25:
dependencies:
lib0: 0.2.101
lodash.debounce: 4.0.8
react: 18.3.1
- y-protocols: 1.0.6(yjs@13.6.24)
- yjs: 13.6.24
+ y-protocols: 1.0.6(yjs@14.0.0-4)
+ yjs: 14.0.0-4
- y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@13.6.24))(yjs@13.6.24):
+ y-prosemirror@1.3.4(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1)(y-protocols@1.0.6(yjs@14.0.0-4))(yjs@14.0.0-4):
dependencies:
lib0: 0.2.101
prosemirror-model: 1.25.0
prosemirror-state: 1.4.3
prosemirror-view: 1.38.1
- y-protocols: 1.0.6(yjs@13.6.24)
- yjs: 13.6.24
+ y-protocols: 1.0.6(yjs@14.0.0-4)
+ yjs: 14.0.0-4
y-protocols@1.0.6(yjs@13.6.24):
dependencies:
lib0: 0.2.101
yjs: 13.6.24
+ y-protocols@1.0.6(yjs@14.0.0-4):
+ dependencies:
+ lib0: 0.2.101
+ yjs: 14.0.0-4
+
y18n@5.0.8: {}
yallist@2.1.2: {}
@@ -24349,6 +24394,10 @@ snapshots:
dependencies:
lib0: 0.2.101
+ yjs@14.0.0-4:
+ dependencies:
+ lib0: 0.2.105
+
yocto-queue@0.1.0: {}
yoga-layout@3.2.1: {}