From 0137bb9d5512060260691ae01286b5fe7ac0c255 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 2 Sep 2025 14:23:51 -0700 Subject: [PATCH 1/2] Tiptap comments: filter out orphans (#2631) --- CHANGELOG.md | 7 +++++++ .../src/comments/CommentsExtension.ts | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30ed3300417..2e64ae5a623 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## vNEXT (not yet published) +## v3.5.2 + ### `@liveblocks/core` - Throttle incoming AI delta updates to prevent excessive re-renders during fast @@ -7,6 +9,11 @@ - Optimized partial JSON parser for improved tool invocation streaming performance. +### `@liveblocks/react-tiptap` + +- Fixes a bug where the a comment could not be selected if it was within a + previously deleted comment. + ## v3.5.1 ### `@liveblocks/react-tiptap` diff --git a/packages/liveblocks-react-tiptap/src/comments/CommentsExtension.ts b/packages/liveblocks-react-tiptap/src/comments/CommentsExtension.ts index 3c36fa485b0..96a62a9b63e 100644 --- a/packages/liveblocks-react-tiptap/src/comments/CommentsExtension.ts +++ b/packages/liveblocks-react-tiptap/src/comments/CommentsExtension.ts @@ -215,10 +215,10 @@ const Comment = Mark.create({ return; } const commentMark = node.marks.find( - (mark) => mark.type === this.type + (mark) => mark.type === this.type && !mark.attrs.orphan ); - // don't allow selecting orphaned threads - if (commentMark?.attrs.orphan) { + // nothing to select + if (!commentMark) { selectThread(null); return; } From 0f1b0ff87a162b49d56dca4074d8d91c8bed00ab Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <> Date: Tue, 2 Sep 2025 21:29:40 +0000 Subject: [PATCH 2/2] Bump to 3.5.2 --- package-lock.json | 98 +++++++++---------- packages/liveblocks-client/package.json | 4 +- packages/liveblocks-core/package.json | 2 +- packages/liveblocks-emails/package.json | 6 +- packages/liveblocks-node-lexical/package.json | 6 +- .../liveblocks-node-prosemirror/package.json | 6 +- packages/liveblocks-node/package.json | 4 +- .../liveblocks-react-blocknote/package.json | 14 +-- .../liveblocks-react-lexical/package.json | 12 +-- packages/liveblocks-react-tiptap/package.json | 12 +-- packages/liveblocks-react-ui/package.json | 8 +- packages/liveblocks-react/package.json | 6 +- packages/liveblocks-redux/package.json | 6 +- packages/liveblocks-yjs/package.json | 6 +- packages/liveblocks-zustand/package.json | 6 +- 15 files changed, 98 insertions(+), 98 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00584b8c8c5..829498b52ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37081,10 +37081,10 @@ }, "packages/liveblocks-client": { "name": "@liveblocks/client", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.5.1" + "@liveblocks/core": "3.5.2" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37093,7 +37093,7 @@ }, "packages/liveblocks-core": { "name": "@liveblocks/core", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37111,11 +37111,11 @@ }, "packages/liveblocks-emails": { "name": "@liveblocks/emails", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.5.1", - "@liveblocks/node": "3.5.1" + "@liveblocks/core": "3.5.2", + "@liveblocks/node": "3.5.2" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37134,10 +37134,10 @@ }, "packages/liveblocks-node": { "name": "@liveblocks/node", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.5.1", + "@liveblocks/core": "3.5.2", "@stablelib/base64": "^1.0.1", "fast-sha256": "^1.3.0", "node-fetch": "^2.6.1" @@ -37152,11 +37152,11 @@ }, "packages/liveblocks-node-lexical": { "name": "@liveblocks/node-lexical", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.5.1", - "@liveblocks/node": "3.5.1", + "@liveblocks/core": "3.5.2", + "@liveblocks/node": "3.5.2", "yjs": "^13.6.18" }, "devDependencies": { @@ -37173,11 +37173,11 @@ }, "packages/liveblocks-node-prosemirror": { "name": "@liveblocks/node-prosemirror", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.5.1", - "@liveblocks/node": "3.5.1", + "@liveblocks/core": "3.5.2", + "@liveblocks/node": "3.5.2", "yjs": "^13.6.20" }, "devDependencies": { @@ -37197,11 +37197,11 @@ }, "packages/liveblocks-react": { "name": "@liveblocks/react", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1" + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37231,15 +37231,15 @@ }, "packages/liveblocks-react-blocknote": { "name": "@liveblocks/react-blocknote", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", - "@liveblocks/react-tiptap": "3.5.1", - "@liveblocks/react-ui": "3.5.1", - "@liveblocks/yjs": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", + "@liveblocks/react-tiptap": "3.5.2", + "@liveblocks/react-ui": "3.5.2", + "@liveblocks/yjs": "3.5.2", "@tiptap/core": "^2.7.2", "vitest-tsconfig-paths": "^3.4.1" }, @@ -37276,15 +37276,15 @@ }, "packages/liveblocks-react-lexical": { "name": "@liveblocks/react-lexical", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.1", - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", - "@liveblocks/react-ui": "3.5.1", - "@liveblocks/yjs": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", + "@liveblocks/react-ui": "3.5.2", + "@liveblocks/yjs": "3.5.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "yjs": "^13.6.18" @@ -37813,15 +37813,15 @@ }, "packages/liveblocks-react-tiptap": { "name": "@liveblocks/react-tiptap", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", - "@liveblocks/react-ui": "3.5.1", - "@liveblocks/yjs": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", + "@liveblocks/react-ui": "3.5.2", + "@liveblocks/yjs": "3.5.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "@tiptap/core": "^2.7.2", @@ -38346,13 +38346,13 @@ }, "packages/liveblocks-react-ui": { "name": "@liveblocks/react-ui", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", @@ -39680,11 +39680,11 @@ }, "packages/liveblocks-redux": { "name": "@liveblocks/redux", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1" + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -39841,10 +39841,10 @@ }, "packages/liveblocks-yjs": { "name": "@liveblocks/yjs", - "version": "3.5.1", + "version": "3.5.2", "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", "@noble/hashes": "^1.8.0", "js-base64": "^3.7.7", "y-indexeddb": "^9.0.12" @@ -39910,11 +39910,11 @@ }, "packages/liveblocks-zustand": { "name": "@liveblocks/zustand", - "version": "3.5.1", + "version": "3.5.2", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1" + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2" }, "devDependencies": { "@liveblocks/eslint-config": "*", diff --git a/packages/liveblocks-client/package.json b/packages/liveblocks-client/package.json index 924c3e2187d..4c6a6dea0b4 100644 --- a/packages/liveblocks-client/package.json +++ b/packages/liveblocks-client/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/client", - "version": "3.5.1", + "version": "3.5.2", "description": "A client that lets you interact with Liveblocks servers. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -34,7 +34,7 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.5.1" + "@liveblocks/core": "3.5.2" }, "devDependencies": { "@liveblocks/eslint-config": "*", diff --git a/packages/liveblocks-core/package.json b/packages/liveblocks-core/package.json index 4113d6394b5..fb52ecc7950 100644 --- a/packages/liveblocks-core/package.json +++ b/packages/liveblocks-core/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/core", - "version": "3.5.1", + "version": "3.5.2", "description": "Private internals for Liveblocks. DO NOT import directly from this package!", "type": "module", "main": "./dist/index.cjs", diff --git a/packages/liveblocks-emails/package.json b/packages/liveblocks-emails/package.json index 820e49f7a85..2d7895e250d 100644 --- a/packages/liveblocks-emails/package.json +++ b/packages/liveblocks-emails/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/emails", - "version": "3.5.1", + "version": "3.5.2", "description": "A set of functions and utilities to make sending emails based on Liveblocks notification events easy. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -35,8 +35,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.5.1", - "@liveblocks/node": "3.5.1" + "@liveblocks/core": "3.5.2", + "@liveblocks/node": "3.5.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc" diff --git a/packages/liveblocks-node-lexical/package.json b/packages/liveblocks-node-lexical/package.json index e9ce587b2a8..00df0baac2d 100644 --- a/packages/liveblocks-node-lexical/package.json +++ b/packages/liveblocks-node-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/node-lexical", - "version": "3.5.1", + "version": "3.5.2", "description": "A server-side utility that lets you modify lexical documents hosted in Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -34,8 +34,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.5.1", - "@liveblocks/node": "3.5.1", + "@liveblocks/core": "3.5.2", + "@liveblocks/node": "3.5.2", "yjs": "^13.6.18" }, "peerDependencies": { diff --git a/packages/liveblocks-node-prosemirror/package.json b/packages/liveblocks-node-prosemirror/package.json index 43d7be66016..bd4277c2e51 100644 --- a/packages/liveblocks-node-prosemirror/package.json +++ b/packages/liveblocks-node-prosemirror/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/node-prosemirror", - "version": "3.5.1", + "version": "3.5.2", "description": "A server-side utility that lets you modify prosemirror and tiptap documents hosted in Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -34,8 +34,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.5.1", - "@liveblocks/node": "3.5.1", + "@liveblocks/core": "3.5.2", + "@liveblocks/node": "3.5.2", "yjs": "^13.6.20" }, "peerDependencies": { diff --git a/packages/liveblocks-node/package.json b/packages/liveblocks-node/package.json index a5e482b9446..32ce67d0486 100644 --- a/packages/liveblocks-node/package.json +++ b/packages/liveblocks-node/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/node", - "version": "3.5.1", + "version": "3.5.2", "description": "A server-side utility that lets you set up a Liveblocks authentication endpoint. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -34,7 +34,7 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.5.1", + "@liveblocks/core": "3.5.2", "@stablelib/base64": "^1.0.1", "fast-sha256": "^1.3.0", "node-fetch": "^2.6.1" diff --git a/packages/liveblocks-react-blocknote/package.json b/packages/liveblocks-react-blocknote/package.json index 3e6fbd670e4..5d1abc95046 100644 --- a/packages/liveblocks-react-blocknote/package.json +++ b/packages/liveblocks-react-blocknote/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-blocknote", - "version": "3.5.1", + "version": "3.5.2", "description": "An integration of BlockNote + React to enable collaboration, comments, live cursors, and more with Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -42,12 +42,12 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", - "@liveblocks/react-tiptap": "3.5.1", - "@liveblocks/react-ui": "3.5.1", - "@liveblocks/yjs": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", + "@liveblocks/react-tiptap": "3.5.2", + "@liveblocks/react-ui": "3.5.2", + "@liveblocks/yjs": "3.5.2", "@tiptap/core": "^2.7.2", "vitest-tsconfig-paths": "^3.4.1" }, diff --git a/packages/liveblocks-react-lexical/package.json b/packages/liveblocks-react-lexical/package.json index 64b8e8398c2..fb21ef4a42d 100644 --- a/packages/liveblocks-react-lexical/package.json +++ b/packages/liveblocks-react-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-lexical", - "version": "3.5.1", + "version": "3.5.2", "description": "An integration of Lexical + React to enable collaboration, comments, live cursors, and more with Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -43,11 +43,11 @@ }, "dependencies": { "@floating-ui/react-dom": "^2.1.1", - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", - "@liveblocks/react-ui": "3.5.1", - "@liveblocks/yjs": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", + "@liveblocks/react-ui": "3.5.2", + "@liveblocks/yjs": "3.5.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "yjs": "^13.6.18" diff --git a/packages/liveblocks-react-tiptap/package.json b/packages/liveblocks-react-tiptap/package.json index f8197cbd096..c4075809797 100644 --- a/packages/liveblocks-react-tiptap/package.json +++ b/packages/liveblocks-react-tiptap/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-tiptap", - "version": "3.5.1", + "version": "3.5.2", "description": "An integration of TipTap + React to enable collaboration, comments, live cursors, and more with Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -43,11 +43,11 @@ }, "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", - "@liveblocks/react-ui": "3.5.1", - "@liveblocks/yjs": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", + "@liveblocks/react-ui": "3.5.2", + "@liveblocks/yjs": "3.5.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "@tiptap/core": "^2.7.2", diff --git a/packages/liveblocks-react-ui/package.json b/packages/liveblocks-react-ui/package.json index c797f13b8a8..4a3da0c341b 100644 --- a/packages/liveblocks-react-ui/package.json +++ b/packages/liveblocks-react-ui/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-ui", - "version": "3.5.1", + "version": "3.5.2", "description": "A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -76,9 +76,9 @@ }, "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", - "@liveblocks/react": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", + "@liveblocks/react": "3.5.2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", diff --git a/packages/liveblocks-react/package.json b/packages/liveblocks-react/package.json index 6c781d08c32..df3fda31996 100644 --- a/packages/liveblocks-react/package.json +++ b/packages/liveblocks-react/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react", - "version": "3.5.1", + "version": "3.5.2", "description": "A set of React hooks and providers to use Liveblocks declaratively. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -61,8 +61,8 @@ "showdeps": "depcruise src --include-only '^src' --exclude='__tests__' --output-type dot | dot -T svg > /tmp/dependency-graph.svg && open /tmp/dependency-graph.svg" }, "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1" + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2" }, "peerDependencies": { "@types/react": "*", diff --git a/packages/liveblocks-redux/package.json b/packages/liveblocks-redux/package.json index 8ca09acff46..17440f00e2c 100644 --- a/packages/liveblocks-redux/package.json +++ b/packages/liveblocks-redux/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/redux", - "version": "3.5.1", + "version": "3.5.2", "description": "A store enhancer to integrate Liveblocks into Redux stores. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -33,8 +33,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1" + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2" }, "peerDependencies": { "redux": "^4 || ^5" diff --git a/packages/liveblocks-yjs/package.json b/packages/liveblocks-yjs/package.json index a0cfdcd6fa8..1633cdf245c 100644 --- a/packages/liveblocks-yjs/package.json +++ b/packages/liveblocks-yjs/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/yjs", - "version": "3.5.1", + "version": "3.5.2", "description": "Integrate your existing or new Yjs documents with Liveblocks.", "icense": "Apache-2.0", "type": "module", @@ -33,8 +33,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1", + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2", "@noble/hashes": "^1.8.0", "js-base64": "^3.7.7", "y-indexeddb": "^9.0.12" diff --git a/packages/liveblocks-zustand/package.json b/packages/liveblocks-zustand/package.json index 60b7eb8caca..aae3a2244be 100644 --- a/packages/liveblocks-zustand/package.json +++ b/packages/liveblocks-zustand/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/zustand", - "version": "3.5.1", + "version": "3.5.2", "description": "A middleware for Zustand to automatically synchronize your stores with Liveblocks. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -34,8 +34,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.5.1", - "@liveblocks/core": "3.5.1" + "@liveblocks/client": "3.5.2", + "@liveblocks/core": "3.5.2" }, "peerDependencies": { "zustand": "^5.0.1"