From c1a44ff14dd725b8b1b0de1760097e1ae75beb31 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 06:00:00 +0200 Subject: [PATCH 01/14] fix(versioning): don't attribute concurrently added content to a block's deleter When Alice deletes (or moves, or retypes) a block while Bob concurrently adds content inside it, the server removes Bob's content along with the block, but YHub attributes the deletion only to what Alice's update itself deleted. The version diff still showed Bob's content as "Deleted by: Alice": snapshots were decoded with garbage collection on, so the deleted block's children were re-read from the baseline and rendered under the block's own mark. - Decode snapshots with `gc: false`, so nested deleted content keeps its own attribution (none, for content swept away with its parent). - Hide content inserted and deleted between the two versions, which the stock diff renderer only hides once it is garbage collected. - Treat every attribution mark as a change, so a deletion without a known author shows "Deleted" instead of no tooltip or another mark's label. --- .../src/y/extensions/AttributionExtension.ts | 53 ++-- .../core/src/y/extensions/snapshotCodec.ts | 2 +- .../core/src/y/extensions/snapshotPreview.ts | 27 ++- .../extensions/versionDiffAttribution.test.ts | 226 ++++++++++++++++++ .../versioning/block-comparison.test.tsx | 8 +- 5 files changed, 275 insertions(+), 41 deletions(-) create mode 100644 packages/core/src/y/extensions/versionDiffAttribution.test.ts diff --git a/packages/core/src/y/extensions/AttributionExtension.ts b/packages/core/src/y/extensions/AttributionExtension.ts index 34e3f214ba..4f47e96a8b 100644 --- a/packages/core/src/y/extensions/AttributionExtension.ts +++ b/packages/core/src/y/extensions/AttributionExtension.ts @@ -230,19 +230,16 @@ export const AttributionExtension = createExtension( .map((id) => userStore.getUser(id)?.username ?? id) .filter((username) => username !== ""); - // A stable identity string for a wrapper (empty if unattributed), used to - // (a) test whether a mark is attributed and (b) group adjacent marks with - // the *same* attribution under one tooltip. It's an internal grouping key, - // not the displayed text — that's composed in the view from `users` and - // the format label — so it's built from raw `data-*` (ids + format keys) - // and stays free of i18n/username resolution. + // A stable identity string for a mark wrapper, used to group nested marks + // with the *same* change under one tooltip. Every wrapper is a change; + // its author may be unknown (e.g. content removed along with a + // concurrently deleted block). It's an internal grouping key, not the + // displayed text, so it's built from raw `data-*` and stays free of + // i18n/username resolution. const attributionIdentity = (wrapper: HTMLElement) => { const ids = parseUserIds(wrapper.dataset["userIds"]); - if (ids.length === 0 && wrapper.dataset["attributes"] === undefined) { - return ""; - } const format = parseFormatKeys(wrapper.dataset["format"]); - return `${wrapper.dataset["attributes"] ?? ""}:${format.join(",")}:${ids.join(",")}`; + return `${wrapper.tagName}:${wrapper.dataset["attributes"] ?? ""}:${format.join(",")}:${ids.join(",")}`; }; // Build the tooltip state from a wrapper's `data-*` attributes. A @@ -302,24 +299,6 @@ export const AttributionExtension = createExtension( store.setState(undefined); }; - // The innermost attributed mark at or above `el`, skipping unattributed - // wrappers so an attributed ancestor still wins. - const innermostAttributed = ( - el: Element | null, - ): HTMLElement | undefined => { - while (el) { - const wrapper = el.closest(ATTRIBUTION_MARK_SELECTOR); - if (!wrapper) { - return undefined; - } - if (attributionIdentity(wrapper)) { - return wrapper; - } - el = wrapper.parentElement; - } - return undefined; - }; - const nodeAttribution = ( target: Element, ): { mark: HTMLElement; preview: Element } | undefined => { @@ -356,9 +335,9 @@ export const AttributionExtension = createExtension( ) { return undefined; } - const mark = Array.from( - owner.querySelectorAll(ATTRIBUTION_MARK_SELECTOR), - ).find(attributionIdentity); + const mark = owner.querySelector( + ATTRIBUTION_MARK_SELECTOR, + ); return mark ? { mark, preview: owner } : undefined; }; @@ -366,7 +345,8 @@ export const AttributionExtension = createExtension( const target = event.target instanceof Element ? event.target : null; const hoveredMark = target && dom.contains(target) - ? innermostAttributed(target) + ? (target.closest(ATTRIBUTION_MARK_SELECTOR) ?? + undefined) : undefined; const fallback = target && !hoveredMark ? nodeAttribution(target) : undefined; @@ -379,8 +359,7 @@ export const AttributionExtension = createExtension( const identity = attributionIdentity(innermost); // Anchor on the outermost ancestor with the *same* attribution so one - // tooltip covers the whole region; a differently-attributed ancestor - // breaks the chain, and unattributed ones are climbed past. + // tooltip covers the whole region; a different ancestor breaks the chain. let anchor = innermost; let el: Element | null = innermost.parentElement; while (el) { @@ -388,12 +367,10 @@ export const AttributionExtension = createExtension( if (!ancestor) { break; } - const ancestorIdentity = attributionIdentity(ancestor); - if (ancestorIdentity === identity) { - anchor = ancestor; - } else if (ancestorIdentity) { + if (attributionIdentity(ancestor) !== identity) { break; } + anchor = ancestor; el = ancestor.parentElement; } diff --git a/packages/core/src/y/extensions/snapshotCodec.ts b/packages/core/src/y/extensions/snapshotCodec.ts index 985c68502f..0e43537a88 100644 --- a/packages/core/src/y/extensions/snapshotCodec.ts +++ b/packages/core/src/y/extensions/snapshotCodec.ts @@ -19,7 +19,7 @@ export function decodeFragmentUpdate( opts?: { suggestionDoc?: boolean }, ): DecodedFragment { const doc = new Y.Doc( - opts?.suggestionDoc ? { isSuggestionDoc: true } : undefined, + opts?.suggestionDoc ? { gc: false, isSuggestionDoc: true } : { gc: false }, ); try { Y.applyUpdateV2(doc, content); diff --git a/packages/core/src/y/extensions/snapshotPreview.ts b/packages/core/src/y/extensions/snapshotPreview.ts index b619689062..d6efaff2ab 100644 --- a/packages/core/src/y/extensions/snapshotPreview.ts +++ b/packages/core/src/y/extensions/snapshotPreview.ts @@ -7,6 +7,31 @@ import { destroyDecodedFragment, } from "./snapshotCodec.js"; +/** + * Snapshots are decoded with `gc: false`, so content inside a deleted block keeps + * its own attribution: content swept away with a concurrently deleted block shows + * no author instead of inheriting the deleter. The stock renderer hides content + * that was inserted and deleted between the two versions only once it has been + * garbage collected; hide it here too. + */ +class SnapshotDiffRenderer extends Y.DiffRenderer { + override readContent( + ...[contents, client, clock, deleted, content, shouldRender]: Parameters< + Y.DiffRenderer["readContent"] + > + ) { + const start = contents.length; + super.readContent(contents, client, clock, deleted, content, shouldRender); + if (deleted) { + for (let i = contents.length - 1; i >= start; i--) { + if (this.inserts.has(client, contents[i].clock)) { + contents.splice(i, 1); + } + } + } + } +} + /** * Decode a snapshot, diff it against a baseline if given, and render it. * @@ -37,7 +62,7 @@ export function showSnapshotPreview( configureYProsemirror({ ytype: snapshot.fragment, renderer: baseline - ? Y.createDiffRenderer( + ? new SnapshotDiffRenderer( baseline.doc, snapshot.doc, attributions ? { attributions } : undefined, diff --git a/packages/core/src/y/extensions/versionDiffAttribution.test.ts b/packages/core/src/y/extensions/versionDiffAttribution.test.ts new file mode 100644 index 0000000000..c3abd5a265 --- /dev/null +++ b/packages/core/src/y/extensions/versionDiffAttribution.test.ts @@ -0,0 +1,226 @@ +/** + * @vitest-environment jsdom + */ +import * as Y from "@y/y"; +import { afterEach, describe, expect, it } from "vite-plus/test"; + +import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js"; +import { blocksToYType } from "../utils.js"; +import { AttributionExtension } from "./AttributionExtension.js"; +import { withCollaboration } from "./index.js"; +import { createYVersionView } from "./Versioning.js"; + +const editors: BlockNoteEditor[] = []; +afterEach(() => { + for (const editor of editors.splice(0)) { + editor.unmount(); + } +}); + +function collaborativeEditor(doc: Y.Doc) { + const editor = BlockNoteEditor.create( + withCollaboration({ + collaboration: { + fragment: doc.get("doc"), + user: { name: "Test", color: "#ff0000" }, + }, + }), + ); + const element = document.createElement("div"); + document.body.appendChild(element); + editor.mount(element); + editors.push(editor); + return editor; +} + +function baseDocument(blocks: any[]) { + const doc = new Y.Doc({ gc: false }); + doc.clientID = 100; + const seed = BlockNoteEditor.create(); + seed.replaceBlocks(seed.document, blocks); + blocksToYType(seed, seed.document, doc.get("doc")); + return doc; +} + +/** One user's concurrent edit of `base`, as the update their client sends. */ +function editOf( + base: Y.Doc, + client: number, + edit: (editor: BlockNoteEditor) => void, +) { + const doc = new Y.Doc({ gc: false }); + doc.clientID = client; + Y.applyUpdateV2(doc, Y.encodeStateAsUpdateV2(base)); + edit(collaborativeEditor(doc)); + return Y.encodeStateAsUpdateV2(doc, Y.encodeStateVector(base)); +} + +/** + * Attribute deletions the way YHub does: only what the update itself deletes, + * not content removed along with a deleted parent. + */ +function deletedBy(update: Uint8Array, user: string) { + const attributions = Y.createContentMap(); + Y.insertIntoIdMap( + attributions.deletes, + Y.createIdMapFromIdSet(Y.decodeUpdateV2(update).ds, [ + Y.createContentAttribute("delete", user), + ]), + ); + return attributions; +} + +/** Show `after` compared to `before` and return each changed block and text. */ +function showDiff( + before: Uint8Array, + after: Uint8Array, + attributions?: Y.ContentMap, +) { + const doc = new Y.Doc(); + Y.applyUpdateV2(doc, after); + const editor = collaborativeEditor(doc); + const view = createYVersionView(editor, doc.get("doc")).open(); + view.show({ + content: after, + comparison: { content: before, attributions }, + target: { type: "snapshot", id: "after" }, + }); + const changes: Array<{ text: string; mark: string; users: string[] }> = []; + editor.prosemirrorState.doc.descendants((node) => { + const mark = node.marks.find((mark) => + ["y-attributed-insert", "y-attributed-delete"].includes(mark.type.name), + ); + if (mark && (node.isText || node.type.name === "blockContainer")) { + changes.push({ + text: node.isText ? node.text! : `[block ${node.attrs.id}]`, + mark: mark.type.name, + users: mark.attrs["userIds"], + }); + } + return true; + }); + return { editor, view, changes }; +} + +describe("version diff of a deleted block", () => { + it("does not attribute content added concurrently inside it to the deleter", () => { + const base = baseDocument([ + { + id: "parent", + type: "paragraph", + content: "Parent", + children: [{ id: "child", type: "paragraph", content: "Child" }], + }, + { id: "next", type: "paragraph", content: "Next" }, + ]); + // Bob adds text and a block inside the parent; Alice, who never receives + // them, deletes the parent. + const bob = editOf(base, 2, (editor) => { + editor.setTextCursorPosition("child", "end"); + editor.insertInlineContent(" by Bob"); + editor.insertBlocks( + [{ id: "bobs", type: "paragraph", content: "Bob's block" }], + "child", + "after", + ); + }); + const alice = editOf(base, 1, (editor) => editor.removeBlocks(["parent"])); + + const server = new Y.Doc({ gc: false }); + Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); + Y.applyUpdateV2(server, bob); + const withBob = Y.encodeStateAsUpdateV2(server); + Y.applyUpdateV2(server, alice); + + const { view, changes } = showDiff( + withBob, + Y.encodeStateAsUpdateV2(server), + deletedBy(alice, "alice"), + ); + view.close(); + const del = "y-attributed-delete"; + expect(changes).toEqual([ + { text: "[block parent]", mark: del, users: ["alice"] }, + { text: "Parent", mark: del, users: ["alice"] }, + { text: "[block child]", mark: del, users: ["alice"] }, + { text: "Child", mark: del, users: ["alice"] }, + { text: " by Bob", mark: del, users: [] }, + { text: "[block bobs]", mark: del, users: [] }, + { text: "Bob's block", mark: del, users: [] }, + ]); + }); + + it("names no author when hovering content removed with it", () => { + const base = baseDocument([ + { id: "parent", type: "paragraph", content: "Parent" }, + { id: "next", type: "paragraph", content: "Next" }, + ]); + const bob = editOf(base, 2, (editor) => { + editor.setTextCursorPosition("parent", "end"); + editor.insertInlineContent(" by Bob"); + }); + const alice = editOf(base, 1, (editor) => editor.removeBlocks(["parent"])); + const server = new Y.Doc({ gc: false }); + Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); + Y.applyUpdateV2(server, bob); + const withBob = Y.encodeStateAsUpdateV2(server); + Y.applyUpdateV2(server, alice); + + const { editor, view } = showDiff( + withBob, + Y.encodeStateAsUpdateV2(server), + deletedBy(alice, "alice"), + ); + const hover = (text: string) => { + const walker = document.createTreeWalker( + editor.domElement!, + NodeFilter.SHOW_TEXT, + ); + for (let node = walker.nextNode(); node; node = walker.nextNode()) { + if (node.textContent === text) { + node.parentElement!.dispatchEvent( + new MouseEvent("mouseover", { bubbles: true }), + ); + } + } + return editor.getExtension(AttributionExtension)!.store.state; + }; + + expect(hover("Parent")).toMatchObject({ + modificationType: "delete", + users: ["alice"], + }); + expect(hover(" by Bob")).toMatchObject({ + modificationType: "delete", + users: [], + }); + view.close(); + }); + + it("does not show content inserted and deleted between the two versions", () => { + const doc = new Y.Doc({ gc: false }); + const editor = collaborativeEditor(doc); + editor.replaceBlocks(editor.document, [ + { id: "a", type: "paragraph", content: "Hello" }, + { id: "b", type: "paragraph", content: "World" }, + ]); + const before = Y.encodeStateAsUpdateV2(doc); + editor.setTextCursorPosition("a", "end"); + editor.insertInlineContent(" typo"); + editor.insertBlocks( + [{ id: "temp", type: "paragraph", content: "Temporary" }], + "a", + "after", + ); + editor.removeBlocks(["temp"]); + editor.updateBlock("a", { content: "Hello" }); + editor.setTextCursorPosition("b", "end"); + editor.insertInlineContent(" kept"); + + const { view, changes } = showDiff(before, Y.encodeStateAsUpdateV2(doc)); + view.close(); + expect(changes).toEqual([ + { text: " kept", mark: "y-attributed-insert", users: [] }, + ]); + }); +}); diff --git a/tests/src/end-to-end/versioning/block-comparison.test.tsx b/tests/src/end-to-end/versioning/block-comparison.test.tsx index 65c26ab827..c719bad01b 100644 --- a/tests/src/end-to-end/versioning/block-comparison.test.tsx +++ b/tests/src/end-to-end/versioning/block-comparison.test.tsx @@ -18,7 +18,7 @@ import { testDocument } from "@shared/testDocument.js"; import * as Y from "@y/y"; import { expect, test } from "vite-plus/test"; import { render } from "vitest-browser-react"; -import { browserName, page } from "../../utils/context.js"; +import { browserName, page, userEvent } from "../../utils/context.js"; import { sleep } from "../../utils/editor.js"; import { screenshotFull } from "../../utils/screenshotFull.js"; @@ -164,6 +164,12 @@ for (const theme of ["light", "dark"] as const) { await expect .poll(() => root.querySelectorAll("del").length) .toBeGreaterThan(0); + // A preceding test can leave the pointer over the diff, whose changes + // show a tooltip on hover. Park it on the padding, outside the editor. + await userEvent.hover(root, { position: { x: 2, y: 2 } }); + await expect + .poll(() => document.querySelector(".bn-suggestion-tooltip")) + .toBeNull(); for (const toggle of root.querySelectorAll( '.bn-toggle-wrapper[data-show-children="false"]', )) { From 78a68a3cf97b9b9010d7a1916a5e6b57810e14f4 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 06:05:31 +0200 Subject: [PATCH 02/14] fix(versioning): diff structural changes made by the old Yjs binding The old y-prosemirror binding stored a block's type change, nesting change or table resize inside the same block container. A version diff renders that as two block contents (or groups) in one container, which @y/prosemirror drops as schema-invalid: the changed block disappeared from the diff. Before rendering a diff, replace each block that `blockMatchNodes` considers changed with a fresh copy in the decoded snapshot, so it diffs as a deleted block next to an inserted one, as the current binding stores it. The copy and the deletion carry over the original's attributions, so the change keeps its author. --- .../y/extensions/legacyYjsDocBinding.test.ts | 228 +++++++++++++++++- .../core/src/y/extensions/snapshotPreview.ts | 127 +++++++++- 2 files changed, 352 insertions(+), 3 deletions(-) diff --git a/packages/core/src/y/extensions/legacyYjsDocBinding.test.ts b/packages/core/src/y/extensions/legacyYjsDocBinding.test.ts index 7cf3991393..479f714716 100644 --- a/packages/core/src/y/extensions/legacyYjsDocBinding.test.ts +++ b/packages/core/src/y/extensions/legacyYjsDocBinding.test.ts @@ -8,11 +8,13 @@ import * as Y1 from "yjs"; import { CommentsExtension } from "../../comments/extension.js"; import { DefaultThreadStoreAuth } from "../../comments/threadstore/DefaultThreadStoreAuth.js"; +import type { PartialBlock } from "../../blocks/defaultBlocks.js"; import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js"; import { YjsThreadStore as NewThreadStore } from "../comments/YjsThreadStore.js"; import { YjsThreadStore as LegacyThreadStore } from "../../yjs/comments/YjsThreadStore.js"; import { withCollaboration as withLegacyCollaboration } from "../../yjs/extensions/index.js"; import { withCollaboration } from "./index.js"; +import { createYVersionView } from "./Versioning.js"; const editors: BlockNoteEditor[] = []; const docs: Array = []; @@ -55,8 +57,13 @@ function createLegacyEditor(withComments = false) { return { doc, editor, threadStore }; } -function openWithNewBinding(update: Uint8Array, withComments = false) { - const doc = new Y.Doc(); +function openWithNewBinding( + update: Uint8Array, + withComments = false, + // Version history keeps deleted content (YHub stores documents without GC). + gc = true, +) { + const doc = new Y.Doc({ gc }); docs.push(doc); Y.applyUpdateV2(doc, update); const stateBeforeMount = Y.encodeStateVector(doc); @@ -86,6 +93,144 @@ function openWithNewBinding(update: Uint8Array, withComments = false) { return { doc, editor, threadStore, stateBeforeMount }; } +/** Attribute every change between two document states to "author", as YHub would. */ +function attributionsFor(before: Uint8Array, after: Uint8Array) { + const doc = new Y.Doc({ gc: false }); + docs.push(doc); + Y.applyUpdateV2(doc, before); + const attributions = Y.createContentMap(); + doc.on("beforeObserverCalls", (tr) => { + Y.insertIntoIdMap( + attributions.inserts, + Y.createIdMapFromIdSet(tr.insertSet, [ + Y.createContentAttribute("insert", "author"), + ]), + ); + Y.insertIntoIdMap( + attributions.deletes, + Y.createIdMapFromIdSet(tr.deleteSet, [ + Y.createContentAttribute("delete", "author"), + ]), + ); + }); + Y.applyUpdateV2(doc, after); + return attributions; +} + +/** Compare `before` → `after` in the editor's version view; returns the changed blocks. */ +function diffBlocks( + editor: BlockNoteEditor, + doc: Y.Doc, + before: Uint8Array, + after: Uint8Array, +) { + const view = createYVersionView(editor, doc.get("doc")).open(); + try { + view.show({ + content: after, + comparison: { + content: before, + attributions: attributionsFor(before, after), + }, + target: { type: "snapshot", id: "after" }, + }); + const changed: Array<{ + change: string; + type: string; + text: string; + users: string[]; + }> = []; + editor.prosemirrorState.doc.descendants((node) => { + const mark = node.marks.find( + (mark) => + mark.type.name === "y-attributed-insert" || + mark.type.name === "y-attributed-delete", + ); + if (node.type.name === "blockContainer" && mark) { + changed.push({ + change: mark.type.name, + type: node.firstChild!.type.name, + text: node.firstChild!.textContent, + users: mark.attrs["userIds"], + }); + } + return true; + }); + return changed; + } finally { + view.close(); + } +} + +function table(rows: number, cols: number): PartialBlock { + return { + id: "table", + type: "table", + content: { + type: "tableContent", + rows: Array.from({ length: rows }, (_, row) => ({ + cells: Array.from({ length: cols }, (_, col) => `${row}${col}`), + })), + }, + }; +} + +// The changes `blockMatchNodes` stores as a replaced block in the new binding. +// The old binding stored them inside the same block, which a diff can only +// render once the preview splits that block. +const structuralChanges: Array<{ + name: string; + blocks: PartialBlock[]; + change: (editor: BlockNoteEditor) => void; +}> = [ + { + name: "a type change", + blocks: [ + { id: "changed", type: "paragraph", content: "Original" }, + { id: "next", type: "paragraph", content: "Next" }, + ], + change: (editor) => + editor.updateBlock("changed", { type: "heading", props: { level: 2 } }), + }, + { + name: "a nesting change", + blocks: [ + { id: "parent", type: "paragraph", content: "Parent" }, + { id: "child", type: "paragraph", content: "Child" }, + ], + change: (editor) => { + editor.setTextCursorPosition("child"); + editor.nestBlock(); + }, + }, + { + name: "a table resize", + blocks: [table(2, 2)], + change: (editor) => editor.updateBlock("table", table(3, 3)), + }, + { + name: "a type change of a block with children", + blocks: [ + { + id: "changed", + type: "paragraph", + content: "Parent", + children: [{ id: "child", type: "paragraph", content: "Child" }], + }, + ], + change: (editor) => + editor.updateBlock("changed", { type: "heading", props: { level: 2 } }), + }, + { + name: "a type change and a text edit", + blocks: [{ id: "changed", type: "paragraph", content: "Original" }], + change: (editor) => { + editor.updateBlock("changed", { type: "heading", props: { level: 2 } }); + editor.updateBlock("changed", { content: "Original title" }); + }, + }, +]; + describe("legacy Yjs document binding", () => { it("reads a multi-block document written by the old collaboration binding", () => { const legacy = createLegacyEditor(); @@ -206,6 +351,85 @@ describe("legacy Yjs document binding", () => { ]); }); + it("diffs a block type change made with the new binding", () => { + const current = openWithNewBinding( + Y.encodeStateAsUpdateV2(new Y.Doc()), + false, + false, + ); + current.editor.replaceBlocks(current.editor.document, [ + { id: "changed", type: "paragraph", content: "Original" }, + ]); + const before = Y.encodeStateAsUpdateV2(current.doc); + current.editor.updateBlock("changed", { + type: "heading", + props: { level: 2 }, + }); + const after = Y.encodeStateAsUpdateV2(current.doc); + + expect(diffBlocks(current.editor, current.doc, before, after)).toEqual([ + { + change: "y-attributed-delete", + type: "paragraph", + text: "Original", + users: ["author"], + }, + { + change: "y-attributed-insert", + type: "heading", + text: "Original", + users: ["author"], + }, + ]); + }); + + it.each(structuralChanges)( + "diffs $name made with the old binding like one made with the new binding", + ({ blocks, change }) => { + const legacy = createLegacyEditor(); + legacy.editor.replaceBlocks(legacy.editor.document, blocks); + const legacyBefore = Y1.encodeStateAsUpdateV2(legacy.doc); + change(legacy.editor); + const legacyAfter = Y1.encodeStateAsUpdateV2(legacy.doc); + const fromLegacy = openWithNewBinding(legacyAfter); + + const current = openWithNewBinding( + Y.encodeStateAsUpdateV2(new Y.Doc()), + false, + false, + ); + current.editor.replaceBlocks(current.editor.document, blocks); + const before = Y.encodeStateAsUpdateV2(current.doc); + change(current.editor); + const after = Y.encodeStateAsUpdateV2(current.doc); + + const expected = diffBlocks(current.editor, current.doc, before, after); + expect(expected).not.toEqual([]); + expect( + diffBlocks( + fromLegacy.editor, + fromLegacy.doc, + legacyBefore, + legacyAfter, + ), + ).toEqual(expected); + }, + ); + + it("diffs a text edit made with the old binding in place", () => { + const legacy = createLegacyEditor(); + legacy.editor.replaceBlocks(legacy.editor.document, [ + { id: "edited", type: "paragraph", content: "Original" }, + ]); + const before = Y1.encodeStateAsUpdateV2(legacy.doc); + legacy.editor.updateBlock("edited", { content: "Original edited" }); + const after = Y1.encodeStateAsUpdateV2(legacy.doc); + const current = openWithNewBinding(after); + + // No block is replaced: only the inserted text is marked. + expect(diffBlocks(current.editor, current.doc, before, after)).toEqual([]); + }); + it("reads a comment overlapping a formatting mark and its thread", async () => { const legacy = createLegacyEditor(true); legacy.editor.replaceBlocks(legacy.editor.document, [ diff --git a/packages/core/src/y/extensions/snapshotPreview.ts b/packages/core/src/y/extensions/snapshotPreview.ts index d6efaff2ab..2baae5d469 100644 --- a/packages/core/src/y/extensions/snapshotPreview.ts +++ b/packages/core/src/y/extensions/snapshotPreview.ts @@ -2,6 +2,8 @@ import { configureYProsemirror } from "@y/prosemirror"; import * as Y from "@y/y"; import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js"; +import { findTypeInOtherYdoc } from "../utils.js"; +import { blockMatchNodes } from "./blockMatchNodes.js"; import { decodeFragmentUpdate, destroyDecodedFragment, @@ -32,6 +34,111 @@ class SnapshotDiffRenderer extends Y.DiffRenderer { } } +/** The distinct attributions recorded for `node` and its descendants. */ +function subtreeAttributions( + node: Y.Node, + map: Y.IdMap, +): Y.ContentAttribute[] { + const found = new Map>(); + for (const structs of node.doc!.store.clients.values()) { + for (const item of structs) { + if ( + item instanceof Y.Item && + (item === node._item || Y.isParentOf(node, item)) + ) { + for (const range of map.slice( + item.id.client, + item.id.clock, + item.length, + )) { + for (const attr of range.attrs ?? []) { + found.set(`${attr.name}:${String(attr.val)}`, attr); + } + } + } + } + } + return [...found.values()]; +} + +/** + * Replace each block that changed structurally since `baseline` with a fresh + * copy, where "structurally" is what `blockMatchNodes` treats as a different + * block (e.g. a type change). The old collaboration binding stored such changes + * inside the same container, which a diff renders as schema-invalid content + * that is then dropped. A fresh container diffs as a deleted block next to an + * inserted one, as the current binding stores it. The copy and the deletion + * take over the original's attributions, so the change keeps its author. + */ +function splitChangedBlocks( + node: Y.Node, + baseline: Y.Doc, + attributions: Y.ContentMap | undefined, + added: Y.ContentMap, +): void { + for (let index = 0; index < node.length; index++) { + const child = node.get(index); + if (!(child instanceof Y.Node)) { + continue; + } + if (child.name === "blockContainer" && child._item) { + // A block created after the baseline has no previous version. + const { client, clock } = child._item.id; + const last = baseline.store.clients.get(client)?.at(-1); + const before = + last && clock < last.id.clock + last.length + ? findTypeInOtherYdoc(child, baseline) + : undefined; + if ( + before && + !blockMatchNodes(before.toDeltaDeep(), child.toDeltaDeep()) + ) { + const inserted = attributions + ? subtreeAttributions(child, attributions.inserts) + : []; + const deleted = attributions + ? subtreeAttributions(child, attributions.deletes) + : []; + const doc = child.doc!; + // A change that only inserted (or only deleted) still has one author + // for both sides of the split, under that side's attribution kind. + const as = ( + kind: "insert" | "delete", + attrs: Y.ContentAttribute[], + ) => attrs.map((attr) => Y.createContentAttribute(kind, attr.val)); + const authors = inserted.length ? inserted : deleted; + const record = (tr: Y.Transaction) => { + if (authors.length) { + Y.insertIntoIdMap( + added.inserts, + Y.createIdMapFromIdSet(tr.insertSet, as("insert", authors)), + ); + Y.insertIntoIdMap( + added.deletes, + Y.createIdMapFromIdSet( + tr.deleteSet, + as("delete", deleted.length ? deleted : authors), + ), + ); + } + }; + doc.on("beforeObserverCalls", record); + try { + doc.transact(() => { + const copy = child.clone(); + node.delete(index); + node.insert(index, [copy]); + }); + } finally { + doc.off("beforeObserverCalls", record); + } + continue; + } + } + splitChangedBlocks(child, baseline, attributions, added); + } +} + /** * Decode a snapshot, diff it against a baseline if given, and render it. * @@ -58,6 +165,22 @@ export function showSnapshotPreview( try { const snapshot = decodeFragmentUpdate(fragment, snapshotContent); try { + let renderAttributions = attributions; + if (baseline) { + const added = Y.createContentMap(); + splitChangedBlocks( + snapshot.fragment, + baseline.doc, + attributions, + added, + ); + if (attributions) { + renderAttributions = Y.createContentMap( + Y.mergeIdMaps([attributions.inserts, added.inserts]), + Y.mergeIdMaps([attributions.deletes, added.deletes]), + ); + } + } editor.exec( configureYProsemirror({ ytype: snapshot.fragment, @@ -65,7 +188,9 @@ export function showSnapshotPreview( ? new SnapshotDiffRenderer( baseline.doc, snapshot.doc, - attributions ? { attributions } : undefined, + renderAttributions + ? { attributions: renderAttributions } + : undefined, ) : undefined, }), From 772b69a763bd194b68cbd6024e11ca64b67ee730 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 06:22:21 +0200 Subject: [PATCH 03/14] feat(versioning): diff nesting changes in place A block's nested children are no longer a reason to replace the block. A binding transformer shows all of a block's child groups as one group and keeps emptied groups (hidden) instead of deleting them, so indents, unindents and concurrent first children diff as moved/added blocks only. --- .../14-suggestion-gallery/src/scenarios.ts | 80 ++- packages/core/src/y/extensions/YSync.ts | 3 + .../core/src/y/extensions/blockMatchNodes.ts | 28 -- .../src/y/extensions/mergeBlockGroups.test.ts | 244 +++++++++ .../core/src/y/extensions/mergeBlockGroups.ts | 332 ++++++++++++ ...dd-remove-delete-nested-chromium-linux.png | Bin 9585 -> 8113 bytes ...add-remove-delete-nested-firefox-linux.png | Bin 10054 -> 8702 bytes .../add-remove-delete-nested-webkit-linux.png | Bin 10589 -> 9265 bytes ...t-bullet-under-existing-chromium-linux.png | Bin 11887 -> 10451 bytes ...st-bullet-under-existing-firefox-linux.png | Bin 12769 -> 11284 bytes ...est-bullet-under-existing-webkit-linux.png | Bin 13371 -> 11985 bytes ...ncurrent-indent-cascade-chromium-linux.png | Bin 13103 -> 10966 bytes ...oncurrent-indent-cascade-firefox-linux.png | Bin 14355 -> 12202 bytes ...concurrent-indent-cascade-webkit-linux.png | Bin 14906 -> 12871 bytes ...rent-nest-both-under-n0-chromium-linux.png | Bin 9996 -> 7982 bytes ...rrent-nest-both-under-n0-firefox-linux.png | Bin 11191 -> 9075 bytes ...urrent-nest-both-under-n0-webkit-linux.png | Bin 11525 -> 9520 bytes .../nesting-indent-chromium-linux.png | Bin 6826 -> 5957 bytes .../nesting-indent-firefox-linux.png | Bin 7246 -> 6365 bytes .../nesting-indent-webkit-linux.png | Bin 7625 -> 6807 bytes .../nesting-unindent-chromium-linux.png | Bin 7173 -> 6191 bytes .../nesting-unindent-firefox-linux.png | Bin 7489 -> 6611 bytes .../nesting-unindent-webkit-linux.png | Bin 7946 -> 7107 bytes .../addRemoveBlocks.test.tsx.snap | 473 +++++++----------- .../__snapshots__/moveBlocks.test.tsx.snap | 80 ++- .../nesting.concurrent.test.tsx.snap | 238 ++------- .../__snapshots__/nesting.test.tsx.snap | 225 +++------ 27 files changed, 1000 insertions(+), 703 deletions(-) create mode 100644 packages/core/src/y/extensions/mergeBlockGroups.test.ts create mode 100644 packages/core/src/y/extensions/mergeBlockGroups.ts diff --git a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts index 93fdf5b94c..a47b03334a 100644 --- a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts +++ b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts @@ -482,6 +482,27 @@ export const scenarios: SuggestionScenario[] = [ }); }, }, + { + kind: "single", + id: "text-enter-at-heading-start", + feedback: [ + { + severity: "low", + note: "Shows the heading's text deleted and re-inserted in a new block, instead of an empty block inserted above: splitting at the start keeps the block's id on the (now empty) first half.", + }, + ], + title: "Enter at the start of a heading", + category: "Basic text", + description: + "Press Enter at the start of a heading, moving it down below an empty line.", + initial: [ + { id: "h", type: "heading", props: { level: 1 }, content: "Title" }, + ], + apply: (editor) => { + editor.setTextCursorPosition("h", "start"); + editor._tiptapEditor.commands.keyboardShortcut("Enter"); + }, + }, { kind: "single", id: "text-add-bold", @@ -1000,7 +1021,7 @@ export const scenarios: SuggestionScenario[] = [ feedback: [ { severity: "low", - note: "Block N1 appears in two places. Previously this concurrency scenario would also not be correctly handled (one of the edits would be dropped).", + note: "N2 is lost. Indenting is a move, which deletes the original block and inserts a copy: B nests N2 into the original N1, which A's indent deletes, so N2 goes with it (shown as \"deleted by B\" because B's indent deleted N2's own original). Before nesting changes diffed in place, B's indent replaced N1, so N1 appeared twice instead. Needs move support.", }, ], title: "Cascading indents", @@ -1020,6 +1041,63 @@ export const scenarios: SuggestionScenario[] = [ editor.nestBlock(); }, }, + { + kind: "concurrent", + id: "concurrent-nest-into-moved-block", + feedback: [ + { + severity: "high", + note: "B1–B3 are lost. A's indent writes them into the original Q, which B's indent concurrently deletes (a move inserts a copy of Q, without them). Before nesting changes diffed in place, Q appeared twice instead. Needs move support.", + }, + ], + title: "Nest blocks into a block that is moved", + category: "Nesting", + description: "A nests B1–B3 under Q while B nests Q under R.", + initial: [ + { id: "r", type: "paragraph", content: "R" }, + { id: "q", type: "paragraph", content: "Q" }, + { id: "b1", type: "paragraph", content: "B1" }, + { id: "b2", type: "paragraph", content: "B2" }, + { id: "b3", type: "paragraph", content: "B3" }, + ], + applyA: (editor) => { + editor.setSelection("b1", "b3"); + editor.nestBlock(); + }, + applyB: (editor) => { + editor.setTextCursorPosition("q", "start"); + editor.nestBlock(); + }, + }, + { + kind: "concurrent", + id: "concurrent-parent-type-vs-child-edit", + feedback: [ + { + severity: "high", + note: "B's edit is lost. Changing the parent's type replaces the parent block with a copy, children included, which doesn't have B's concurrent edit.", + }, + ], + title: "Change a parent's type vs edit its child", + category: "Nesting", + description: + "A changes a parent paragraph to a heading while B types in its child.", + initial: [ + { + id: "p", + type: "paragraph", + content: "Parent", + children: [{ id: "c", type: "paragraph", content: "Child" }], + }, + ], + applyA: (editor) => { + editor.updateBlock("p", { type: "heading", props: { level: 2 } }); + }, + applyB: (editor) => { + editor.setTextCursorPosition("c", "end"); + editor.insertInlineContent(" edited by B"); + }, + }, { kind: "concurrent", id: "concurrent-nest-both-under-n0", diff --git a/packages/core/src/y/extensions/YSync.ts b/packages/core/src/y/extensions/YSync.ts index 9e2f13d06b..280118f370 100644 --- a/packages/core/src/y/extensions/YSync.ts +++ b/packages/core/src/y/extensions/YSync.ts @@ -9,6 +9,7 @@ import { createExtension, } from "../../editor/BlockNoteExtension.js"; import { blockMatchNodes } from "./blockMatchNodes.js"; +import { mergeBlockGroups } from "./mergeBlockGroups.js"; import { docToBlocks } from "../../api/nodeConversions/nodeToBlock.js"; import type { BlockSchema, @@ -178,6 +179,8 @@ export const YSyncExtension = createExtension( // needed; `blockContainer` already whitelists the `y-attributed-*` // marks. See blockMatchNodes.ts. customCompare: blockMatchNodes, + // Nesting changes diff in place: show a block's groups as one group + transformers: [mergeBlockGroups], // Initial-empty gate: a single empty paragraph (any id/props) must // not seed an empty Y fragment — see isInitialBlockNoteDoc above // and "Initial-content gate" in ProsemirrorRdt's doc. diff --git a/packages/core/src/y/extensions/blockMatchNodes.ts b/packages/core/src/y/extensions/blockMatchNodes.ts index 0e79597a3d..f8eec56748 100644 --- a/packages/core/src/y/extensions/blockMatchNodes.ts +++ b/packages/core/src/y/extensions/blockMatchNodes.ts @@ -23,24 +23,6 @@ const firstChild = ( return null; }; -/** - * Whether a `blockContainer` delta carries a child `blockGroup` — i.e. the block - * has nested children. A container's content is `blockContent blockGroup?`, so - * this is what tells a leaf block apart from a parent. - */ -const hasBlockGroup = (d: schema.Unwrap): boolean => { - for (const op of (d as any).children) { - if (delta.$insertOp.check(op)) { - for (const it of op.insert) { - if (delta.$deltaAny.check(it) && it.name === "blockGroup") { - return true; - } - } - } - } - return false; -}; - function getTableDimensions( d: schema.Unwrap, ): { rows: number; cols: number } | null { @@ -155,16 +137,6 @@ export const blockMatchNodes = ( return false; } - // A change in nesting is structural too: if one container gains or loses a - // child `blockGroup`, diffing it in place would insert/delete the blockGroup as - // a sibling of the block content inside a single container — schema-invalid. - // Treat it as different so the whole container is replaced instead, same as a - // content-type change. Keeps concurrent nesting merges (e.g. two users nesting - // a block under the same parent) from producing a lopsided in-place result. - if (hasBlockGroup(a) !== hasBlockGroup(b)) { - return false; - } - if (childA?.name === "table" && childB?.name === "table") { const dimA = getTableDimensions(childA); const dimB = getTableDimensions(childB); diff --git a/packages/core/src/y/extensions/mergeBlockGroups.test.ts b/packages/core/src/y/extensions/mergeBlockGroups.test.ts new file mode 100644 index 0000000000..94c1b4d0ed --- /dev/null +++ b/packages/core/src/y/extensions/mergeBlockGroups.test.ts @@ -0,0 +1,244 @@ +/** + * @vitest-environment jsdom + */ +import * as Y from "@y/y"; +import { afterEach, describe, expect, it } from "vite-plus/test"; + +import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js"; +import { blocksToYType } from "../utils.js"; +import { withCollaboration } from "./index.js"; +import { createYVersionView } from "./Versioning.js"; + +type Editor = BlockNoteEditor; + +const editors: Editor[] = []; +afterEach(() => { + for (const editor of editors.splice(0)) { + editor.unmount(); + } +}); + +function collaborativeEditor(doc: Y.Doc): Editor { + const editor = BlockNoteEditor.create( + withCollaboration({ + collaboration: { + fragment: doc.get("doc"), + user: { name: "Test", color: "#ff0000" }, + }, + }), + ); + const element = document.createElement("div"); + document.body.appendChild(element); + editor.mount(element); + editors.push(editor); + return editor; +} + +/** Two users editing copies of `blocks`, synced on demand. */ +function twoUsers(blocks: any[]) { + const docA = new Y.Doc({ gc: false }); + docA.clientID = 1; + const seed = BlockNoteEditor.create(); + seed.replaceBlocks(seed.document, blocks); + blocksToYType(seed, seed.document, docA.get("doc")); + const docB = new Y.Doc({ gc: false }); + docB.clientID = 2; + Y.applyUpdateV2(docB, Y.encodeStateAsUpdateV2(docA)); + return { + docA, + a: collaborativeEditor(docA), + b: collaborativeEditor(docB), + sync() { + const toB = Y.encodeStateAsUpdateV2(docA, Y.encodeStateVector(docB)); + const toA = Y.encodeStateAsUpdateV2(docB, Y.encodeStateVector(docA)); + Y.applyUpdateV2(docB, toB); + Y.applyUpdateV2(docA, toA); + }, + }; +} + +/** The document as nested text, e.g. `P{X, Z}, N`. */ +function outline(blocks: any[]): string { + return blocks + .map( + (block) => + block.content.map((c: any) => c.text).join("") + + (block.children.length ? `{${outline(block.children)}}` : ""), + ) + .join(", "); +} + +/** Number of `blockGroup`s directly inside the Y container of block `id`. */ +function groupsOf(doc: Y.Doc, id: string): number[] { + const groups: number[] = []; + const visit = (node: Y.Node) => { + for (const child of node.toArray()) { + if (!(child instanceof Y.Node)) { + continue; + } + if (child.name === "blockContainer" && child.getAttr("id") === id) { + for (const part of child.toArray()) { + if (part instanceof Y.Node && part.name === "blockGroup") { + groups.push(part.length); + } + } + } + visit(child); + } + }; + visit(doc.get("doc")); + return groups; +} + +describe("concurrently created child groups", () => { + function nestedTwice() { + const users = twoUsers([ + { id: "p", type: "paragraph", content: "P" }, + { id: "x", type: "paragraph", content: "X" }, + ]); + users.a.setTextCursorPosition("x"); + users.a.nestBlock(); + users.b.updateBlock("p", { + children: [{ id: "z", type: "paragraph", content: "Z" }], + }); + users.sync(); + return users; + } + + it("shows both children under one parent", () => { + const { a, b, docA } = nestedTwice(); + expect(outline(a.document)).toBe("P{X, Z}"); + expect(outline(b.document)).toBe("P{X, Z}"); + // Y keeps the two groups; only the view merges them. + expect(groupsOf(docA, "p")).toEqual([1, 1]); + }); + + it("routes edits back to each child's own group", () => { + const users = nestedTwice(); + users.a.setTextCursorPosition("z", "end"); + users.a.insertInlineContent("!"); + users.a.insertBlocks( + [{ id: "n", type: "paragraph", content: "N" }], + "x", + "after", + ); + users.sync(); + expect(outline(users.b.document)).toBe("P{X, N, Z!}"); + expect(groupsOf(users.docA, "p")).toEqual([2, 1]); + + users.a.removeBlocks(["z"]); + users.sync(); + expect(outline(users.b.document)).toBe("P{X, N}"); + // The emptied group is kept, hidden. + expect(groupsOf(users.docA, "p")).toEqual([2, 0]); + }); +}); + +describe("emptied child groups", () => { + it("keeps a child added while another user removes the last one", () => { + const users = twoUsers([ + { + id: "p", + type: "paragraph", + content: "P", + children: [{ id: "c", type: "paragraph", content: "C" }], + }, + ]); + users.a.removeBlocks(["c"]); + users.b.insertBlocks( + [{ id: "d", type: "paragraph", content: "D" }], + "c", + "after", + ); + users.sync(); + expect(outline(users.a.document)).toBe("P{D}"); + expect(outline(users.b.document)).toBe("P{D}"); + }); + + it("reuses a hidden group when nesting again", () => { + const users = twoUsers([ + { + id: "p", + type: "paragraph", + content: "P", + children: [{ id: "c", type: "paragraph", content: "C" }], + }, + { id: "x", type: "paragraph", content: "X" }, + ]); + users.a.setTextCursorPosition("c"); + users.a.unnestBlock(); + expect(outline(users.a.document)).toBe("P, C, X"); + expect(groupsOf(users.docA, "p")).toEqual([0]); + + users.a.setTextCursorPosition("c"); + users.a.nestBlock(); + users.sync(); + expect(outline(users.b.document)).toBe("P{C}, X"); + expect(groupsOf(users.docA, "p")).toEqual([1]); + }); +}); + +describe("version diff of a nesting change", () => { + function diffOf(change: (editor: Editor) => void, blocks: any[]) { + const doc = new Y.Doc({ gc: false }); + const editor = collaborativeEditor(doc); + editor.replaceBlocks(editor.document, blocks); + const before = Y.encodeStateAsUpdateV2(doc); + change(editor); + const after = Y.encodeStateAsUpdateV2(doc); + const view = createYVersionView(editor, doc.get("doc")).open(); + view.show({ + content: after, + comparison: { content: before }, + target: { type: "snapshot", id: "after" }, + }); + const changed: string[] = []; + editor.prosemirrorState.doc.descendants((node) => { + const mark = node.marks.find((mark) => + ["y-attributed-insert", "y-attributed-delete"].includes(mark.type.name), + ); + if (node.type.name === "blockContainer" && mark) { + changed.push( + `${mark.type.name === "y-attributed-insert" ? "+" : "-"}${node.firstChild!.textContent}`, + ); + } + return true; + }); + view.close(); + return changed; + } + + it("shows an indent as a moved block, leaving the new parent unchanged", () => { + expect( + diffOf( + (editor) => { + editor.setTextCursorPosition("x"); + editor.nestBlock(); + }, + [ + { id: "p", type: "paragraph", content: "P" }, + { id: "x", type: "paragraph", content: "X" }, + ], + ), + ).toEqual(["+X", "-X"]); + }); + + it("shows an unindent as a moved block, leaving the old parent unchanged", () => { + expect( + diffOf( + (editor) => { + editor.setTextCursorPosition("c"); + editor.unnestBlock(); + }, + [ + { + id: "p", + type: "paragraph", + content: "P", + children: [{ id: "c", type: "paragraph", content: "C" }], + }, + ], + ), + ).toEqual(["-C", "+C"]); + }); +}); diff --git a/packages/core/src/y/extensions/mergeBlockGroups.ts b/packages/core/src/y/extensions/mergeBlockGroups.ts new file mode 100644 index 0000000000..77152c13f5 --- /dev/null +++ b/packages/core/src/y/extensions/mergeBlockGroups.ts @@ -0,0 +1,332 @@ +import * as delta from "lib0/delta"; +import * as dt from "lib0/delta/transformer"; + +/** + * Lets nesting changes diff in place instead of replacing the parent block. + * + * A `blockContainer`'s content is `blockContent blockGroup?`, but Y can hold + * several `blockGroup`s in one container (two users giving a block its first + * child concurrently, or a diff rendering an old and a new group side by side), + * and a group can be empty. A `blockGroup` carries no attributes, so the view + * shows one group holding the children of all non-empty groups, and hides the + * group while there are none. Edits to that group are routed back to the group + * each child came from; emptying a group keeps it in Y (only hidden), so a child + * another user adds to it concurrently is not lost with it. + * + * Assumes the groups follow the block content, as the schema orders them. + */ + +type Slot = { group: false } | { group: true; len: number }; +type GroupSlot = Extract; +// lib0's delta builders are untyped at this level of genericity. +type AnyDelta = any; + +const GROUP = "blockGroup"; + +function isGroup(el: unknown): boolean { + return delta.$deltaAny.check(el) && (el as AnyDelta).name === GROUP; +} + +function isVisible(slots: Slot[]): boolean { + return slots.some((slot) => slot.group && slot.len > 0); +} + +/** Positions an op covers before the change, and after it. */ +function oldLength(op: AnyDelta): number { + return delta.$insertOp.check(op) || delta.$textOp.check(op) ? 0 : op.length; +} +function newLength(op: AnyDelta): number { + return delta.$deleteOp.check(op) ? 0 : op.length; +} +function written(d: AnyDelta, side: "old" | "new"): number { + let n = 0; + for (const op of d.children) { + n += side === "old" ? oldLength(op) : newLength(op); + } + return n; +} +function isEmpty(d: AnyDelta): boolean { + return d.children.start == null; +} + +/** Copy `len` positions of `op` (all of it by default) into `target`. */ +function copyOp(target: AnyDelta, op: AnyDelta, len: number = op.length) { + if (delta.$retainOp.check(op)) { + target.retain(len, op.format, op.attribution); + } else if (delta.$insertOp.check(op) || delta.$textOp.check(op)) { + target.insert(op.insert, op.format, op.attribution); + } else if (delta.$deleteOp.check(op)) { + target.delete(len); + } else if (delta.$modifyOp.check(op)) { + target.modify(delta.clone(op.value), op.format, op.attribution); + } +} + +/** + * Insert the children of an inserted group into `target`. Each child keeps its + * own attribution; the group's applies where a child has none. + */ +function insertChildren(target: AnyDelta, group: AnyDelta, groupOp: AnyDelta) { + for (const op of group.children) { + if (delta.$insertOp.check(op)) { + target.insert( + op.insert, + op.format ?? groupOp.format, + op.attribution ?? groupOp.attribution, + ); + } + } +} + +class MergeBlockGroupsTransformer extends dt.Transformer { + /** One entry per child on the Y side. Groups follow the block content. */ + slots: Slot[] = []; + + /** Y-side change -> view-side change. */ + override applyA(d: AnyDelta) { + const out: AnyDelta = delta.cloneShallow(d); + const oldSlots = this.slots; + const newSlots: Slot[] = []; + // The change to the shown group's children. + const shown: AnyDelta = delta.create(); + let oi = 0; + + for (const op of d.children) { + if (delta.$insertOp.check(op)) { + for (const el of op.insert) { + if (isGroup(el)) { + newSlots.push({ group: true, len: el.childCnt }); + insertChildren(shown, el, op); + } else { + newSlots.push({ group: false }); + out.insert([el], op.format, op.attribution); + } + } + continue; + } + if (delta.$textOp.check(op)) { + out.insert(op.insert, op.format, op.attribution); + continue; + } + for (let n = 0; n < op.length && oi < oldSlots.length; n++) { + const slot = oldSlots[oi++]; + if (!slot.group) { + copyOp(out, op, 1); + if (!delta.$deleteOp.check(op)) { + newSlots.push(slot); + } + } else if (delta.$retainOp.check(op)) { + if (slot.len > 0) { + shown.retain(slot.len, op.format, op.attribution); + } + newSlots.push(slot); + } else if (delta.$deleteOp.check(op)) { + if (slot.len > 0) { + shown.delete(slot.len); + } + } else { + // replay the group's own child ops, then step over the rest of it + let consumed = 0; + let len = slot.len; + for (const child of op.value.children) { + copyOp(shown, child); + consumed += oldLength(child); + len += newLength(child) - oldLength(child); + } + if (slot.len > consumed) { + shown.retain(slot.len - consumed); + } + newSlots.push({ group: true, len }); + } + } + } + newSlots.push(...oldSlots.slice(oi)); + this.slots = newSlots; + + const wasShown = isVisible(oldSlots); + const isShown = isVisible(newSlots); + const position = newSlots.filter((s) => !s.group).length; + const gap = position - written(out, "new"); + if (wasShown && isShown && !isEmpty(shown)) { + out.retain(gap); + out.modify(shown.done(false)); + } else if (wasShown && !isShown) { + out.retain(gap); + out.delete(1); + } else if (!wasShown && isShown) { + // Every group was empty before, so the change only inserts children. + const group = delta.create(GROUP); + for (const op of shown.children) { + if (delta.$insertOp.check(op)) { + group.insert(op.insert, op.format, op.attribution); + } + } + out.retain(gap); + out.insert([group.done(false)]); + } + out.done(false); + return dt.createTransformResult(null, out); + } + + /** View-side change -> Y-side change. */ + override applyB(d: AnyDelta) { + const out: AnyDelta = delta.cloneShallow(d); + const groups = this.slots.filter((s): s is GroupSlot => s.group); + const plain = this.slots.length - groups.length; + const shown = isVisible(this.slots); + const newSlots: Slot[] = []; + let bi = 0; // view-side child index before the change + + for (const op of d.children) { + if (delta.$insertOp.check(op)) { + for (const el of op.insert) { + if (isGroup(el) && groups.length > 0) { + // The view shows a group again: refill the first hidden group + // rather than adding another one. + const refill = delta.create(); + insertChildren(refill, el, op); + out.modify(refill.done(false)); + groups[0] = { group: true, len: el.childCnt }; + if (groups.length > 1) { + out.retain(groups.length - 1); + } + newSlots.push(...groups); + groups.length = 0; + } else { + out.insert([el], op.format, op.attribution); + newSlots.push( + isGroup(el) + ? { group: true, len: el.childCnt } + : { group: false }, + ); + } + } + continue; + } + if (delta.$textOp.check(op)) { + copyOp(out, op); + continue; + } + for (let n = 0; n < op.length; n++, bi++) { + if (bi < plain) { + copyOp(out, op, 1); + if (!delta.$deleteOp.check(op)) { + newSlots.push(this.slots[bi]); + } + continue; + } + if (!shown || groups.length === 0) { + continue; + } + // the shown group stands for all of the Y side's groups + if (delta.$retainOp.check(op)) { + out.retain(groups.length, op.format, op.attribution); + newSlots.push(...groups); + } else if (delta.$deleteOp.check(op)) { + // Empty every group, but keep them: see the module doc. + for (const group of groups) { + if (group.len > 0) { + out.modify(delta.create().delete(group.len).done(false)); + } else { + out.retain(1); + } + newSlots.push({ group: true, len: 0 }); + } + } else { + this.routeIntoGroups(op.value, groups, out, newSlots); + } + groups.length = 0; + } + } + // untouched trailing slots + if (bi < plain) { + newSlots.push(...this.slots.slice(bi, plain)); + } + newSlots.push(...groups); + this.slots = newSlots; + out.done(false); + return dt.createTransformResult(out, null); + } + + /** Route a change to the shown group into changes to each Y-side group. */ + routeIntoGroups( + change: AnyDelta, + groups: GroupSlot[], + out: AnyDelta, + newSlots: Slot[], + ) { + const ends: number[] = []; + let acc = 0; + for (const group of groups) { + acc += group.len; + ends.push(acc); + } + const perGroup: AnyDelta[] = groups.map(() => delta.create()); + const lens = groups.map((group) => group.len); + let pos = 0; + for (const op of change.children) { + if (delta.$insertOp.check(op) || delta.$textOp.check(op)) { + // an insert at a boundary joins the earlier group + let k = ends.findIndex((end) => pos <= end); + k = k === -1 ? groups.length - 1 : k; + const start = k === 0 ? 0 : ends[k - 1]; + const target = perGroup[k]; + target.retain(Math.max(0, pos - start - written(target, "old"))); + copyOp(target, op); + lens[k] += op.length; + continue; + } + let remaining = op.length; + while (remaining > 0) { + const k = ends.findIndex((end) => pos < end); + if (k === -1) { + break; + } + const start = k === 0 ? 0 : ends[k - 1]; + const take = Math.min(remaining, ends[k] - pos); + const target = perGroup[k]; + target.retain(Math.max(0, pos - start - written(target, "old"))); + copyOp(target, op, take); + if (delta.$deleteOp.check(op)) { + lens[k] -= take; + } + pos += take; + remaining -= take; + } + } + groups.forEach((_, k) => { + if (isEmpty(perGroup[k])) { + out.retain(1); + } else { + out.modify(perGroup[k].done(false)); + } + newSlots.push({ group: true, len: lens[k] }); + }); + } +} + +class MergeBlockGroups extends dt.Template { + override get name() { + return "blocknote:mergeBlockGroups"; + } + override init() { + return new MergeBlockGroupsTransformer(this.$in, this.$out); + } +} + +const groupHolders = new Set(["blockGroup", "column", "columnList"]); + +/** Applies {@link MergeBlockGroupsTransformer} to every `blockContainer`. */ +export function mergeBlockGroups($d: any): dt.Template { + return dt.children($d, (child: AnyDelta, $c: any) => + child.name === "blockContainer" + ? dt.pipe( + $c, + ($1: any) => new MergeBlockGroups($1, delta.$deltaAny), + mergeBlockGroups, + ) + : groupHolders.has(child.name) + ? mergeBlockGroups($c) + : null, + ); +} diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-delete-nested-chromium-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-delete-nested-chromium-linux.png index 8dc026817ed9c6632241917d9f901207e4ee5fdf..70f4b83e2bae52d5a2003e027db8c20788d6d50a 100644 GIT binary patch literal 8113 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 Q9L3*2C~GKHDwv1<2Y^VIf&c&j literal 9585 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 F|2NZ0Qm_C3 diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-delete-nested-firefox-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-delete-nested-firefox-linux.png index a6b54175a92d77b3365124c9d56113bef348b2e3..743acb6aca950e028d61a8c573009d2224cf5170 100644 GIT binary patch literal 8702 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 R0%SI)PN*NxK6d8DzX2qcgh~Ja literal 10054 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 c&d!UPzmw3?V!(pm$DKoq%ZO!*ymR diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-delete-nested-webkit-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-delete-nested-webkit-linux.png index 348295e7f4cd9213fb060ddec57861da3415bc31..1d5a7d7db42a3e370a16ef8e24d267e296357c22 100644 GIT binary patch literal 9265 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 S*5X%zwkXJ|$fTdq_xulWPbV7y literal 10589 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 PJR~QrjLDXI^z6R?f0Ls^ diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-nest-bullet-under-existing-chromium-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-nest-bullet-under-existing-chromium-linux.png index c889839a096c3b3cb05a96da700abc4924620aa5..c1b6acd20037ea9ee4b6e3397b950b070bb59db2 100644 GIT binary patch literal 10451 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 literal 11887 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 diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-nest-bullet-under-existing-firefox-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-nest-bullet-under-existing-firefox-linux.png index e3c0196a957666ecca6f159cdfd60e7ec08cea53..03610d80baec00f8f129d7cc017ce9774cad3598 100644 GIT binary patch literal 11284 zcmeHtcQ}{*-*;DCX%NZYm5`7bGApEHBzt5PBH7uIB(haP*440OBq3SZGAg99cgh~2 zjQe%gb>_`}iIA^T+f3qa%F3=lMC`pZEKl_*wJF5|I=pmbQ`1{5&`QNYV+YEt!zr>Gjq5S*BWx03%@7Lfk+28M!kB|5L z=eOP!-u?GG9UMvie&>GGmVdcu!$10>e#U()6xL$gjJV`F#Y;(`MMHA6X8WS3((F zS@V6eD^~CVi4LQH$tH~y<$*E%S8jqV63+c7Xkg$ft#0v-8#ivG>Ey7cluVb!iS@eq zVe6Qm<>#+-^{v;gul;nmdUYh+XO(@&jve&3e7Sjef*FJ@?3ZUu@j18km9g8mZ&war zg~|^^ZkKv4ol8|^xwVVwq??;KwtTM3{%bpTigN7hFc!&~xw%JYq7RcXi|?kRqf_SK z;82be4Q-AS8yX!wX=B5SJ*jaKH_A z=-X0Mh}w|sVl;VaKd|}q>C^2`4WiLYPJG+QnN4a#7!Gi93c1f+BxjM3uM1;wUm1xO zB-;{D6HJ%yIHD939PEy|pHfnKZCzj{arG-T>SBubxw*T)OFlzKLe6~3$cPnt_$Vzc zaH-EH2?eoee&C;!#MWt6pzpreq0>-b|CjgLkJS-=pNGf&NMbCSVtm8HDb{{2)j9uI zu&NDXIfDmy`0(NCy*qdIq^QKzjyA_RI61M4ir&vYU*d@BoeX7EP*q}p`Y)V_Iny|}+?w&n+w(r_CQbi#R>$VkggpRE zn5-_(lCenKBNoCJOvi6A(ilZeM>qfRLU`o8dpA3*IV2_HjyjEElN5t#`HE0uVk@LQ zzdv!GAD#GI5R91`%ta|_`Shzl@xZJ;>C+I ztMjcIPxX(;%X^cO***(p61xM4KnX&|zvYy3?%#joLR}bkoI?MFO~cGURjjn9XbQ06 z^NTBQC}dZU725WQV_3tbztboAtRGG3?lycNW~b`nBHB~pnwpgrvW?9v0=vbI7IiIa zY*fO?DSCKFoPX)O@4$hZm44fVuYT23PEJmiS5TN;D&I&z`QmeP1zx&Nw>(k^7NDV~ z7O?A;LJwA>L)6xOEEXq5@#wryQDHLjnpIHd(aEkJc%OWxDM2!thDY08noBj_WU9MZ zYQ9NWGgCVh6%?{)qVM&ZS7F8m(~H~hRf!W###1RL$t3u0*=ClJmGuMz@gz014NZCC z#0jF5sBTS9PXgx4EKfI0FQ0Q4lW28EN7T1iN!P<3Twh-*pI;sdr=q1jxirCh8grcZD5zZGGHF(MW9!1#j$pL4MybcumoAfybjDu3 zRvYVUQZp4>3}3lL%C3#8tq!qm?3I*c3i!`9;KJupPca_ttp4%Tq!bL<^2&+>ACLwZ z5rMIJkA_ZBOKL&;2>Sc`=Q)k3{#cq;Q&8B7@!T&gd>3_e9DmO-+LCa_*7k6UYu~l# z)Fkf*5fQr+z2;8KY^*x5dd(aU3JTi3bLZ>URtgP_!;bCSD;B1GHsY3gJt+e4P(t?o z#{hU%o!Kl_R#s9=-A*z1L|{nBMS#BZ_VRFw}*!>>K9no zfEi*%uP~zKF+hvp)KsqV@o_gdH)7}jox~Uoy!OYm)+bC(e9E8bD^Id&OCjcyTS({* z;}L5UeQcSe>(l`ZD=KA1K%vjtH)HqjpDZ0_mX^lWmior(vh)jrii*U)et3E&Q~T+u zGiNR=&kV%8DlOG3u%?lbky*WW`20%&pp0@|IGbh9%d4*z-km{VD7AwBu*b?goRItgo&}&DFCX;NqIU zVBL{XgP95GuqK*X#I84<9gq7L}B=W$N&+&xZThqy0RVrkbH&^vb=Z zQHTDzKmYu5CdX%uRKvt%FPiz|qzeGAp|#Z#I6;(REXgMkTS!1C+BrP1-p)5Fj)3L% z9OI<9Imc(up1DmHbh<4M1TbLgDP)%S(gynj6@Y?r4i18S*Opk&r4%WFf!nc{x1luN zDY7L)SrBTY+h=1f1~(KW^GlTW9JC*8Vt8?->lS*cd&PUHq>qx7wFQ`|SK`7qFfj1^ za%UKL!K|^Vi9nLP3w49`!}XL9EaIR>&XOM0a__Ze!4lVLPLM7x-nl3+Ew zI}IEo8W-AhVYdWFFrqZdYNuKfbuar1P~i zhpjW;Vd&(9izH?p;AkS@vn~Z)HQ80Df!#-Yo%ZsQ61Hr)h@o8tN{;ET&jiRuJb0kw zN3tsrrC$FzovM~3^Ct<3BRkd}AP2bQ=I0;7BjR^vhYlXBa7K*|9Xgbjl?BOJ__|SL z1}gF0BLz}rf?;H3lOQQ6>FDZEBdfkLX(+X1JOds}z;((Hr3^^7?Rja_^&%8qm2dur zmJm>oSnfY33vY*p5)clC-%Um3C#S4TmYA4Gh<_)it5<6@)zvGbl$4b0ot&!nv9tSu zup=QLU;C4~uPt_tcNOx3(H}j3PR-BHZ)Rpz^dK&diJTCOF<>vVppcMZC6t9w2Tbaj z+I-o#o^LwduHoz~QdU+b?mX2U3mQ~rU|?v96AN!@Ql>p@SPxDnbTdIBVh~l1$pk(X zb`{@;_{qrl_ji-kIemJE&ivwHjR4v2%jf3qwzIR#9{&0@NY2WN8ya~ZCnrfjObor0 zw6w#_%uGdF+ud*6e0(+3EG(heZt?_4S597DvTZ&-KFXgyeL`ay8X6YqLudeO$9i1* z%mLi5eomFFF6Q`*&v2wLZMunJs_vb8h|a`w8ID^^z4Ut2;7)^VQcKaQ@tUDavqqhfC_kg~e!^&!Vt&CF~+ zyJFarXV30{IU~#0Chg!__AoLwzP$SF3pT2^x0iq|5DEo=T2o73pK+)zoJ&-cHUOgj z?*03<;E-a56LNBb3i9%A%dUAUgCcniUW8Os9Gjb;C(sB_8Nz(@4g?ONO4h#@mPewG zp$dQv8THN0H4o8BcI9jLAr>#pEi61KDxwd7H_138B69EQw-4_M?Ti61g65W%`FL?{VWZyT0*#eV##OQ>Kp^8WqhG_X%lM{e*9dM};1FVu#Zw!|ML zP?7%Dam*=XEt#>`>{h%&Sfw9e@L=?OxuGO16WwoNhZ3gCeuiz?Mm_`jq@t$}w3_L! zwCQ;nMQCma%=^50CpxpwH#9UHhntKy097x3>$C&~@#;OhsV1{>GuqfY7Gr@;yp{gf zU)TTGLL%TcV?uagU>E9>4B-#@pkiVQPWRbZXBM}=4hPhhuE7Oo>K7bLsztbAqE`Tv zgn+;Lwf!MHu=8|pg3rd!KFECg?-P2Pw`{@Y4vcv$yi>I5E)v8K6Cd;ZV8Gr(76UJC zKvLi-$>;^HL(bj>alq8{dH>`)V%=WR)5D?x(k8SqdIsX(Nt(@jdEc4)ybrNv0Iit^ zWCYPyxmInQqISJa5L$#p*UpT}K(p7hm;3mTGmBS%EXUi^sV;xWs)XG657*>_XSMnK z{5GDC05MLrL_!W^m|eKAve2eRphW;Vi&@3>KcI_t1YniNspJ7$UvrhOK%4TRYtM!0TtR&8e|VY7vy(y}e`bO|+y8Ao2T4c4{SeT?OXpP%5`N~_Q4<8Yb%hYsz; zU#X z85ni=Lj?#DFzfJa9b4+PpWnr?fB+z=fWx3XZsH#hunmwjv@({IngM~1)_mwX-HT~8 zv2IJ*1(l8Io3CZEv+u9?LuR>ui!yw+C8P&JgE`=sQ!?s6$;9+VLrq%2+?)eYzA)Jp zO=slxhsMwElf@hBKe54;nnp$~p}C)IieA2S1i%BRxep&61xM@h(v~d`lA>gUc5kU! zXIrI+mvjw-(cVK(Ute%9D#`(o$mY$P@oB@Sz+bqF)wMOG14KYI#ru08snDY}W&_qx zCTQON$;r^@XgZzDtgHjFvTPu4pmK3fg3L9>lAf^ga#@}HuE}_Dhs_|;SFc_b=_6Ud zbj(NKL}m2T@X(I#&PfNG|&QgVs>usbyrthCJhaZInj~U{s$BT@OjqhUl&j=4_!LelE8lO;CA9ZntFN- zP>1%eu62EVNlcV9Gztk4S9O8OMU&nbc+LI3wqt4EI?BcS8U#hUO^om}iR=HlfIA^wWt7#trz z4O1E;?y%p~)bv-h_B)479sT-M$S2%>5c+wK^odz7@ax2#^@ z+|iz)75wPYejxu%JR`(kb#1K~qsXP*NF6JlTQoBwfxXm`L4!Iu{>=Q}ynVSSkE06W z)hvU;FxW{%)7OC><(l5!GH_?r5MZa^-eE;dhwCH3{=(j?ZXo!R09N~txu#q0a;b6d z-MgvnmHYh1A_sP;sC`hu3k%NBX@mzMWJyZF<<2`15f!FzrPU@Sj_^MkXezLO~Og3V~Gl++|Xq$k9Ml z*mUATSWGnR@i`5RSRwPBu+LAP8~}G>a|*Zc%o#)6BgHp?#)=UV5{f~72osz17;1cC z!iJFNnAjB9n3)#I>Hcruf*XKhU%p%d%T`4pG$6Vw1(1H{{{55I)`!5zuiFs_K$zEo z&wj|zi!`xExM_FiOUC88c8 z%x8wGxd_eez2-4EI4IDOrtat3>%Ps{*jO3RE3c?XsPSxQ4kCFJJdd>P`EwCGDnb4! zh->of`ea0HJ|06HN91O3DSqiF|8uMbvVe+`(l;}cM>K9%aLtWo3((H6i>bo;8*uw4 z#Bt<=DubQ784%#a{<+XD9Pb4=VAK-5e^^PlOa#h-7hw~brQ9MwP7%dVX(vdP=XC6#c)=06keQJ!Z{EGPUI1xmtcdDH)?8X zn&f|S`!Sw6jzb%AlmP*P0|-_%Ui`SKDme;0s04HuCnOa-+MPRhiq64M!UK!{xow*h z2M7>})-UjA3RA68&PTi zFs9M`#sIm*zy8{5t9k0wb~N_o6{KsRH&b{7@rxD~a~BXO=juO&b-nfW?OEos)wwf3 zvSV7sMMW^~SblMWZscX_t`~eL#E3R-Z@Mx!LO6_)sh7d<-*+&7r5=k#iAV&AfSOY| z<`|AVu-8OvQP}Gd+}^GUp^+AZv@;KZ%lE0CGYC-9aJGg@J319y>AFv(Ntriq-XwG_ zagcT1wWkI`{`VF<)eS_&}|JU8w>_j_||^aP$N~5eEkVY6R=M zuv5lyG%H$|5hsK&(8uyPF??!Jm|{?9OPpP>QPI%_01a`9^f)&+0!cBk^h=ixY9ZoO zbNKRhA3zQ}!zm=R2X$~b{O;Ymcq#Wgr|)tS=!IZm{KHcwMBsyUIM5gv8L4@0)rM2T z1K6$|RGhmR8I`o8aVes?tE=U)CAULDutCF}qh=cv_|LCbe9S-Yz_y#3OD&POi#N;v z?Esj7L!8l_)!Q6RT4_|f5g)uO>qvz?8fsWufH+5vlr%QyzDIYxG{o4yl&q2TuV>Ww zr9tJd9CK3!yj?mT(9SJWI}=pa@v)iY3~3zoXMn} zFA;U^xk}gh49O?#U=vK(ZBu&ZZy!Ptq&an-cXi-1H#e91@#Qg2Fa`j-n3mP)cv&B! z&72Hgu5Kasbj==lOhdKeycp+Iux1>8G*;0h;jGP6VvP6lx@0folK4|r55~+)rp~#X z8up`e%`S|+O9IA|y3Ie9INuNY9yV-Exte~_?!3aKd>4~NNS9#?;Rpk>H~0C7>>CFV zk@4~1mMA3dqHBhI`o@NJS<5$8s z(zg`bPkCl!cz@Z_-I2CStR)N}|I|dm_9e(d2qGx)+IKz7yq_Ez3Ci0HrnkW$P#$+bb-->4481R47>q?A7kFYQua3290Sf3DL=*vS1)vyV zSTJ%n8D$tC1{p8n$aa6{GuJVF#_q2B60U{)O1Df$-l_6C40cHyjxR?_+Ze_v4a5$$ z?@X&3>N&aREEjcKz;sAe)nk%yXOG*NT84+s+dhBtN+|GsGmEeczhTu>R(+ zH?honJXiXPZicmnRE>_Rjt1D}c{I?Ils(&QXt*rMmh+%8kNuOgyUQUX8E>!Rs~n!L z-luv>s)!3~kqwt4U_2Q@U)dBZjK(JCFJ0J!F4fe6<1sQa($qpAgc&~|AP@nAYW*Rr z0kQisccxCxXxYyx;>Z_A7dWk{1gH}Y-5q;4Ub3cgVzJu!8ck-$$*EpvTlofmry@@` z4Xtpg*ki{MIG2C)D3r+VN}g$Q2nyc0ESMbKlIPkf!TL?&M*olInQXndFJW>s-=BsO z?R9bQ#>kg09ZXXZN@9t1o7mQRa zDO37snKJlwv>|l+<(|my9ND4e$ef}(rO$4tb-t<`Up4ej*I!>0Fy!@e6%XdQ=ISQ) z>p5wPQ$RfLUtBTpCdYsgfdx*d5Uv5FObfd{J-4Dllxz;w+f9ZD@BjiGGmIUPl|xC- zK|vB<*>U8nTzv5E>%i2j^1YGUSg(ckdo&k0KMdrTF;E@&-L=|2vpA7Usx?iAzdB9AiO*#yU_rkLY4v!CxRAK;!X2z zYHE2UrJeW|jMq%%Hi#l&95j=V(O)O@W`Vq{;JpXyi}gReI1Jv84NZ;9mEOAYWoCgs zCiRG_FG(td=(EAU32c~7(tYj#+*kK~rEteC zd(z(^`kOD3fHkV`66gH* z+uvklQsl??t2ZP6TNG&<1Zp78@yp47Uz|HbCkLn-xGM2K{d&}yIiFwOwNf2$bl;KW zvmn9Ldo8v(lWTS{TclB`g^KJmz*Q zTm~P?RmYR}Pg&0i_)Hv4u$ z2!)b=-$-hGc?eQ;aB4~whf89B83k|gYcUZgBMr|Cjj|M-d-v(FS9D22;tnfADW6+c zH&%t?wAF@Z6Wdk8V!-}k(e*QQEshHnmND4ffrZ;S z4o*2Ocn3ER-{=?LR`KNyk5||H8f51fZhNx^5dd2vF~$Bo~O z`?Q(4_vW+r^SW80ytGWn`d)=J2xMt$-qUa>CX0*Xf*Xp4lc{WeDv?6G?R<|Q8I0M8 zrr}|b+Gzy^2K?~RCebiGYhg2OCJ$|JXjzr)quS}O7!N`#5U;}0hZ^Ok20wV8t*=p- zDSC&L1n`s7wb106n2GqfdF)wwKGCFO5IsAR;x8q(e@j4jDTCKSi@+e4#f5*fwJX-& zgvz>~M~t1kXz$j?m1RU#NZ^Wp0NIUjiL^Bbd-Gd>&~hV7uj3y zmWcUrv?UGu*4-NX<|AgQ#$xvER&0A&=24Z`N&V3ou4>dW1t)Y%1;P~9`58(|?_k^p zMh6I*n`{aqMn-&Va7S&MT<-;gA8|H%vVQXlsWabqjh2a?w_2+=A**WSH>cN5^f2XS zc%%5txi%@cSc~iB8{;BFqZ_|2f^#~8oqGZn1t8KQGU$BrF4BQGbV zcI?L9_OEDK?yIyBTP@}FI`eIuRt5o|~g}NzY|Wv4^@{Pgg2k2zP>_Ya5bcroUY zmWGj(O!Q{wF1{3faDx2r53Tum*59A;aT2M&Ke`D|gZ};mUqAczk@ohd{yvhGtLx_9 zM>aOm|ND^@=zm?*;{WzV5BxrT!n}C#LQX+}m7V?B?Lg9qq@*xdikzgWx%rEzC@Ci= z!9Ef9P0p5Z)Qo;>YwLM9OfiOQ>`fT6SbKko1wKtpU0oiFZDto1j_d8!AgYRrqJm$s zlQ=j!%EM(ZT=12c`xJMbQP|-mIXOGs{L0}dnRc-;!5IcY)AlHKOdOwoTO`|crv)uR zn?bopkNBmZQ%OQxCN(wlv?Ln>&RF)py~M)8f`$`9!o_!jx)Md!YX$8_Z{B!3Cl$de zegAtAi+|_#>V&+qa@H+>qCthlA7zy;tE{T3s(a+Vr_PM;Z;i~9_31bCzLq=@hLXUR zn0Hl(2b)4Wzh-@n=we~z$n{{+m*Bj+2ApZO=ccQ!-M%gcqXX_vl+C2MigVD89XD_ONC+fl@{26sCtE&(eqxo<7F7EEQRB7V(kLP6^9QbT&_XX+c={fJc^-E8`cv(3K zV`z9@$fTs-WoyX!UX{}|$io!saGMZW2EYBdl!vG1Y)=MpW{E{N-=m)@5U$(s6<+M0 z9&_^Nm$d5r%>h$W(<0M03h0(tQCGgFPoECnA8&lNy|dGkp-79d=uR^G`8nm+EH1D; znqz&V&tQGMTLPD@dSTf6(DQ9ciR)rn-~HigVeIMCr$bN@Nu{OyscC7IUvkv5=pbnB zn+qwXZ7+T;k0hTHurl0Ps#^a3{xL^HL_`Q3ug`FeJMOKSqK)}KgeA1GQ7Tg@US?}) zC`Z5MMhv&Xbf?frx?Yu&My_V);y}52iMdk3`1p9Nn7be?m+ojCA!-si!UMk+!X)yt zDVWy83YU2Xa+?m70wv%8iAi|xyxi5nUHj?Ho!p@Ca5h#}pRHkcGH-8h3_Ck}2(#EL zG51ZCRH@V73iLX13qL48Bc3I%M9~c*>A3(X(Sq`3#C`DG4GIaFoNS9MeK_#)mB0f& z=-W(e;&TKp+&1P`=L>6l-rV8f(yx|-ME93kQf6L|4O7Y27NDS{v>bXbAS^80TWF9B z#eD&A)7uk|$Mf3^#tJ<6_8AJGzM*0EOB$g`OITA>VxkhD1^yRK*%dkps*EUKr`&vV zp+B~#rze)zF5ONa`9QHpuzD-wD>Kfs5&${o$CaWteuOZA@`I^U%AHQPoLDa^^X0RPDjX&63w)~by5ABs<)DQr* zWvKnZL-;{oK@&S5<}5DDacxrGOBvu7@-hhxH3i_1sStg&)Mn@v;O@lOm?VB}s#rV! zrs1@Jc zT5c(Q(8oo?t^X;Q`-9xgo5zqIz(Di={FcuE@PTx%QT<8i$$%VKsP(|RP%gdqf5pVK z4A|Bxd3cCI&L#m-;gm$kv7vT_9Siq|ZPu}|G109-N9!M@&j21GBO)a4-@gLaj%|_TkzNcGVMx-DWbcD`WXP_B#h{@IDcZ=p8&OyY|72X z#fCqsoVg!-%S(YH7QPqz=H4yj^Vqht`uawCdANpN$cB-bnK?Fql<9d)3@sd2hr>lK z4OOY9$((5pW9rDeR|2pfQTvXVmaEA7&FnB6NA-G_NcFECMKl2cK`|hUSI1kkj-SIdA{h$NshauPoOVInn zNVDdyU3$OnbINVr#2b&F-^tbdQf_NN%834$E+2`260~HaMka<{-(`#-;0%MzmsIKg zT5k!6RhmJqS1bf6I5`=Wl9GbVu(<0MYmJo3Jn)QOip9oF+WK$KDay&>XhzcUi3wrHX%Z-bOlXAaow?j?Jf57ERyKx94?(%_ z6(?ju=p-R4ZJnJ!PM&U!cqaqkB`}M*snmLT=4o;ay?>0LAn+?}0=mwZOgxC4kB6p0kj=hZ$XvU(MyxEldJ<}2 z0wNg2d5@xM2)jPr$sWX(A;3MWr=+$ zK=T~cv{NStNljry0#opX%BEyu>RhxMtl&kavXs_u*10xJoozwn6NY5$rc?i zujv*#&U6j71EAQU8If)%d(db6{?RN2JZG}k&NHY46_{;qn+t8w06)Lx(gH+Z5nAt6 zSLQWqr-C^wnD_);^bM;Dz_Et`=Qe zUk4Us0NFjqfBz;Vh_?*j9BO=JbHEl?+|Uq?3bvJw(lNY({3Iu=3d)p2PI^sF%~ z`BQ>$BuoN?L_vYn%_MsxWU0TuA7PUS`ASVqU0GYZ1^iYwK0cly6Yg3N6CLeeRV9Lj z8a8VVp>J$yx&GiAr}*~h31GO53;iW+U0uxs1MzUa&E(Qjn7WF}+1g87T%_udwaQ`O zAG1SMLgi^%#m2ha+}vd9Ff}rPn2jwjhpR)Xkx`flvEwsoCV|S16L>&_@>ux;FvJ+9 z;~;5#XYS)KpWxsfC3JLaZU>XaU>dgsXSnj8aii z`2k-g4{UhaWIQI*EpaFcP--+*?{7U^9S3;4)+MsMG7&DJR%UgF=nXv4;1zD}a9NaR z6g<85J8OA(DWdjCwBvF>0(RvsE=Y-&(^Kv%hk+JRnNk1Z*Lna zU@)d|M?h;e6%a~hjX~s%jg6zd>GG7&T?#NtDk-ntEeHWLcmc3xsGzKDaj=K?^YgQt z{zR`?sILTk*tTYa28d4e!OpzLS{oapky53Djpe%)R{PHxmmBTp;Bb9Zwr zDl)R6*rdf}p}2+TPJu4HdZB)e9n8r~Nl8gZ*W;Czk?Dc8V`gV(KP5{f|Mk~d3{Zg? z0QF0Pf-j#@vaR7~l5s$RZAyW83=R$9Aq6~4pof4t@;NW*!f*_R+tcg3vj(PfrW$CZ zZk1DLY%JX?A=@yhdsfyhVqcL_APHtr2MCI@+z#M*_=7*mb()@};r#jYPu6F;OH5iw zfyW`r0j|V?lsQm}hd)Zk09!{JpHVW3y8H!rK~6#8gUB?bo)A=?oHRvd8T2M-rK7&n z2|XupMdux-FCm%v(qN^>;rn3Xsi{%yZZ4)lNdm;acyUQl?X9W2cDYSw?cu&H zth>T)>^LBhl(h7!tQdYW5=p@K?^>X=+LOfG?+?7Y2Fj+cqazq}!F#7gg>YsuM3e)t z1GgQUnF$OGB+P``6nywY%FXRYTwL5>d!K=K=U}CyyrSYne)(`cPzi3M=OH1c`#T%f z-;16iIOO*0zO^6&0aUwh4pbu&BN&k@d+XgL#!W<=G{pbunix~li}QVj7LX|G!HS44 zX|kZAu4F^9ytc;(5iT&+5I75*2}shB8ve&Hr@l_|Sd+i1nTKdQptxqhBoO}3YtlRl z^$Khm226_U`ZOk%=V=&|2qFr)lEgYf5gh{q2Vr(u%E@p$F=*?vkWqGiekvTKv%Au9 zra}+;k%f&d5Hvv~kbV$=0CE%HG5kh@KS1)=vjaAhGTq=oy8d?ty446IWyJ{0KZb=Ngh43mfxAcj9wYIymG7lX30GO(#;P&v;L zh!6z41f~}B>{$xrCU$Rs9}i00^#DJ^3#b$dJSI50NCwkM2F-M^y+wTt+zLjs3*0x5=awGwnhy83>6w4jko=f0zK~H=Ei5)b5Y-Q zikj%^<;wv8qqs^(3z)8mFthAQKaKq_Bdj3#Up_3#Ynz3TjCm5G)5s5b)hy7JhrA)9 ztS=tq9WO6$H88`;nVE^%S@|q%q6evMO`90L%$!!RqR29Sm)TshJr^K=$gI8u(305n`qR ze}S`YChgE@&mDeoadEIS9MeF?^x$x(NlBX<8hl4yynHDG%!nq~pCM7qoyNex0PbDR zAt8|rd}MTSF%%}SP&*iMVq%G~Fi}y_ifGUnuLpC$vh*bxp8M)16_#05g$H&Lc z*?A`X#{XKtK?poPqP#(G!F}eDm4fPoOZ`biH0}iD@D~6XpY5<{0++!D3{ZOTX)>Yn zgM#+H_HUz*Cv0g6)F~cVjJkT~xsJWFa~2SN=#f@~NDvxcUS5OGn~YgFIYV@KNqk|F z>Po{Sl^Yjp{Ygwbp$RU`>c&RKd01IR^v91k53V%u{D&{5wxCAWED+tJ1CeIG^M=Y> z6V7+`0dfKpe=x*|&Mz=Q9}t=-*Os%bKS31rr=B={)q zj{1^i0~wOoTR8!S3j()9)K^!A-IrA}6sV7+;*lZSm;sgY1^6DAAYnnR`|bbJKJC$} z5YG6|jRvpCr-`WXs`Vp7Vta#@5Zn&6#ZD3 z)azimWO*WYrp0(`B~>^2@}T0#r{zGSvM=cybg)JuVg`pkfGxxF0bc*Wz{rGzPk@%$ zI^|r5?_Jx{B0&-#Pnh}SwL^kPWMkKv!*sX?vY5l}fW7XhYdSCe{7xopE)8`6q9gvM zP5JuvL^!U*LK!L({dkTF@Wf(ewC+VhCY^n zO;jA3A<$dj3Jt=CY_eeL03S1Sn~J`Rc3C-}NzI|jwO;_%+V5i)qE{r!koLl&>}JpZ{wLNqGZ0mrs}dA{rdI-5o4IgySzBe zcypzx9zJ?h?T+hSW%-{RIt;izM>o}8w%FVlZoBhi53FsLdhegTU1Pq_(@DR@pTp*4 zqA-Y#p>^jZ z5YzMUU|$~SAh3t=lt5-yprq{TnLHp~K)?cvXfQ89GViQ!({;zm_MY5unKdi(L*KwG zl(%McrHKpvr15))S<&Fk(v;>2UMc78puF7KyzQ9>d!?HubFyR~EtkJFmClJ1q7Glg ze&a?pJ@uoOa()$Juxhty6Ke9M<)Mq~XYIWcsE@zar}3g2^;cfKqwiR~9Ul~bK#^jG zN?Gs?wH$F4Mrw^t@Kq^u=vQ;-_H>>imcynoJD&TW&x6$Uw*)PQNxVT_HPnRya;^-# z7g6r+TT8JZYqW|C{{RUR3n+6R)Ce%*X*V!R(m`d%7U)*igM5nPGXosZ_}B|wgA^VN zeIQGEJa=-`{E@i<+9?xmwD6-WxV2RdoHpne@bmzXAvzAUXvRj*o(Rf7A(J2Fp7cz{ zF(ze|>#}G@d;+>UZb-sYGHv=cuPe>9W{!q;qqBO9k>%c3qTfh#w591(>QB%#T+vVE z%S^~qT+lrfUNniJ)O|~oDH~tiH5-+;wZpqP{+0F9tME3HWpgq$u%E;2R_2y*y1m@^VFGWkgI&APk2l zT7!!>Zk)^7+w(vKf6DDZWDLp6%OeASp5WA}@u(LsZeg*cPy!Qf;E97#Ge$*2)4bu~ z;ZfnXaTT6=t=3+AgNKdOwwZl#k{Qdk{942R{a(^S9)=IseT-E6=hm@+uc3R@qSiJ} zP&0}y_!c>d7@yhp49A5*p5XPIz}CHuiZ0isvomTH+w<}tCB5{y;AftU#KGIc zWt<;ke;x1Z=&X580H@xCP~0?`m%>(nfw6KSar$d>-&; zNq}L^07#j=qvHi3A=*e7K)?kD1RSR^kT5V{0S`!k1mJ+&BDxtY_TD#lf`PAruh{zX zn$EUZvganfkb|=`GFgZSxs%7W9y+ZROs#lx(p2v^TnVBK6kNqQNAeQHgnTrngZ+^_ zO%V&_Ws{9PElj2GU9`IuiaE)v!hOfsas73+^4Z!XMe~j754s(l^}mM3>$FHXG7}aQ zV~_iwMrH1DC7U4M$%%y+J-)ENXP>~8&Q!;fr<>qRfh)9>tur=)ucJ6=<$WzqK{q-S z_WyMVD!u{sOX7Hpj`tPlrNQQdUqFCE6}aIriw8f2OB~3#xS(M>uL)e0q!9{c=CDrl z39yzlK;va4ia4tk=n50H8yACQMqJCPh6Y^njB#ekbg)oc)yob_Z&ZN6Y7dnZJ}A@0 zWv65`jiz*dms(JW%*K4Z9A#Yg9w+W3j2+>ozcu$vtklzlzBWn8e7b7GvVY&8f_Akj z%5#GiRjU`Bt+`CD_WlO8h3r7i@OuN*>e|e_aLvjuqS0qBFW6}dl#@9*bEoRNkm1US zcT9@u_${x~{4V4{4IrwB(c-KKj{>aL7=%F-m)@&~1Md*m5b^%aPx_06Kn23m-8%yYDM4Y5#~64Sfn7E^J*`&d^bn+F6L?(Ls=2Cn)m{j$=$sQkJr9gQ!T4>7R-9p{(M_Tm5@$<)^qA<4=7ddp;*XBh@PQTG zPi#@SYgEv*Td$f{Q7~kVJ{3Iw4>y`2=trObg24RamiWEELqdnU3&S<>uv>Z^1jUE# zabnmNLWm&9l9n7$TTxe3eE`56uiM+(Ba?3?$(2 zBSU5%tHpT=7x1mI(8cmOLClPK!IU{~imm0_u3)?)ZYCCH65I%2pdrl$O7!C=UMjRQyl18n@=a9+Z|9v!de{zf0C&byFq@!gPk zd9b_YdUF`X+@dHhDe!=hhpRT0G4<~^@dlRr)%cFP5skWnC*9($`TaDmpEn0UwNAsw0*&e!6DWCupaW@RNalD6ZD z26xwWMz>za<64FwJ)40}yT%74UID`>CtImRvgQYyoXP z3&teutsyjJi__pk0yvqmV88hI`Xal#+%>-_5Y7=Ue8f4HV@QmKVwTsMTJiz5l_d3Q z60qdl-b8QA8@Qr!drl@ldC~je8yO5nEYnc)a{tCe?Vs1wBi%Z8#wJiQIcwpnTeBbF z@heziX2P2hUEqA#-SF7v0q&Fm4ld6W`$4q|~6h$MnS|k+mNG zr}^#!UNP&4*X}h}S685B1u+p3b@0N2H28k2Yir}(4roT*?lC)P5!S7jG0OJ9oLu`H zwk2qYhYyUX8lT;cM?ZeV0OUhUtdPub%nk3_SMi9K+IHkDXF&8qE zE)2Z$Ga)?aoC>zoZI?5H@f`cM(7ed8fpc?t`^9=KR{%$caWVQIi) z@2`A9*op4bGk9)L{3IyxgwvFl?G}Fs!2X3iC~$&1|@k( zyc3DCuA^gFK_PQ(8-jT*$-Y&ZUka8TFo0$0b=Q5fRW>XWrbFCcy$LT%bKA%6RlACd z^mV5$GIa1LF=$7g>Ly9O^)>6>)>k`>UXmZQlB};ZwN1EB#64cK)htwDnz#QVUsBPUdd(WTM%tv z$rfPKSMRNLV3I`Rz>0-)8#nG`Zwl!zY!J})gcbe5b$M*ybJLSWWCn!Buju9c;p_vm zq58Wc3tMFQDn7f}1GPo=s(M=-nE*>^T>N9Owd$o}d)>o4eNm#S zK(;AntB*CmI#aiJ@<7CSP$FHZM)&<_jknrbxap4kfR8;1yHkIP2sNuNr65We@dMzm zpbEcnmMOHC3mY~|-OIc|==%0lqd2IFt1|qVt0lIh=3AqEj%=~Q)6%H}q!#;gIWD`W zzNGYJf&Q|_dkH?1@Ra@*P2!`dIlWrDaXt@o2V=lZC!@MNu3M8(_cYo26f`d$Hj!nptB%bE&eni?v}2)S{HO?ayi#b&h)y8@3uYD>f^hg=QvkK1`^^lx+(I)~mza~#cv_CO4bf_kwob%~ zmoqZIjofeP%72z<6?)tocs4;H=R857=Q~s_R*o&R3vmscvEO_NuS&?w5|!nsalDFb zJI$!{<5ND`&d{xL+1h5(d<)o1WAyLt5o!NNO*B~W<`~!lV z=kXtDo)bi~OnuheT-tj%UT0QGy~R2#s#botGmFYn;M3RQqf>##<^d>H3xN zDMd*aJk`v{ZV9`qQx-nAI7X-8war#Bi=#W}Vl&<-+pX5qYhGilD|=8Gl}{y~zmqR7 zTpB&n^D|B#B;88qxTE=)ub-cUl;l^d&jF>lK%^eKAJfTKo{NSSt?c6r zJ48sG6jAuXL_JwX^RLLho%%{f5B`wtvCk;F%+cTu!o%|EJ+pB&o zEaI(O-%;#X5xtR{`Ipzy#ctQdXD`n9oZ@#&bHcUg5TZc@K($6*V zXw6A5KdH6&#No8lzQfgLD-HscaicGyb5xfJ3bt_XE2YZmWiShj)t00a~|cH0`CeuGmwM4u6%dbJ)m!n+k?1 zR#8zF?F)p6g>C2dEgs_UbCQ@&t^QswyoIivQo30WtH>p5(Za^EXrMe3fO2=qM+Z-@y050Ob3 z9@#;7nPzm*01)RPX!9f2V7iQk+@kph0Bi(BE*x5SlcrbW??%La?dWz7qrR z%C7!_v{Rq)78Lc8A6xRWZ+yIn!TtlDJ_pC_&HIjTq{X`{4Z@&}9LlvA4}W)3nHehU zvmF^&W|P>Xm)#?3#e)-X)fpqdvH6V!wc_#I{yv@HYeZDl9fk2=CxjJHfktG@uZa|3 z0(tX$(&jgv*dlB=vA_a_ut)tr^L9MI(b4C>V_N+Gl|sVc^WXVz47=VPa!E6{74F}J R|GIHZUK%S^aLdr=-vG#!cU%Af diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-nest-bullet-under-existing-webkit-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/addRemoveBlocks.test.tsx/add-remove-nest-bullet-under-existing-webkit-linux.png index a4407868ae48333c4827a22b484bc433d21dccf8..2f8c42402352e21db5e154bdbe9db9ec6e33cf2f 100644 GIT binary patch literal 11985 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 RUR7VAd_+|-<&g39e*rh1wygjF literal 13371 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 Q3OXe(qbQwy+u-^C0VqyEn*aa+ diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-indent-cascade-chromium-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-indent-cascade-chromium-linux.png index 055d7b3c3ff34be208149680fa850accce5991bd..a7d12256b30aed23d16f3de56be46c1c62c319ad 100644 GIT binary patch literal 10966 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 literal 13103 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 R@Y!`sG7<`qLUBEx{{|%Il34%% diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-indent-cascade-firefox-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-indent-cascade-firefox-linux.png index 234d600fc36d3c9f89ef76f69c113571a2160f65..f6dd02842a4795cad3ce103a046a5a57f4e1f1af 100644 GIT binary patch literal 12202 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 literal 14355 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 diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-indent-cascade-webkit-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-indent-cascade-webkit-linux.png index 2f569e9631c7ca460e26c94d88ce25bd77a9ac1c..d545177305aa7e22fec09ad705d92db6e1544561 100644 GIT binary patch literal 12871 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 diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-nest-both-under-n0-chromium-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-nest-both-under-n0-chromium-linux.png index bf9ef8a7d1224b0149d106d81a4f21a209e683ea..ac1c3b3de5a01394db87277cb7c9482a19d9a67b 100644 GIT binary patch literal 7982 zcmcI}2{6^~+qV`aiYzT;chHH*?#NPza}ctI@Us(HvL#!EP}z<>Tjf}@6v|F^S<9Ln zglyTe?>yJHp8xZ{^E}VYJM+%`XR0yzp6`9%*Y(-1`vj}2DxM-|ASWRqIfcW@YmktT z!jB|($&SIlZ4-U=OPL&7B zYQ;?8*B|D+hF zID~ooc4RsDE)Gf?by{8AK7qpFkv|P-B!7RvIq_Wk^FKHZB6;}V-_jKy{?}u<|E|YO zmbo{dh}sjIOPt0_emtSr>`vL2H!)#zo@^UU4U>N3xv_xNklbqE_o>mdN@`g2*|@6z z(GC|#$yBm2>{+_I+={z-Gfg>`&r9j2G>*=g)1vz9GHpHpj}% z9mw$2I?AN(snck{Il;R<7a2tE)=!nr6|`vOLa!StwszPG#96!;OTB*!Ep%ne5b99-BT@!X;{<~^)n*%numeluZus9Y>K zIM_@3e;h|XWNge-zsR~Kl<8{o=g*@nytm&yvL7n@T4ba7aCN$7)V^f&n0@)Y=>7Zm zr+eR?6S8dk@zOSL)NzC8OjY@C?ajTxkLDH@x6EpukS4khd;FZ35ODl)?WLGQ$Fnm$ zB~Yqw?@W#i3=AYXHPYJ+6a>t4XRP#B??(?;deV{ygs-+|XJ?ys5papFeR?WM644PH zie2wazu)LizxlbfH8m&ah3{6ZFB=9E@6ehoB zLx?;t`QVDck>iv<_jeY#>ByZXqIC@KhH4uM1U;gfC@vQn6)0w(#e;$nVK1t9Ezdl--~SS zJQxiiJ{S+#9i{TU)+Lq?uT_b=^0>--=l+jRhn81XvLaGa)Btut2zP9{2q%nh2s2Cs zoHP32+fBgH>KEIGp!S4N%OXq?ECppGOd4O%yDSbf;j(Xv+I{;pH&AFZR3-vcwtyYdojD_5 z(L(pD_pKtduXLeo_Pl`U(N38IN#z(`ljWbERZ^sroI9mr85}Ct&eGG~^m*?3df6tvs~sLR-1V9{Cv{l)C9b`KOgu!xO#35mq;>eVXqSJvklmfx;? zDAF3sKeauZpW(B&eaE#|n{nZN6LadTSC97hb_(weiiUClI9J-mRz4k}x?m$g{#-8(Y z@$-iP=^MjXI?)-4wK10s#EAr42t1tlT(%BYDqX0!imq3+(O>lF6#?JtwNoW za# ze4hqrNBmWHzUb)awq&Ubxa@lirBlqq-W!GwHx_QHs#1d3j@AW6#>eCA?fF0(x#7vx zg`tGFp>lU20JDasCg#rd>xaymLM?hSZ}kB6G0v0fb8z@=txO?D z?8`Uq#B(Y?7z^f(lW@HxWYu9lRv+vy%XSyxc~6g)W&6t;Uut1Qrk>ixBR zo57El&l$Qv^Bq>{1a28s1 zPClXFW3?PAbA7>x!9&*_g%LtVa;r^N?JSH>$sAxnB3LJp^SLh$Gq#6_4L38n6R+nR zRW^5aa$BxWeaUt4!8S7}Vp4lldVkYwp=!q-w1%%Sl&N*} z&DV={fmGZ=LXkw`orQ`O)k{1)GvKTOz(C8ED73KMw{XP1(r;dXRPkxDJps+bV^;U{ z6yiWBdvjJUvwa~3_N4*;v+90-)bq?KM)7cXH{f3(j9F@PCFMZH$cULoC+DBh+5kIZ zNd#b;Ix-=l^>Q(>wkJz7UeZI5#b=XEz81+3-yS%fXLiE$s`d~R3uEPd+Sz>ZGL5AZ2(0uVodp! z>kKz;+}QnbT;>%}Gw1gEC#hRM{HU7S+d09E$=gK9bv;5W3I5Ob^sDm;WDu>KH8mOY@Dzz@U-5Eo{FHSTyVH6(hk4`8>a zC<5#186_WtGaRR6d<8-(>@b}8oUbehs!J21p!eRC6anQVB&2i*I>PqEIEJLF?vrzc zoqzsXOSmtz{rntRI{Ng2b$9wH{)*p+^DCCgfoK!fh|@zfxn1JOc0tVE9ClluV_cmK zx#B({xoMC`orhf5i7U$4@+Y)JYqn z5F9V=#O_eF#YH9gn}j?00eioZ=Vbvn+}r%Bm(t$b;jyuS1P3)?22O^Mu3`t{hwF2n z6EV)yP~hU>hdjvUM5H%=9C2G9e!k#Pab4wLe=jRD^Hn3{OPsPYM>@!C#pc-aJMKfS zNKpZ{@9c*pOhLF6F4DaLNZ1Wm#A8viU>gwx-}FcMSy1+Ruhp-LD#?=ZgZAYi@j_Pk z=;#|E3q$3a`uZ*WK1&qLzPnD}iyhS3&gkB$=}J?M7ce`9Uo~_F8~Re}Y-QxLWzo{o z66CSgtBZtO0UQpuJHhX30=STb?5CxpgO7<(0DA}4TJ>gYL#A2wID1*Y9tpAlT5x+L z^~QOuOi~v*PpK-rIA6n)Ur{>>w3PxMW<(;QYrmml2qe8fPlWcsx=Kn)o4i?BSw;5- z;d~!|yMl_*YHDcIo{Nr;{|xf?t;+i39wJ+4PoCjbQ=}_a2pI$ba$~dBBUMtIoSa~_D>vFxWKtl;7P`*r zm{KxJHh+6>h6KMCLLILl!h=__&J2oykgU%Q)OGr-3x)PTumxkB1~1;)+RD-Y@C?#t zXu5H=52E0^yIxQ~dB_a4IV1 zATdbH0so5x@kVTloPq*<`SQeCzp)j>r9|KTEePiCA%2)5Nfm(QvD9!bUd(}6O=^t} zP@gUrND0Ex4)G8nDUxfbq*hN??+h)LOeK3-e|yKaG33qyd*h%9cKmLWAz=N5HB@H* zLAqLsDhytr605&@pM!n9gQ-KpZ4L|l$a)WzftaBN9GmIMq7^VGwx2+hyVG}H$STq4 zSZ{Cd3l^DVWZ!&-W$LNGbh>lrkfip`bHm=}U}wY`BCr!!?=sQ3^S#@=J`xN;PB1Rh zr(s)sx%wZ*l06q*Ls;s4tGm*1beYzpzPyz+&y^+5-#=5V%?p!>_q_xZ}_1TS5>lxa}R7klUaiM{Q$ z@rHB8=ED^pk`NIQnL~V8a`lT`&s*IvNatOdw>a)1;pX0V;l4aWWk^2|6Wfxm#_Hti zJHbY}-rS%-yc2SB>GrR;m^%<^-@Oa(>e4Xs-E(!D`&NU5^bFM`q|2EwiNQH5ppJO9z*4vr@yduNNwC<5VpRiqM&dL5mi!BQeNY##O&-#2+kdR zRxUt_kSlkakCXBgh1aF}9_$mrpQ2)7?r+aztTc0ksq5${Kt6&PGzH<If6s4*q#YKG`>-NAVqPG z&m7FL$Zi1Nt$OtoZX^fBse*rM4jVn3;e>EK-Jj2bB*KFwmV+8l^#(sG>E^486>^}K znE9e^>){Fv03rjb^5zZu!?j-xpv~Wa1HfMb3?KE#AOs@jG@DzDq!Jk98esrMoV_nc zPjaPAC@L!I3XHtNz6ahg3djNi-so?}>_`4}sG!F&& zMcxoctuqahan<;!(SwfNzy%At#zA6A^^19G)QmG}eZoo~l`B-z^YUd&qu#&X5F=8Ngl~WJLW?!vMdGNrc7?2y z%~2RzYHbEiwqLSX+6#zM*t~kipzpVvlIRgZjmLC?_n$^;FOfH-QKPaxp2)Be5`G)i zuyIaj_tPfaWh>$rj5SB1^ zo}az^tMMm5z{iFB})1DZ^$%4WNH z`a^yOTtu zk>(JMYGlX)BM2oC`0J_*B<#u*w@WLZRMS#&;G8%({St|X942rE~=P^y@xC#UDgAAhFbazIzt#QJKJ*wzv^*#tmo08Bb&n;RZTBN zY+1cfNO$GB)wjXs* zYZ~2Y9vn?JCj>+gzVoQe9x6R~Q?IT|w|$;DCdRAi7R2+hy;bKX%+u&Wl^HHAZk-b@saKxV8sxCMZF zpHC1^)Ii6#e%DczuJsv25cK(pFMZ6K3M`cm9dK|yAFb;yok{1p9Z&NV%YZqEQGN)^ z4b|q(h`I6Fex&<7qET>OS~4lYzU)af+9Ze&vEoolfDV4Y{QrE-_MO+$-2b|W^oMj+k^ka#Qx4#1W?rbqlG7P@e^pSu z|D)}-Uo_-w=nmLHC`LQt2&05n`#IN4iIyg9VD&oY=<$uEXvXc+ZxD`eKJfMb_3NT> zPmNsfTo~guja`ax6q7S0)3ap@ZCyp^P{uZivGUp>cvf7?uszl_vy1_^#D5L%GUu^q zVP84Pwcx#XWWSo~w&#eJ<=)Z}Y1c;u{l0a%{kw_8a$_@oyw+7F$#*IAv}$I9le!pU zH`UZqtQdK)$I6EZ-b4&O&@yB!VyE$U%`gqD5iC!6#jZ!YVryN2Qf#)0ba%9Ot>?jb z?x`0^aZNcpXIW>yoo2;Jh%#NAN^4NoE1x1!EL>buj9ZiC%-B^nVBm!M=wGCJx4dLC zcd#iJ>hg~-=MA38E9O64_$nu_e^2R2_|Vy=h`*c4N+vL+d+=G2Mf<++?7`|;wFCPz zR%?5Q@S#kH@B}jrjmVS7l2@hGr1lvsj&B|hQLPFx$Ybi5nV*Fv45A1UpUu}9>z{FI zVl*yd|7mWX5f;y*7YIrCz*bOA10pNSmZ@3Hx7XQh+3_S0^K#MMx|I+tlYtu_4|ka( zgCeK?`npA=5a08&(kn@iYCg1Yq(NhXLi;4H*WKEk_Y)lUS}SJc6Ud^p$rajk_Lcv6gn?JHc@6Q zmM%9@uAxdWbaKnWJ)*CGHmNK*0Q3d4Yf1Oug<|af)8$GQRvdC_{SsFeh2-ew?1lil zJbC<>I$03SN@dUFDt&ls!9g1bmwXTd?4v2rQ+exacrfgRE=2Ys1Lx!>SJufL9A)8x z=c71vGF;O;5&$q?@Yw-BjLg<4o!u>OcC3ci)zT)`UtD75t%GlaX*ef8yixpCxMO(C zSRzC{{1K|bPpD9hBh5!}wy*lS@H2whZ3r(on?z}^iy5LgS)kU`$pm?g5?s44GWvFu-PK9i09>pJ_D8Fd3RyVa0f@~li zWl&V`nJpz6hHJ7%Q0QUO*QZC`8dKpUKx_VF%KsMm?&iYi!iH;l<|zIGbg6a}oZ%*X zIoGQXV>PzxJv$nG0w-}6#%9z^0^R=-7XLGWik}Yf^Bh&@RBt~=drejl#eCd9oG#_B zQfkb*JMuGTlVop=WsjWvBc`!O7xT)k|$uE!28Gg!k7!p3r z$!FwQv7xK}iaJ4@nsd@Kt9?d@HP+%FUQs3JbfCe`oTN0-pe5|7iu@l9MLOj)^^@5z zGl3X>*&&}xDT*Qgj8tv%(4ydGmyQ3Eqo{^zl0W^Vi|wEn4JJ4m-ktMyxWF&zEyhw& z9jUlb{;Z)e|7TX9{WT3QiW@SI|5SHd^&5P7fsC=n`sU~4seVWM<5`J}xFz)8qxSl| zMpYH4)8NN+|H37EkLJQ}z&1#`(%&%x9+6PbAk|{|seFRwG3?`CjZ4HnVm*YDxbxp} zRwYD3OB?aW?2rv_cUTV;aQ+3^-vj*nzX6^-IOL=?oNSSF4TF3gj=P~MpC|jzlm7s_ CU63CD literal 9996 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 z�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 qK+^n1#{b7lS{Q#?_;_iQkS~)p4f;30fhd^( diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-nest-both-under-n0-firefox-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-nest-both-under-n0-firefox-linux.png index 6e4fae9fd313778490664585b69f87d7b8992116..75a1f943e149528c29437dde5c5c114c5dcd0a77 100644 GIT binary patch literal 9075 zcmd6N2T)X5w5@?5D8U8+B{en(DoJt_L>dGnm=I8cWKbk$2}*1v2`Cv+5l~S{l9Obx zK@?O(#3tv|1Zkjwzppb)&Aj*iuUG%oulikujm^F1o^$rvYp=CWho9FuOSg}0->zM| z=rq)^7kBOY1Ag6QPfZE`N=~7jckSYl)4(cU_S!vLN8|P&q;7SV@IzdKk2gLzSn~84 z9A*#8`F)y9ck`(w)k-v(zw;m6_g3oQgA>ey @i&iEN!#i}w2`tz#yVzDJyZ*(9= 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 X{n%I$rVBy7Q=_4(gMD-6df@*8=K?c~ literal 11191 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 diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-nest-both-under-n0-webkit-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.concurrent.test.tsx/concurrent-nest-both-under-n0-webkit-linux.png index 291c8633b735cb03639ca9994417bd3bc2c86d80..f4bfbe4547b5c0d0a07c8b18dbec6b401f95d654 100644 GIT binary patch literal 9520 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 literal 11525 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 TQxNzM3JWTu^1Mj;)%$+~pfjt) diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-indent-firefox-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-indent-firefox-linux.png index 27ad94db9ec354cdcd88698488ccc21ab0c269a6..417c49d27f85c8f2cd17c666e637450cc928d48c 100644 GIT binary patch literal 6365 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 G&F3F?Eg}~H literal 7246 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 AwEzGB diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-indent-webkit-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-indent-webkit-linux.png index d77ed2020af6ee8d2413db0e304a85ff4eae9c22..c7b22e98d36b1e468b64ad3a196b6039e65d8874 100644 GIT binary patch literal 6807 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 literal 7625 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 PXb)f%ROK^oKJxq@X?ug1 diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-unindent-chromium-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-unindent-chromium-linux.png index 40b74367c101170c5b75535f31bcff58d0e38b9b..8f8f16abababa4c500c136f84983f3651c44500c 100644 GIT binary patch literal 6191 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 literal 7173 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 diff --git a/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-unindent-webkit-linux.png b/tests/src/end-to-end/y-prosemirror/__screenshots__/nesting.test.tsx/nesting-unindent-webkit-linux.png index a2b88c0b3b3e428dfd7032f9b8a8883bc46ff2df..4998c2e5269cce4b4315e59432a142971ed52ab5 100644 GIT binary patch literal 7107 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Π_yo2+othLr{xVHWsYt`+V~wi2+{jba`6sx- z)TgJ(_H*3_wW@8iP0Azo!{m$aWD+l+BKQw1&kI(H7{BRqj!7AZ)Gi~5r+j#*+Mbpj zjTnY- zSzCx5TsJ)a`5U~)SDM2LJ>?qDyC{Vz1_9qw2k>%QRd@2S*N1N*R+|y4p45CBU#Cx6^vEq1?5njc zgW0#v_Bz^8^LB;*{tLKifrN|{-Dymq(an~GW(sl`GeiRVSYZve{HH@jL2n--rdl^l z#ktmBKUO5vex~qT@)I{M_~%K|g^iED=HgcE7%g1ytY0UpY499G-ucTgZ@lMNuBeqS zdtE$5Jf&3>qP2!ZGj*WPPa~?ScCaXk+XZ=CdBf0o?jym%Q-wR1#_k7_M}C;YMrSsH z!(mP54HMqWP-w6Z55UtQxH?A(U8CXmGY(Q!eRmId-}nsB)IEo1*sAA zdIZxicS;`N$WMQT`fxhhjSK8_@E{16lpOS1<2fo$l2>!nUSz)~FT!0p?LERTbK#_1 sHntBhzCDK9aNXXp^8YvfkK(Z=@MF^N#7#F(3nciOYPy#TFWtEJAJ)m^2mk;8 literal 7946 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 Twh1PPC)HK8FXt-%`S8C0i;YQ- diff --git a/tests/src/end-to-end/y-prosemirror/__snapshots__/addRemoveBlocks.test.tsx.snap b/tests/src/end-to-end/y-prosemirror/__snapshots__/addRemoveBlocks.test.tsx.snap index 182ace0380..209683037e 100644 --- a/tests/src/end-to-end/y-prosemirror/__snapshots__/addRemoveBlocks.test.tsx.snap +++ b/tests/src/end-to-end/y-prosemirror/__snapshots__/addRemoveBlocks.test.tsx.snap @@ -121,27 +121,25 @@ exports[`suggestion mode: add colored block with child to empty doc 3`] = ` - - - - - - - - - Child block - - - - - - - - + + + + + + + + Child block + + + + + + + @@ -252,56 +250,52 @@ exports[`suggestion mode: add nested bullet list to empty doc 3`] = ` - - - - - + + + + + + + + Level 1 + + + + - - Level 1 - + + + + + Level 2 + + + + - - - - - - - - - Level 2 - - - - - - - - - - - - - + + + + + @@ -609,6 +603,7 @@ exports[`suggestion mode: delete nested block 2`] = ` " Parent + " `; @@ -616,61 +611,28 @@ exports[`suggestion mode: delete nested block 2`] = ` exports[`suggestion mode: delete nested block 3`] = ` " - - - - - - - Parent - - - - - + + Parent + + + + - - - - - Child - - - - + + Child + - - - - - - - - - - - - Parent - - - - - - + + + + + " `; @@ -736,6 +698,7 @@ exports[`suggestion mode: delete parent block (with children) 2`] = ` " + " `; @@ -743,59 +706,34 @@ exports[`suggestion mode: delete parent block (with children) 2`] = ` exports[`suggestion mode: delete parent block (with children) 3`] = ` " - - - + + + + Parent + + - - Parent - + + + + + Child + + + + - - - - - - - - - Child - - - - - - - - - - - - - - - - - - - - - - + + + " `; @@ -828,6 +766,7 @@ exports[`suggestion mode: delete parent with nested paragraph and image 2`] = ` " + " `; @@ -835,82 +774,57 @@ exports[`suggestion mode: delete parent with nested paragraph and image 2`] = ` exports[`suggestion mode: delete parent with nested paragraph and image 3`] = ` " - - - + + + + Parent + + - - Parent - + + + + + Nested paragraph + + + + - - - - - - - - Nested paragraph - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - + + + + " `; @@ -1057,27 +971,36 @@ exports[`suggestion mode: nest a bullet under an existing bullet 2`] = ` exports[`suggestion mode: nest a bullet under an existing bullet 3`] = ` " - - - - - - - Parent - - - - - - + + Parent + + + + + + + + Child + + + + + + + + - - - - - - - Parent - - - - - - - - - - - - Child - - - - - - - - - - - " `; diff --git a/tests/src/end-to-end/y-prosemirror/__snapshots__/moveBlocks.test.tsx.snap b/tests/src/end-to-end/y-prosemirror/__snapshots__/moveBlocks.test.tsx.snap index 70ce03a0f5..ac1f80dcfd 100644 --- a/tests/src/end-to-end/y-prosemirror/__snapshots__/moveBlocks.test.tsx.snap +++ b/tests/src/end-to-end/y-prosemirror/__snapshots__/moveBlocks.test.tsx.snap @@ -124,27 +124,25 @@ exports[`suggestion mode: move paragraph with children 3`] = ` - - - - - - - - - Child - - - - - - - - + + + + + + + + Child + + + + + + + @@ -165,27 +163,25 @@ exports[`suggestion mode: move paragraph with children 3`] = ` - - - - - - - - - Child - - - - - - - - + + + + + + + + Child + + + + + + + diff --git a/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.concurrent.test.tsx.snap b/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.concurrent.test.tsx.snap index 958d39c987..b0075bd1ef 100644 --- a/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.concurrent.test.tsx.snap +++ b/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.concurrent.test.tsx.snap @@ -56,37 +56,34 @@ exports[`concurrent: A indents N1, B indents N2 below N1 4`] = ` - - N1 - - - N2 - - - " `; exports[`concurrent: A indents N1, B indents N2 below N1 5`] = ` " - - - - - - - N0 - - - - - - + + N0 + + + + + + + + N1 + + + + + + + + - - - - - - - N0 - - - - - - - - - - - - N1 - - - - - - - - - - - - - - - - - - N1 - - - - - - - - - - - - N2 - - - - - - - - - - - " `; @@ -244,9 +165,6 @@ exports[`concurrent: A nests N1 under N0, B nests N2 under N0 4`] = ` N1 - - - N0 N2 @@ -259,99 +177,45 @@ exports[`concurrent: A nests N1 under N0, B nests N2 under N0 4`] = ` exports[`concurrent: A nests N1 under N0, B nests N2 under N0 5`] = ` " - - - - - - - N0 - - - - - - - - - - - - - N0 - - - - - + + N0 + + + + - - - - - N1 - - - - + + N1 + - - - - - - - - - - - - N0 - - - - - + + + + + + - - - - - N2 - - - - + + N2 + - - - - - + + + + + " `; diff --git a/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.test.tsx.snap b/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.test.tsx.snap index 6e4bd785a6..7fccedff22 100644 --- a/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.test.tsx.snap +++ b/tests/src/end-to-end/y-prosemirror/__snapshots__/nesting.test.tsx.snap @@ -49,27 +49,25 @@ exports[`suggestion mode: change block type of a block with children 3`] = ` - - - - - - - - - N1 - - - - - - - - + + + + + + + + N1 + + + + + + + @@ -93,27 +91,25 @@ exports[`suggestion mode: change block type of a block with children 3`] = ` - - - - - - - - - N1 - - - - - - - - + + + + + + + + N1 + + + + + + + @@ -148,23 +144,28 @@ exports[`suggestion mode: indent a block 2`] = ` exports[`suggestion mode: indent a block 3`] = ` " - - - - - - - N0 - - - - - - + + N0 + + + + + + + + N1 + + + + + + + + - - - - - - - N0 - - - - - - - - - - - - N1 - - - - - - - - - - - " `; @@ -241,6 +204,7 @@ exports[`suggestion mode: unindent a block 2`] = ` " N0 + N1 @@ -251,61 +215,28 @@ exports[`suggestion mode: unindent a block 2`] = ` exports[`suggestion mode: unindent a block 3`] = ` " - - - - - - - N0 - - - - - + + N0 + + + + - - - - - N1 - - - - + + N1 + - - - - - - - - - - - - N0 - - - - - - + + + + + Date: Thu, 8 Oct 2026 06:26:47 +0200 Subject: [PATCH 04/14] fix(versioning): read merged block groups outside the editor yDocToBlocks converted Y without the binding's transformers, so a block with two child groups (concurrent first children) made the whole document read as empty. --- .../src/y/extensions/mergeBlockGroups.test.ts | 9 ++++++++- packages/core/src/y/utils.ts | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/core/src/y/extensions/mergeBlockGroups.test.ts b/packages/core/src/y/extensions/mergeBlockGroups.test.ts index 94c1b4d0ed..c5272e4a69 100644 --- a/packages/core/src/y/extensions/mergeBlockGroups.test.ts +++ b/packages/core/src/y/extensions/mergeBlockGroups.test.ts @@ -5,7 +5,7 @@ import * as Y from "@y/y"; import { afterEach, describe, expect, it } from "vite-plus/test"; import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js"; -import { blocksToYType } from "../utils.js"; +import { blocksToYType, yDocToBlocks } from "../utils.js"; import { withCollaboration } from "./index.js"; import { createYVersionView } from "./Versioning.js"; @@ -113,6 +113,13 @@ describe("concurrently created child groups", () => { expect(groupsOf(docA, "p")).toEqual([1, 1]); }); + it("reads both children outside the editor", () => { + const { docA } = nestedTwice(); + expect(outline(yDocToBlocks(BlockNoteEditor.create(), docA, "doc"))).toBe( + "P{X, Z}", + ); + }); + it("routes edits back to each child's own group", () => { const users = nestedTwice(); users.a.setTextCursorPosition("z", "end"); diff --git a/packages/core/src/y/utils.ts b/packages/core/src/y/utils.ts index c447c44678..2d97cb5dae 100644 --- a/packages/core/src/y/utils.ts +++ b/packages/core/src/y/utils.ts @@ -1,6 +1,5 @@ import { defaultTransformer, - deltaToPNode, deltaToPSteps, docToDelta, nodeToDelta, @@ -21,10 +20,17 @@ import { docToBlocks, } from "../index.js"; import { blockMatchNodes } from "./extensions/blockMatchNodes.js"; +import { mergeBlockGroups } from "./extensions/mergeBlockGroups.js"; import { mapAttributionToMark } from "./extensions/YSync.js"; import * as Y from "@y/y"; +// Renders Y content as the collaboration binding does (see YSync). +const bindingTransformer = defaultTransformer({ + mapAttributionToMark, + transformers: [mergeBlockGroups], +}); + /** * Find the equivalent of a Y.Node in another Y.Doc. * @@ -212,12 +218,15 @@ export function yfragmentToBlocks< // A fragment without block containers holds no blocks — e.g. one written // by an older `blocksToYDoc([])` (which used to write a childless block // group). Returning early avoids materializing the schema filler paragraph - // in `deltaToPNode` below, whose id would be freshly minted on every + // in `ynodeToPmnode` below, whose id would be freshly minted on every // read — making empty docs unstable. if (!deltaHasBlockContainer(delta)) { return []; } - const pmNode = deltaToPNode(delta, editor.pmSchema, null); + const pmNode = ynodeToPmnode(fragment, editor.pmSchema, { + renderer: null, + transformer: bindingTransformer, + }); return docToBlocks(pmNode); } @@ -333,7 +342,7 @@ export function yNodeToTransaction( options: NonNullable[2]> = {}, ): Transaction { const renderedDoc = ynodeToPmnode(node, tr.doc.type.schema, { - transformer: defaultTransformer({ mapAttributionToMark }), + transformer: bindingTransformer, ...options, }); const renderedDelta = docDiffToDelta(tr.doc, renderedDoc); From b1142aefd190f7b09b5c399c05636f9e2b6160b0 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 06:28:14 +0200 Subject: [PATCH 05/14] refactor(versioning): use function declarations in splitChangedBlocks --- packages/core/src/y/extensions/snapshotPreview.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/core/src/y/extensions/snapshotPreview.ts b/packages/core/src/y/extensions/snapshotPreview.ts index 2baae5d469..20db777256 100644 --- a/packages/core/src/y/extensions/snapshotPreview.ts +++ b/packages/core/src/y/extensions/snapshotPreview.ts @@ -102,12 +102,14 @@ function splitChangedBlocks( const doc = child.doc!; // A change that only inserted (or only deleted) still has one author // for both sides of the split, under that side's attribution kind. - const as = ( + function as( kind: "insert" | "delete", attrs: Y.ContentAttribute[], - ) => attrs.map((attr) => Y.createContentAttribute(kind, attr.val)); + ) { + return attrs.map((attr) => Y.createContentAttribute(kind, attr.val)); + } const authors = inserted.length ? inserted : deleted; - const record = (tr: Y.Transaction) => { + function record(tr: Y.Transaction) { if (authors.length) { Y.insertIntoIdMap( added.inserts, @@ -121,7 +123,7 @@ function splitChangedBlocks( ), ); } - }; + } doc.on("beforeObserverCalls", record); try { doc.transact(() => { From df1904f7fa35517b7e09090d14381295a6c0a09a Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 07:51:52 +0200 Subject: [PATCH 06/14] fix(versioning): don't attribute a move whose copy was lost to the mover A move deletes a block and inserts a copy. When the copy lands in a block another user concurrently deletes, the original's deletion read as "Deleted by ". Show it without an author instead. --- .../core/src/y/extensions/snapshotPreview.ts | 78 +++++++++++++- .../extensions/versionDiffAttribution.test.ts | 100 ++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) diff --git a/packages/core/src/y/extensions/snapshotPreview.ts b/packages/core/src/y/extensions/snapshotPreview.ts index d6efaff2ab..b8f47536c2 100644 --- a/packages/core/src/y/extensions/snapshotPreview.ts +++ b/packages/core/src/y/extensions/snapshotPreview.ts @@ -32,6 +32,70 @@ class SnapshotDiffRenderer extends Y.DiffRenderer { } } +/** Whether the item with this id was already in `baseline`. */ +function inBaseline(baseline: Y.Doc, id: Y.ID): boolean { + const last = baseline.store.clients.get(id.client)?.at(-1); + return last !== undefined && id.clock < last.id.clock + last.length; +} + +/** + * Blocks whose deletion was a move whose copy was lost, with their content. + * + * A move (indenting, dragging, ...) deletes a block and inserts a copy with the + * same id. When the copy lands in a block another user concurrently deletes, + * it's removed without anyone deleting it. The original's deletion would then + * read as "Deleted by ", though the mover only moved it. + */ +function lostMoves(doc: Y.Doc, baseline: Y.Doc, deletes: Y.IdMap) { + function attributed(item: Y.Item) { + return deletes + .slice(item.id.client, item.id.clock, 1) + .some((range) => range.attrs?.length); + } + const originals = new Map(); + const copies = new Map(); + for (const structs of doc.store.clients.values()) { + for (const item of structs) { + if ( + !(item instanceof Y.Item) || + !(item.content instanceof Y.ContentType) || + item.content.type.name !== "blockContainer" + ) { + continue; + } + // Read the id directly: a deleted block's attributes read as unset. + const idItem = item.content.type._map.get("id"); + const id = idItem?.content.getContent().at(-1); + if (inBaseline(baseline, item.id)) { + originals.set(id, [...(originals.get(id) ?? []), item.content.type]); + } else { + copies.set(id, [...(copies.get(id) ?? []), item]); + } + } + } + const lost = Y.createIdSet(); + for (const [id, blocks] of originals) { + const moved = copies.get(id); + // A copy that's still there, or that someone deleted, keeps the author. + if (!moved?.every((copy) => copy.deleted && !attributed(copy))) { + continue; + } + for (const structs of doc.store.clients.values()) { + for (const item of structs) { + if ( + item instanceof Y.Item && + blocks.some( + (block) => item === block._item || Y.isParentOf(block, item), + ) + ) { + lost.add(item.id.client, item.id.clock, item.length); + } + } + } + } + return lost; +} + /** * Decode a snapshot, diff it against a baseline if given, and render it. * @@ -58,6 +122,16 @@ export function showSnapshotPreview( try { const snapshot = decodeFragmentUpdate(fragment, snapshotContent); try { + const renderAttributions = + baseline && attributions + ? Y.createContentMap( + attributions.inserts, + Y.diffIdMap( + attributions.deletes, + lostMoves(snapshot.doc, baseline.doc, attributions.deletes), + ), + ) + : attributions; editor.exec( configureYProsemirror({ ytype: snapshot.fragment, @@ -65,7 +139,9 @@ export function showSnapshotPreview( ? new SnapshotDiffRenderer( baseline.doc, snapshot.doc, - attributions ? { attributions } : undefined, + renderAttributions + ? { attributions: renderAttributions } + : undefined, ) : undefined, }), diff --git a/packages/core/src/y/extensions/versionDiffAttribution.test.ts b/packages/core/src/y/extensions/versionDiffAttribution.test.ts index c3abd5a265..7473105a78 100644 --- a/packages/core/src/y/extensions/versionDiffAttribution.test.ts +++ b/packages/core/src/y/extensions/versionDiffAttribution.test.ts @@ -197,6 +197,106 @@ describe("version diff of a deleted block", () => { view.close(); }); + it("does not attribute a move whose copy was lost to the mover", () => { + const base = baseDocument([ + { + id: "parent", + type: "paragraph", + content: "Parent", + children: [{ id: "child", type: "paragraph", content: "Child" }], + }, + { id: "moved", type: "paragraph", content: "Moved" }, + ]); + // Bob moves a block into the parent, which deletes it and inserts a copy + // there; Alice, who never receives the copy, deletes the parent. + const bob = editOf(base, 2, (editor) => { + editor.setTextCursorPosition("moved"); + editor.nestBlock(); + }); + const alice = editOf(base, 1, (editor) => editor.removeBlocks(["parent"])); + + const server = new Y.Doc({ gc: false }); + Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); + Y.applyUpdateV2(server, alice); + const withAlice = Y.encodeStateAsUpdateV2(server); + Y.applyUpdateV2(server, bob); + + const { view, changes } = showDiff( + withAlice, + Y.encodeStateAsUpdateV2(server), + deletedBy(bob, "bob"), + ); + view.close(); + const del = "y-attributed-delete"; + expect(changes).toEqual([ + { text: "[block moved]", mark: del, users: [] }, + { text: "Moved", mark: del, users: [] }, + ]); + }); + + it("attributes a move to the mover", () => { + const base = baseDocument([ + { + id: "parent", + type: "paragraph", + content: "Parent", + children: [{ id: "child", type: "paragraph", content: "Child" }], + }, + { id: "moved", type: "paragraph", content: "Moved" }, + ]); + const bob = editOf(base, 2, (editor) => { + editor.setTextCursorPosition("moved"); + editor.nestBlock(); + }); + const server = new Y.Doc({ gc: false }); + Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); + Y.applyUpdateV2(server, bob); + + const { view, changes } = showDiff( + Y.encodeStateAsUpdateV2(base), + Y.encodeStateAsUpdateV2(server), + deletedBy(bob, "bob"), + ); + view.close(); + expect( + changes.filter((change) => change.mark === "y-attributed-delete"), + ).toEqual([ + { text: "[block moved]", mark: "y-attributed-delete", users: ["bob"] }, + { text: "Moved", mark: "y-attributed-delete", users: ["bob"] }, + ]); + }); + + it("attributes a moved block to whoever deletes it afterwards", () => { + const base = baseDocument([ + { + id: "parent", + type: "paragraph", + content: "Parent", + children: [{ id: "child", type: "paragraph", content: "Child" }], + }, + { id: "moved", type: "paragraph", content: "Moved" }, + ]); + const bob = editOf(base, 2, (editor) => { + editor.setTextCursorPosition("moved"); + editor.nestBlock(); + editor.removeBlocks(["moved"]); + }); + const server = new Y.Doc({ gc: false }); + Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); + Y.applyUpdateV2(server, bob); + + const { view, changes } = showDiff( + Y.encodeStateAsUpdateV2(base), + Y.encodeStateAsUpdateV2(server), + deletedBy(bob, "bob"), + ); + view.close(); + expect(changes).toEqual([ + { text: "[block moved]", mark: "y-attributed-delete", users: ["bob"] }, + { text: "Moved", mark: "y-attributed-delete", users: ["bob"] }, + ]); + }); + it("does not show content inserted and deleted between the two versions", () => { const doc = new Y.Doc({ gc: false }); const editor = collaborativeEditor(doc); From 59e58d7873d4ef2c60b0b6a1d3ac74fc298772b7 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 07:57:25 +0200 Subject: [PATCH 07/14] test(versioning): blame no one for a block lost to cascading indents --- .../14-suggestion-gallery/src/scenarios.ts | 2 +- .../extensions/versionDiffAttribution.test.ts | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts index a47b03334a..58ca3b2ea1 100644 --- a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts +++ b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts @@ -1021,7 +1021,7 @@ export const scenarios: SuggestionScenario[] = [ feedback: [ { severity: "low", - note: "N2 is lost. Indenting is a move, which deletes the original block and inserts a copy: B nests N2 into the original N1, which A's indent deletes, so N2 goes with it (shown as \"deleted by B\" because B's indent deleted N2's own original). Before nesting changes diffed in place, B's indent replaced N1, so N1 appeared twice instead. Needs move support.", + note: "N2 is lost: B's indent moves it into the original N1, which A's indent deletes. Version history shows the lost N2 as deleted without an author, not as deleted by A or B. Before nesting changes diffed in place, N1 appeared twice instead. Needs move support.", }, ], title: "Cascading indents", diff --git a/packages/core/src/y/extensions/versionDiffAttribution.test.ts b/packages/core/src/y/extensions/versionDiffAttribution.test.ts index 7473105a78..ff31c50a11 100644 --- a/packages/core/src/y/extensions/versionDiffAttribution.test.ts +++ b/packages/core/src/y/extensions/versionDiffAttribution.test.ts @@ -297,6 +297,49 @@ describe("version diff of a deleted block", () => { ]); }); + it.each([ + ["Bob", ["alice", "alice", "", ""]], + ["Alice", ["", ""]], + ])( + "blames no one for a block lost to cascading indents (%s's saved first)", + (first, expected) => { + const base = baseDocument([ + { id: "n0", type: "paragraph", content: "N0" }, + { id: "n1", type: "paragraph", content: "N1" }, + { id: "n2", type: "paragraph", content: "N2" }, + ]); + // Alice indents N1 under N0; Bob indents N2 under the N1 that Alice's + // indent deletes (moving it under N0), so Bob's N2 is lost with it. + const alice = editOf(base, 1, (editor) => { + editor.setTextCursorPosition("n1"); + editor.nestBlock(); + }); + const bob = editOf(base, 2, (editor) => { + editor.setTextCursorPosition("n2"); + editor.nestBlock(); + }); + const [earlier, later, author] = + first === "Bob" ? [bob, alice, "alice"] : [alice, bob, "bob"]; + const server = new Y.Doc({ gc: false }); + Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); + Y.applyUpdateV2(server, earlier); + const before = Y.encodeStateAsUpdateV2(server); + Y.applyUpdateV2(server, later); + + const { view, changes } = showDiff( + before, + Y.encodeStateAsUpdateV2(server), + deletedBy(later, author), + ); + view.close(); + expect( + changes + .filter((change) => change.mark === "y-attributed-delete") + .map((change) => change.users.join()), + ).toEqual(expected); + }, + ); + it("does not show content inserted and deleted between the two versions", () => { const doc = new Y.Doc({ gc: false }); const editor = collaborativeEditor(doc); From 1033fb6a821e49a9ade9241b8d0a062a6cd15c31 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 08:04:01 +0200 Subject: [PATCH 08/14] fix(versioning): credit a moved block's deletion to its deleter, not its mover Only the mover is removed from the original's deletion, so a user who deleted the block (or its parent) on purpose keeps the credit, and whoever deleted the moved copy is credited instead. Tests now send each client's own updates, as YHub receives them, instead of a state update carrying every earlier deletion. --- .../core/src/y/extensions/snapshotPreview.ts | 86 ++++-- .../extensions/versionDiffAttribution.test.ts | 274 +++++++++++------- 2 files changed, 240 insertions(+), 120 deletions(-) diff --git a/packages/core/src/y/extensions/snapshotPreview.ts b/packages/core/src/y/extensions/snapshotPreview.ts index b8f47536c2..98adb33001 100644 --- a/packages/core/src/y/extensions/snapshotPreview.ts +++ b/packages/core/src/y/extensions/snapshotPreview.ts @@ -39,18 +39,27 @@ function inBaseline(baseline: Y.Doc, id: Y.ID): boolean { } /** - * Blocks whose deletion was a move whose copy was lost, with their content. + * Credit a moved block's deletion to whoever removed it, not to whoever moved + * it, returning the adjusted delete attributions. * - * A move (indenting, dragging, ...) deletes a block and inserts a copy with the - * same id. When the copy lands in a block another user concurrently deletes, - * it's removed without anyone deleting it. The original's deletion would then - * read as "Deleted by ", though the mover only moved it. + * A move (indenting, dragging, a type change, ...) deletes a block and inserts + * a copy with the same id. While a copy is shown, the diff shows the move as + * is. Once every copy is gone, only the original's deletion is shown, so: + * - whoever inserted a copy (a mover) is removed from it; + * - whoever deleted a copy, other than by moving it on, is added to it. + * A copy lost with a concurrently deleted parent has no deleter, so a block + * moved into it shows as deleted without an author. Without insert + * attributions the movers are unknown, so no author is shown. */ -function lostMoves(doc: Y.Doc, baseline: Y.Doc, deletes: Y.IdMap) { - function attributed(item: Y.Item) { - return deletes +function creditMoves( + doc: Y.Doc, + baseline: Y.Doc, + attributions: Y.ContentMap, +): Y.IdMap { + function users(map: Y.IdMap, item: Y.Item): unknown[] { + return map .slice(item.id.client, item.id.clock, 1) - .some((range) => range.attrs?.length); + .flatMap((range) => (range.attrs ?? []).map((attr) => attr.val)); } const originals = new Map(); const copies = new Map(); @@ -66,6 +75,9 @@ function lostMoves(doc: Y.Doc, baseline: Y.Doc, deletes: Y.IdMap) { // Read the id directly: a deleted block's attributes read as unset. const idItem = item.content.type._map.get("id"); const id = idItem?.content.getContent().at(-1); + if (id == null) { + continue; + } if (inBaseline(baseline, item.id)) { originals.set(id, [...(originals.get(id) ?? []), item.content.type]); } else { @@ -73,27 +85,64 @@ function lostMoves(doc: Y.Doc, baseline: Y.Doc, deletes: Y.IdMap) { } } } - const lost = Y.createIdSet(); + const replaced = Y.createIdSet(); + const credited: Y.IdMap = Y.createIdMap(); for (const [id, blocks] of originals) { const moved = copies.get(id); - // A copy that's still there, or that someone deleted, keeps the author. - if (!moved?.every((copy) => copy.deleted && !attributed(copy))) { + if (!moved || moved.some((copy) => !copy.deleted)) { continue; } + const inserters = moved.map((copy) => users(attributions.inserts, copy)); + const movers = new Set(inserters.flat()); + const known = inserters.every((inserter) => inserter.length > 0); + const deleters = new Set( + moved.flatMap((copy, i) => + users(attributions.deletes, copy).filter( + (user) => + !inserters.some((other, j) => j !== i && other.includes(user)), + ), + ), + ); for (const structs of doc.store.clients.values()) { for (const item of structs) { if ( - item instanceof Y.Item && - blocks.some( + !(item instanceof Y.Item) || + !blocks.some( (block) => item === block._item || Y.isParentOf(block, item), ) ) { - lost.add(item.id.client, item.id.clock, item.length); + continue; + } + const { client, clock } = item.id; + for (const range of attributions.deletes.slice( + client, + clock, + item.length, + )) { + const attrs = range.attrs ?? []; + const kept = known + ? attrs.filter((attr) => !movers.has(attr.val)) + : []; + if (kept.length === attrs.length) { + continue; + } + const added = known + ? [...deleters] + .filter((user) => !kept.some((attr) => attr.val === user)) + .map((user) => Y.createContentAttribute("delete", user)) + : []; + const ids = Y.createIdSet(); + ids.add(client, range.clock, range.len); + replaced.add(client, range.clock, range.len); + Y.insertIntoIdMap( + credited, + Y.createIdMapFromIdSet(ids, [...kept, ...added]), + ); } } } } - return lost; + return Y.mergeIdMaps([Y.diffIdMap(attributions.deletes, replaced), credited]); } /** @@ -126,10 +175,7 @@ export function showSnapshotPreview( baseline && attributions ? Y.createContentMap( attributions.inserts, - Y.diffIdMap( - attributions.deletes, - lostMoves(snapshot.doc, baseline.doc, attributions.deletes), - ), + creditMoves(snapshot.doc, baseline.doc, attributions), ) : attributions; editor.exec( diff --git a/packages/core/src/y/extensions/versionDiffAttribution.test.ts b/packages/core/src/y/extensions/versionDiffAttribution.test.ts index 7473105a78..f72f8117d7 100644 --- a/packages/core/src/y/extensions/versionDiffAttribution.test.ts +++ b/packages/core/src/y/extensions/versionDiffAttribution.test.ts @@ -42,7 +42,10 @@ function baseDocument(blocks: any[]) { return doc; } -/** One user's concurrent edit of `base`, as the update their client sends. */ +/** + * One user's edit of `base`, as the updates their client sends. Unlike a state + * update, these delete only what the user deleted. + */ function editOf( base: Y.Doc, client: number, @@ -51,8 +54,11 @@ function editOf( const doc = new Y.Doc({ gc: false }); doc.clientID = client; Y.applyUpdateV2(doc, Y.encodeStateAsUpdateV2(base)); - edit(collaborativeEditor(doc)); - return Y.encodeStateAsUpdateV2(doc, Y.encodeStateVector(base)); + const editor = collaborativeEditor(doc); + const updates: Uint8Array[] = []; + doc.on("updateV2", (update: Uint8Array) => updates.push(update)); + edit(editor); + return Y.mergeUpdatesV2(updates); } /** @@ -70,6 +76,41 @@ function deletedBy(update: Uint8Array, user: string) { return attributions; } +/** + * A server applying users' updates in turn, attributing each the way YHub + * does: what the update inserts, and what it explicitly deletes. + */ +function history(base: Y.Doc) { + const server = new Y.Doc({ gc: false }); + Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); + const attributions = Y.createContentMap(); + return { + server, + attributions, + apply(update: Uint8Array, user: string) { + const before = Y.createInsertSetFromStructStore(server.store, false); + Y.applyUpdateV2(server, update); + const inserted = Y.diffIdSet( + Y.createInsertSetFromStructStore(server.store, false), + before, + ); + Y.insertIntoIdMap( + attributions.inserts, + Y.createIdMapFromIdSet(inserted, [ + Y.createContentAttribute("insert", user), + ]), + ); + Y.insertIntoIdMap( + attributions.deletes, + Y.createIdMapFromIdSet(Y.decodeUpdateV2(update).ds, [ + Y.createContentAttribute("delete", user), + ]), + ); + return Y.encodeStateAsUpdateV2(server); + }, + }; +} + /** Show `after` compared to `before` and return each changed block and text. */ function showDiff( before: Uint8Array, @@ -197,45 +238,37 @@ describe("version diff of a deleted block", () => { view.close(); }); - it("does not attribute a move whose copy was lost to the mover", () => { - const base = baseDocument([ - { - id: "parent", - type: "paragraph", - content: "Parent", - children: [{ id: "child", type: "paragraph", content: "Child" }], - }, - { id: "moved", type: "paragraph", content: "Moved" }, + it("does not show content inserted and deleted between the two versions", () => { + const doc = new Y.Doc({ gc: false }); + const editor = collaborativeEditor(doc); + editor.replaceBlocks(editor.document, [ + { id: "a", type: "paragraph", content: "Hello" }, + { id: "b", type: "paragraph", content: "World" }, ]); - // Bob moves a block into the parent, which deletes it and inserts a copy - // there; Alice, who never receives the copy, deletes the parent. - const bob = editOf(base, 2, (editor) => { - editor.setTextCursorPosition("moved"); - editor.nestBlock(); - }); - const alice = editOf(base, 1, (editor) => editor.removeBlocks(["parent"])); - - const server = new Y.Doc({ gc: false }); - Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); - Y.applyUpdateV2(server, alice); - const withAlice = Y.encodeStateAsUpdateV2(server); - Y.applyUpdateV2(server, bob); - - const { view, changes } = showDiff( - withAlice, - Y.encodeStateAsUpdateV2(server), - deletedBy(bob, "bob"), + const before = Y.encodeStateAsUpdateV2(doc); + editor.setTextCursorPosition("a", "end"); + editor.insertInlineContent(" typo"); + editor.insertBlocks( + [{ id: "temp", type: "paragraph", content: "Temporary" }], + "a", + "after", ); + editor.removeBlocks(["temp"]); + editor.updateBlock("a", { content: "Hello" }); + editor.setTextCursorPosition("b", "end"); + editor.insertInlineContent(" kept"); + + const { view, changes } = showDiff(before, Y.encodeStateAsUpdateV2(doc)); view.close(); - const del = "y-attributed-delete"; expect(changes).toEqual([ - { text: "[block moved]", mark: del, users: [] }, - { text: "Moved", mark: del, users: [] }, + { text: " kept", mark: "y-attributed-insert", users: [] }, ]); }); +}); - it("attributes a move to the mover", () => { - const base = baseDocument([ +describe("version diff of a moved block", () => { + const blocks = () => + baseDocument([ { id: "parent", type: "paragraph", @@ -244,83 +277,124 @@ describe("version diff of a deleted block", () => { }, { id: "moved", type: "paragraph", content: "Moved" }, ]); - const bob = editOf(base, 2, (editor) => { - editor.setTextCursorPosition("moved"); - editor.nestBlock(); - }); - const server = new Y.Doc({ gc: false }); - Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); - Y.applyUpdateV2(server, bob); + // Moves the block into the parent: deletes it and inserts a copy there. + function nest(editor: BlockNoteEditor) { + editor.setTextCursorPosition("moved"); + editor.nestBlock(); + } + function removeParent(editor: BlockNoteEditor) { + editor.removeBlocks(["parent"]); + } + function deletions( + before: Uint8Array, + after: Uint8Array, + attributions: Y.ContentMap, + ) { + const { view, changes } = showDiff(before, after, attributions); + view.close(); + return changes + .filter((change) => change.mark === "y-attributed-delete") + .map((change) => `${change.text}: ${change.users.join(", ")}`); + } - const { view, changes } = showDiff( - Y.encodeStateAsUpdateV2(base), - Y.encodeStateAsUpdateV2(server), - deletedBy(bob, "bob"), + it("attributes a move to the mover", () => { + const base = blocks(); + const server = history(base); + const after = server.apply(editOf(base, 2, nest), "bob"); + expect( + deletions(Y.encodeStateAsUpdateV2(base), after, server.attributions), + ).toEqual(["[block moved]: bob", "Moved: bob"]); + }); + + it.each([true, false])( + "names no author for a block moved into a concurrently deleted one (insert attributions: %s)", + (withInserts) => { + const base = blocks(); + const bob = editOf(base, 2, nest); + const alice = editOf(base, 1, removeParent); + const server = history(base); + const before = server.apply(alice, "alice"); + const after = server.apply(bob, "bob"); + const attributions = withInserts + ? server.attributions + : deletedBy(bob, "bob"); + expect(deletions(before, after, attributions)).toEqual([ + "[block moved]: ", + "Moved: ", + ]); + }, + ); + + it("keeps the deleter of a block whose concurrent type change is lost", () => { + const base = blocks(); + // Bob's type change replaces the child with a heading copy, which Alice's + // deletion of the parent takes with it. Alice did see and delete the child. + const bob = editOf(base, 2, (editor) => + editor.updateBlock("child", { type: "heading" }), ); - view.close(); + const alice = editOf(base, 1, removeParent); + const server = history(base); + server.apply(alice, "alice"); + const after = server.apply(bob, "bob"); expect( - changes.filter((change) => change.mark === "y-attributed-delete"), + deletions(Y.encodeStateAsUpdateV2(base), after, server.attributions), ).toEqual([ - { text: "[block moved]", mark: "y-attributed-delete", users: ["bob"] }, - { text: "Moved", mark: "y-attributed-delete", users: ["bob"] }, + "[block parent]: alice", + "Parent: alice", + "[block child]: alice", + "Child: alice", ]); }); - it("attributes a moved block to whoever deletes it afterwards", () => { - const base = baseDocument([ - { - id: "parent", - type: "paragraph", - content: "Parent", - children: [{ id: "child", type: "paragraph", content: "Child" }], - }, - { id: "moved", type: "paragraph", content: "Moved" }, + it("attributes a moved block to whoever deletes it, not to the mover", () => { + const base = blocks(); + const server = history(base); + server.apply(editOf(base, 1, nest), "alice"); + const after = server.apply(editOf(server.server, 2, removeParent), "bob"); + expect( + deletions(Y.encodeStateAsUpdateV2(base), after, server.attributions), + ).toEqual([ + "[block parent]: bob", + "Parent: bob", + "[block child]: bob", + "Child: bob", + "[block moved]: bob", + "Moved: bob", ]); - const bob = editOf(base, 2, (editor) => { - editor.setTextCursorPosition("moved"); - editor.nestBlock(); - editor.removeBlocks(["moved"]); - }); - const server = new Y.Doc({ gc: false }); - Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); - Y.applyUpdateV2(server, bob); + }); - const { view, changes } = showDiff( - Y.encodeStateAsUpdateV2(base), - Y.encodeStateAsUpdateV2(server), - deletedBy(bob, "bob"), + it("attributes a moved block to the mover who then deletes it", () => { + const base = blocks(); + const server = history(base); + const after = server.apply( + editOf(base, 2, (editor) => { + nest(editor); + editor.removeBlocks(["moved"]); + }), + "bob", ); - view.close(); - expect(changes).toEqual([ - { text: "[block moved]", mark: "y-attributed-delete", users: ["bob"] }, - { text: "Moved", mark: "y-attributed-delete", users: ["bob"] }, - ]); + expect( + deletions(Y.encodeStateAsUpdateV2(base), after, server.attributions), + ).toEqual(["[block moved]: bob", "Moved: bob"]); }); - it("does not show content inserted and deleted between the two versions", () => { - const doc = new Y.Doc({ gc: false }); - const editor = collaborativeEditor(doc); - editor.replaceBlocks(editor.document, [ - { id: "a", type: "paragraph", content: "Hello" }, - { id: "b", type: "paragraph", content: "World" }, - ]); - const before = Y.encodeStateAsUpdateV2(doc); - editor.setTextCursorPosition("a", "end"); - editor.insertInlineContent(" typo"); - editor.insertBlocks( - [{ id: "temp", type: "paragraph", content: "Temporary" }], - "a", - "after", + it("attributes a block moved twice to whoever deletes it", () => { + const base = blocks(); + const server = history(base); + server.apply(editOf(base, 2, nest), "bob"); + server.apply( + editOf(server.server, 3, (editor) => { + editor.setTextCursorPosition("moved"); + editor.unnestBlock(); + }), + "carol", ); - editor.removeBlocks(["temp"]); - editor.updateBlock("a", { content: "Hello" }); - editor.setTextCursorPosition("b", "end"); - editor.insertInlineContent(" kept"); - - const { view, changes } = showDiff(before, Y.encodeStateAsUpdateV2(doc)); - view.close(); - expect(changes).toEqual([ - { text: " kept", mark: "y-attributed-insert", users: [] }, - ]); + const after = server.apply( + editOf(server.server, 4, (editor) => editor.removeBlocks(["moved"])), + "dave", + ); + expect( + deletions(Y.encodeStateAsUpdateV2(base), after, server.attributions), + ).toEqual(["[block moved]: dave", "Moved: dave"]); }); }); From b577f2502c9978519517418e323f753b7dca8d5d Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 08:07:36 +0200 Subject: [PATCH 09/14] test(versioning): keep moved-block diffs from emptying the document --- packages/core/src/y/extensions/versionDiffAttribution.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/src/y/extensions/versionDiffAttribution.test.ts b/packages/core/src/y/extensions/versionDiffAttribution.test.ts index f72f8117d7..7bad5da8fa 100644 --- a/packages/core/src/y/extensions/versionDiffAttribution.test.ts +++ b/packages/core/src/y/extensions/versionDiffAttribution.test.ts @@ -276,6 +276,8 @@ describe("version diff of a moved block", () => { children: [{ id: "child", type: "paragraph", content: "Child" }], }, { id: "moved", type: "paragraph", content: "Moved" }, + // Keeps the document from emptying, which shows a placeholder block. + { id: "next", type: "paragraph", content: "Next" }, ]); // Moves the block into the parent: deletes it and inserts a copy there. function nest(editor: BlockNoteEditor) { From dda208ffe40bc15a8ae2c2f36c89216c342be00e Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 09:58:07 +0200 Subject: [PATCH 10/14] fix(versioning): read only authors when crediting moves Attributions carry the time next to the author (insertAt/deleteAt), which creditMoves read as users, showing e.g. "Deleted by: Bob, 1789366831613". Tests now attach times the way YHub does. --- .../core/src/y/extensions/snapshotPreview.ts | 31 +++++++++++++------ .../extensions/versionDiffAttribution.test.ts | 7 ++++- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/packages/core/src/y/extensions/snapshotPreview.ts b/packages/core/src/y/extensions/snapshotPreview.ts index 98adb33001..b356a5cdab 100644 --- a/packages/core/src/y/extensions/snapshotPreview.ts +++ b/packages/core/src/y/extensions/snapshotPreview.ts @@ -56,10 +56,14 @@ function creditMoves( baseline: Y.Doc, attributions: Y.ContentMap, ): Y.IdMap { - function users(map: Y.IdMap, item: Y.Item): unknown[] { + // Attributions hold the author under the change's kind ("insert" or + // "delete"), next to its time ("insertAt" or "deleteAt"). + function users(map: Y.IdMap, item: Y.Item, kind: string): unknown[] { return map .slice(item.id.client, item.id.clock, 1) - .flatMap((range) => (range.attrs ?? []).map((attr) => attr.val)); + .flatMap((range) => range.attrs ?? []) + .filter((attr) => attr.name === kind) + .map((attr) => attr.val); } const originals = new Map(); const copies = new Map(); @@ -92,12 +96,14 @@ function creditMoves( if (!moved || moved.some((copy) => !copy.deleted)) { continue; } - const inserters = moved.map((copy) => users(attributions.inserts, copy)); + const inserters = moved.map((copy) => + users(attributions.inserts, copy, "insert"), + ); const movers = new Set(inserters.flat()); const known = inserters.every((inserter) => inserter.length > 0); const deleters = new Set( moved.flatMap((copy, i) => - users(attributions.deletes, copy).filter( + users(attributions.deletes, copy, "delete").filter( (user) => !inserters.some((other, j) => j !== i && other.includes(user)), ), @@ -120,15 +126,22 @@ function creditMoves( item.length, )) { const attrs = range.attrs ?? []; - const kept = known - ? attrs.filter((attr) => !movers.has(attr.val)) - : []; - if (kept.length === attrs.length) { + const movedBy = attrs.filter( + (attr) => + attr.name === "delete" && (!known || movers.has(attr.val)), + ); + if (!movedBy.length) { continue; } + const kept = attrs.filter((attr) => !movedBy.includes(attr)); const added = known ? [...deleters] - .filter((user) => !kept.some((attr) => attr.val === user)) + .filter( + (user) => + !kept.some( + (attr) => attr.name === "delete" && attr.val === user, + ), + ) .map((user) => Y.createContentAttribute("delete", user)) : []; const ids = Y.createIdSet(); diff --git a/packages/core/src/y/extensions/versionDiffAttribution.test.ts b/packages/core/src/y/extensions/versionDiffAttribution.test.ts index 7bad5da8fa..8e2072783a 100644 --- a/packages/core/src/y/extensions/versionDiffAttribution.test.ts +++ b/packages/core/src/y/extensions/versionDiffAttribution.test.ts @@ -78,16 +78,19 @@ function deletedBy(update: Uint8Array, user: string) { /** * A server applying users' updates in turn, attributing each the way YHub - * does: what the update inserts, and what it explicitly deletes. + * does: what the update inserts, and what it explicitly deletes, each with a + * time. */ function history(base: Y.Doc) { const server = new Y.Doc({ gc: false }); Y.applyUpdateV2(server, Y.encodeStateAsUpdateV2(base)); const attributions = Y.createContentMap(); + let time = 0; return { server, attributions, apply(update: Uint8Array, user: string) { + time += 1000; const before = Y.createInsertSetFromStructStore(server.store, false); Y.applyUpdateV2(server, update); const inserted = Y.diffIdSet( @@ -98,12 +101,14 @@ function history(base: Y.Doc) { attributions.inserts, Y.createIdMapFromIdSet(inserted, [ Y.createContentAttribute("insert", user), + Y.createContentAttribute("insertAt", time), ]), ); Y.insertIntoIdMap( attributions.deletes, Y.createIdMapFromIdSet(Y.decodeUpdateV2(update).ds, [ Y.createContentAttribute("delete", user), + Y.createContentAttribute("deleteAt", time), ]), ); return Y.encodeStateAsUpdateV2(server); From 833d943aa6a9e4dc952a77763fe88f14f8c94068 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 09:58:09 +0200 Subject: [PATCH 11/14] fix(versioning): don't show changes to a block's id A diff can pair a deleted block with the editor's empty one, which showed the id change as "Formatting change" next to the deleted block. Inline content keeps its id changes, since its own id prop can matter. --- .../y/extensions/AttributionExtension.test.ts | 37 +++++++++++++++++++ .../src/y/extensions/YAttributionMarks.ts | 12 +++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/core/src/y/extensions/AttributionExtension.test.ts b/packages/core/src/y/extensions/AttributionExtension.test.ts index 4bd3b06fff..3a7e28b8f5 100644 --- a/packages/core/src/y/extensions/AttributionExtension.test.ts +++ b/packages/core/src/y/extensions/AttributionExtension.test.ts @@ -296,4 +296,41 @@ describe("AttributionExtension user loading", () => { users: [], }); }); + + it("does not show a change to a block's id", () => { + const { editor } = createEditor(); + editor.replaceBlocks(editor.document, [ + { type: "paragraph", content: "hello" }, + ]); + const markType = editor.pmSchema.marks["y-attributed-attrs"]; + const id = { userIds: ["alice"], timestamp: null }; + editor.transact((tr) => + tr.addNodeMark(2, markType.create({ changes: { id } })), + ); + const block = + editor.prosemirrorView.dom.querySelector(".bn-block-content")!; + block.dispatchEvent(new MouseEvent("mouseover", { bubbles: true })); + expect( + editor.prosemirrorView.dom.querySelector("[data-user-ids]"), + ).toBeNull(); + expect( + editor.getExtension(AttributionExtension)!.store.state, + ).toBeUndefined(); + + editor.transact((tr) => + tr.addNodeMark( + 2, + markType.create({ changes: { id, textAlignment: id } }), + ), + ); + editor.prosemirrorView.dom + .querySelector("[data-attributes]")! + .dispatchEvent(new MouseEvent("mouseover", { bubbles: true })); + expect( + editor.getExtension(AttributionExtension)!.store.state, + ).toMatchObject({ + modificationType: "attrs", + attributes: ["textAlignment"], + }); + }); }); diff --git a/packages/core/src/y/extensions/YAttributionMarks.ts b/packages/core/src/y/extensions/YAttributionMarks.ts index 88f5de9d36..253d2e2a5b 100644 --- a/packages/core/src/y/extensions/YAttributionMarks.ts +++ b/packages/core/src/y/extensions/YAttributionMarks.ts @@ -112,6 +112,16 @@ const createAttributionMarkView = ) => ({ mark, inline }: { mark: PMMark; inline: boolean }) => { const editor = options?.editor; + // A block's id isn't content users edit, so a change to it isn't shown + // (e.g. a diff pairing a deleted block with the editor's empty one). + // Inline content may have an `id` prop of its own, which is. + const { id: _id, ...blockChanges } = getAttributeChanges(mark); + const changes = inline ? getAttributeChanges(mark) : blockChanges; + if (type === "attrs" && Object.keys(changes).length === 0) { + const dom = document.createElement(inline ? "span" : "div"); + dom.style.display = "contents"; + return { dom, contentDOM: dom }; + } // ``/`` are semantic elements. The modification mark has no // dedicated element, so it renders as a `` inline or a `
` over a // block, matching its `parseDOM` rules. @@ -131,7 +141,7 @@ const createAttributionMarkView = }); if (type === "attrs") { dom.dataset["type"] = "attributes"; - dom.dataset["attributes"] = JSON.stringify(getAttributeChanges(mark)); + dom.dataset["attributes"] = JSON.stringify(changes); } if (type === "modification") { dom.dataset["type"] = "modification"; From 6b4ae25380cc1a27a4fcf32bfde0203df54d5425 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 09:58:12 +0200 Subject: [PATCH 12/14] chore(gallery): attribute version diffs like YHub Credit deletions only from each user's own update, and keep deleted content (gc: false), so content lost with a concurrently deleted block shows no author. Adds scenarios for a block moved into a deleted block and a parent deleted while its child's type changes. --- .../14-suggestion-gallery/src/App.tsx | 37 +++++++++--- .../14-suggestion-gallery/src/scenarioDocs.ts | 3 +- .../14-suggestion-gallery/src/scenarios.ts | 58 +++++++++++++++++++ .../y-prosemirror/versioning.test.tsx | 5 +- 4 files changed, 94 insertions(+), 9 deletions(-) diff --git a/examples/07-collaboration/14-suggestion-gallery/src/App.tsx b/examples/07-collaboration/14-suggestion-gallery/src/App.tsx index 4f42477ae9..1f0f3b614a 100644 --- a/examples/07-collaboration/14-suggestion-gallery/src/App.tsx +++ b/examples/07-collaboration/14-suggestion-gallery/src/App.tsx @@ -396,13 +396,20 @@ function VersionMerge({ applyInitial: boolean; }) { const [setup] = useState(() => { - const afterDoc = cloneDoc(beforeDoc); + // Keep deleted content, as a server storing history does, so the diff can + // tell content a user deleted from content lost with a deleted parent. + const afterDoc = new Y.Doc({ gc: false }); + Y.applyUpdate(afterDoc, Y.encodeStateAsUpdate(beforeDoc)); const ids = new Set(users.map((u) => u.id)); // Record which user authored each merged change (by the Yjs origin the // edits are forwarded with), so the Diff can color A's and B's // contributions in their own colors instead of one flat diff color. - const attrs = createAttributionStore(afterDoc, (tr) => - ids.has(String(tr.origin)) ? String(tr.origin) : null, + // Deletions are attributed separately, from each user's own update (see + // `attributeDeletes`). + const attrs = createAttributionStore( + afterDoc, + (tr) => (ids.has(String(tr.origin)) ? String(tr.origin) : null), + { deletes: false }, ); return { userDocs: users.map(() => cloneDoc(beforeDoc)), @@ -424,21 +431,37 @@ function VersionMerge({ ); useEffect(() => { + // Attribute deletions like YHub: only what a user's update itself deletes. + // Merging also deletes content a user added inside a block another user + // deleted, which no one deleted on purpose. + const baseDeletes = Y.createDeleteSetFromStructStore(beforeDoc.store); + const attributeDeletes = (update: Uint8Array, user: string) => + Y.insertIntoIdMap( + setup.attrs.deletes, + Y.createIdMapFromIdSet( + Y.diffIdSet(Y.decodeUpdate(update).ds, baseDeletes), + [Y.createContentAttribute("delete", user)], + ), + ); // Forward every user edit into the merge doc (idempotent CRDT apply), so any // change to any user re-diffs. // Forward with the author's id as the Yjs origin so the attribution store // tags each merged change with its author. const offs = setup.userDocs.map((doc, i) => { const origin = users[i].id; - const onUpdate = (update: Uint8Array) => + const onUpdate = (update: Uint8Array) => { + attributeDeletes(update, origin); Y.applyUpdate(setup.afterDoc, update, origin); + }; doc.on("update", onUpdate); return () => doc.off("update", onUpdate); }); // Also pull in any edits that already flushed (the initial applies). - setup.userDocs.forEach((doc, i) => - Y.applyUpdate(setup.afterDoc, Y.encodeStateAsUpdate(doc), users[i].id), - ); + setup.userDocs.forEach((doc, i) => { + const update = Y.encodeStateAsUpdate(doc); + attributeDeletes(update, users[i].id); + Y.applyUpdate(setup.afterDoc, update, users[i].id); + }); const view = createYVersionView( diffEditor, diff --git a/examples/07-collaboration/14-suggestion-gallery/src/scenarioDocs.ts b/examples/07-collaboration/14-suggestion-gallery/src/scenarioDocs.ts index 2844ba6d6a..9bfa2ea80b 100644 --- a/examples/07-collaboration/14-suggestion-gallery/src/scenarioDocs.ts +++ b/examples/07-collaboration/14-suggestion-gallery/src/scenarioDocs.ts @@ -100,6 +100,7 @@ export function buildSuggestionScenarioDocs( export function createAttributionStore( doc: Y.Doc, resolveUserId: (tr: any) => string | null, + { deletes = true }: { deletes?: boolean } = {}, ): Y.ContentMap { const attrs = Y.createContentMap(); doc.on("beforeObserverCalls", (tr: any) => { @@ -115,7 +116,7 @@ export function createAttributionStore( ]), ); } - if (!tr.deleteSet.isEmpty()) { + if (deletes && !tr.deleteSet.isEmpty()) { Y.insertIntoIdMap( attrs.deletes, Y.createIdMapFromIdSet(tr.deleteSet, [ diff --git a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts index 93fdf5b94c..6d47fb9534 100644 --- a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts +++ b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts @@ -1020,6 +1020,64 @@ export const scenarios: SuggestionScenario[] = [ editor.nestBlock(); }, }, + { + kind: "concurrent", + id: "concurrent-move-into-deleted-block", + feedback: [ + { + severity: "info", + note: "X is lost: B's move inserts a copy into Parent, which A deletes. Versioning shows X deleted without an author: B only moved it, and A never saw it there.", + }, + ], + title: "Move a block into a block that is deleted", + category: "Nesting", + description: "A deletes Parent while B moves X into it.", + initial: [ + { + id: "parent", + type: "paragraph", + content: "Parent", + children: [{ id: "child", type: "paragraph", content: "Child" }], + }, + { id: "x", type: "paragraph", content: "X" }, + { id: "next", type: "paragraph", content: "Next" }, + ], + applyA: (editor) => { + editor.removeBlocks(["parent"]); + }, + applyB: (editor) => { + editor.setTextCursorPosition("x"); + editor.nestBlock(); + }, + }, + { + kind: "concurrent", + id: "concurrent-delete-parent-vs-child-type", + feedback: [ + { + severity: "info", + note: "B's type change is lost with Parent. Versioning shows Parent and Child deleted by A only: B's change replaced Child, but A deleted it on purpose.", + }, + ], + title: "Delete a parent vs change its child's type", + category: "Nesting", + description: "A deletes Parent while B turns its child into a heading.", + initial: [ + { + id: "parent", + type: "paragraph", + content: "Parent", + children: [{ id: "child", type: "paragraph", content: "Child" }], + }, + { id: "next", type: "paragraph", content: "Next" }, + ], + applyA: (editor) => { + editor.removeBlocks(["parent"]); + }, + applyB: (editor) => { + editor.updateBlock("child", { type: "heading" }); + }, + }, { kind: "concurrent", id: "concurrent-nest-both-under-n0", diff --git a/tests/src/end-to-end/y-prosemirror/versioning.test.tsx b/tests/src/end-to-end/y-prosemirror/versioning.test.tsx index fe675f1d97..62130795b3 100644 --- a/tests/src/end-to-end/y-prosemirror/versioning.test.tsx +++ b/tests/src/end-to-end/y-prosemirror/versioning.test.tsx @@ -109,7 +109,10 @@ for (const scenario of scenarios) { // "After": each user applies their change on its own clone; the clones are // merged into `afterDoc` via the CRDT — exactly like the gallery's merge. - const afterDoc = cloneWithId(beforeDoc, 2); + // Kept without garbage collection, as stored history and the gallery are. + const afterDoc = new Y.Doc({ gc: false }); + Y.applyUpdate(afterDoc, Y.encodeStateAsUpdate(beforeDoc)); + afterDoc.clientID = 2; teardown.push(() => afterDoc.destroy()); for (let i = 0; i < applies.length; i++) { From d3fb4cd61d187845121201b67d4648519a4bf2d3 Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 10:36:09 +0200 Subject: [PATCH 13/14] refactor(versioning): show lost moves without an author instead of crediting A moved block whose copies are all gone now shows its deletion without an author. This replaces crediting the real deleter (removing movers, adding whoever deleted a copy), which needed insert attributions and more plumbing. No one is named for a deletion they didn't make; the deleter of a moved block is no longer named either. --- .../14-suggestion-gallery/src/scenarios.ts | 2 +- .../core/src/y/extensions/snapshotPreview.ts | 93 ++++--------------- .../extensions/versionDiffAttribution.test.ts | 79 ++++------------ 3 files changed, 36 insertions(+), 138 deletions(-) diff --git a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts index 6d47fb9534..3c7aef1ad5 100644 --- a/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts +++ b/examples/07-collaboration/14-suggestion-gallery/src/scenarios.ts @@ -1056,7 +1056,7 @@ export const scenarios: SuggestionScenario[] = [ feedback: [ { severity: "info", - note: "B's type change is lost with Parent. Versioning shows Parent and Child deleted by A only: B's change replaced Child, but A deleted it on purpose.", + note: "B's type change is lost with Parent. Versioning shows Parent deleted by A, and Child deleted without an author: B's change replaced Child with a copy that was lost, and the diff can't tell who to credit.", }, ], title: "Delete a parent vs change its child's type", diff --git a/packages/core/src/y/extensions/snapshotPreview.ts b/packages/core/src/y/extensions/snapshotPreview.ts index b356a5cdab..7ff907b7c4 100644 --- a/packages/core/src/y/extensions/snapshotPreview.ts +++ b/packages/core/src/y/extensions/snapshotPreview.ts @@ -39,32 +39,16 @@ function inBaseline(baseline: Y.Doc, id: Y.ID): boolean { } /** - * Credit a moved block's deletion to whoever removed it, not to whoever moved - * it, returning the adjusted delete attributions. + * Moved blocks that are gone, with their content. * * A move (indenting, dragging, a type change, ...) deletes a block and inserts * a copy with the same id. While a copy is shown, the diff shows the move as - * is. Once every copy is gone, only the original's deletion is shown, so: - * - whoever inserted a copy (a mover) is removed from it; - * - whoever deleted a copy, other than by moving it on, is added to it. - * A copy lost with a concurrently deleted parent has no deleter, so a block - * moved into it shows as deleted without an author. Without insert - * attributions the movers are unknown, so no author is shown. + * is. Once every copy is gone, only the original's deletion is shown, and + * that names the mover, who may not have deleted it: the copy can be lost + * with a concurrently deleted parent, or deleted later by someone else. Such + * deletions are shown without an author. */ -function creditMoves( - doc: Y.Doc, - baseline: Y.Doc, - attributions: Y.ContentMap, -): Y.IdMap { - // Attributions hold the author under the change's kind ("insert" or - // "delete"), next to its time ("insertAt" or "deleteAt"). - function users(map: Y.IdMap, item: Y.Item, kind: string): unknown[] { - return map - .slice(item.id.client, item.id.clock, 1) - .flatMap((range) => range.attrs ?? []) - .filter((attr) => attr.name === kind) - .map((attr) => attr.val); - } +function lostMoves(doc: Y.Doc, baseline: Y.Doc): Y.IdSet { const originals = new Map(); const copies = new Map(); for (const structs of doc.store.clients.values()) { @@ -89,73 +73,25 @@ function creditMoves( } } } - const replaced = Y.createIdSet(); - const credited: Y.IdMap = Y.createIdMap(); + const lost = Y.createIdSet(); for (const [id, blocks] of originals) { - const moved = copies.get(id); - if (!moved || moved.some((copy) => !copy.deleted)) { + if (!copies.get(id)?.every((copy) => copy.deleted)) { continue; } - const inserters = moved.map((copy) => - users(attributions.inserts, copy, "insert"), - ); - const movers = new Set(inserters.flat()); - const known = inserters.every((inserter) => inserter.length > 0); - const deleters = new Set( - moved.flatMap((copy, i) => - users(attributions.deletes, copy, "delete").filter( - (user) => - !inserters.some((other, j) => j !== i && other.includes(user)), - ), - ), - ); for (const structs of doc.store.clients.values()) { for (const item of structs) { if ( - !(item instanceof Y.Item) || - !blocks.some( + item instanceof Y.Item && + blocks.some( (block) => item === block._item || Y.isParentOf(block, item), ) ) { - continue; - } - const { client, clock } = item.id; - for (const range of attributions.deletes.slice( - client, - clock, - item.length, - )) { - const attrs = range.attrs ?? []; - const movedBy = attrs.filter( - (attr) => - attr.name === "delete" && (!known || movers.has(attr.val)), - ); - if (!movedBy.length) { - continue; - } - const kept = attrs.filter((attr) => !movedBy.includes(attr)); - const added = known - ? [...deleters] - .filter( - (user) => - !kept.some( - (attr) => attr.name === "delete" && attr.val === user, - ), - ) - .map((user) => Y.createContentAttribute("delete", user)) - : []; - const ids = Y.createIdSet(); - ids.add(client, range.clock, range.len); - replaced.add(client, range.clock, range.len); - Y.insertIntoIdMap( - credited, - Y.createIdMapFromIdSet(ids, [...kept, ...added]), - ); + lost.add(item.id.client, item.id.clock, item.length); } } } } - return Y.mergeIdMaps([Y.diffIdMap(attributions.deletes, replaced), credited]); + return lost; } /** @@ -188,7 +124,10 @@ export function showSnapshotPreview( baseline && attributions ? Y.createContentMap( attributions.inserts, - creditMoves(snapshot.doc, baseline.doc, attributions), + Y.diffIdMap( + attributions.deletes, + lostMoves(snapshot.doc, baseline.doc), + ), ) : attributions; editor.exec( diff --git a/packages/core/src/y/extensions/versionDiffAttribution.test.ts b/packages/core/src/y/extensions/versionDiffAttribution.test.ts index 8e2072783a..8e7a6346c8 100644 --- a/packages/core/src/y/extensions/versionDiffAttribution.test.ts +++ b/packages/core/src/y/extensions/versionDiffAttribution.test.ts @@ -313,29 +313,23 @@ describe("version diff of a moved block", () => { ).toEqual(["[block moved]: bob", "Moved: bob"]); }); - it.each([true, false])( - "names no author for a block moved into a concurrently deleted one (insert attributions: %s)", - (withInserts) => { - const base = blocks(); - const bob = editOf(base, 2, nest); - const alice = editOf(base, 1, removeParent); - const server = history(base); - const before = server.apply(alice, "alice"); - const after = server.apply(bob, "bob"); - const attributions = withInserts - ? server.attributions - : deletedBy(bob, "bob"); - expect(deletions(before, after, attributions)).toEqual([ - "[block moved]: ", - "Moved: ", - ]); - }, - ); + it("names no author for a block moved into a concurrently deleted one", () => { + const base = blocks(); + const bob = editOf(base, 2, nest); + const alice = editOf(base, 1, removeParent); + const server = history(base); + const before = server.apply(alice, "alice"); + const after = server.apply(bob, "bob"); + expect(deletions(before, after, server.attributions)).toEqual([ + "[block moved]: ", + "Moved: ", + ]); + }); - it("keeps the deleter of a block whose concurrent type change is lost", () => { + it("keeps the parent's deleter when a child's concurrent type change is lost", () => { const base = blocks(); // Bob's type change replaces the child with a heading copy, which Alice's - // deletion of the parent takes with it. Alice did see and delete the child. + // deletion of the parent takes with it. const bob = editOf(base, 2, (editor) => editor.updateBlock("child", { type: "heading" }), ); @@ -348,12 +342,12 @@ describe("version diff of a moved block", () => { ).toEqual([ "[block parent]: alice", "Parent: alice", - "[block child]: alice", - "Child: alice", + "[block child]: ", + "Child: ", ]); }); - it("attributes a moved block to whoever deletes it, not to the mover", () => { + it("names no author for a moved block that someone else deletes", () => { const base = blocks(); const server = history(base); server.apply(editOf(base, 1, nest), "alice"); @@ -365,43 +359,8 @@ describe("version diff of a moved block", () => { "Parent: bob", "[block child]: bob", "Child: bob", - "[block moved]: bob", - "Moved: bob", + "[block moved]: ", + "Moved: ", ]); }); - - it("attributes a moved block to the mover who then deletes it", () => { - const base = blocks(); - const server = history(base); - const after = server.apply( - editOf(base, 2, (editor) => { - nest(editor); - editor.removeBlocks(["moved"]); - }), - "bob", - ); - expect( - deletions(Y.encodeStateAsUpdateV2(base), after, server.attributions), - ).toEqual(["[block moved]: bob", "Moved: bob"]); - }); - - it("attributes a block moved twice to whoever deletes it", () => { - const base = blocks(); - const server = history(base); - server.apply(editOf(base, 2, nest), "bob"); - server.apply( - editOf(server.server, 3, (editor) => { - editor.setTextCursorPosition("moved"); - editor.unnestBlock(); - }), - "carol", - ); - const after = server.apply( - editOf(server.server, 4, (editor) => editor.removeBlocks(["moved"])), - "dave", - ); - expect( - deletions(Y.encodeStateAsUpdateV2(base), after, server.attributions), - ).toEqual(["[block moved]: dave", "Moved: dave"]); - }); }); From 015cc529942d2b6c082890fa299562d2dbf0a8af Mon Sep 17 00:00:00 2001 From: yousefed Date: Thu, 8 Oct 2026 10:52:33 +0200 Subject: [PATCH 14/14] test(versioning): keep deleted content in every cloned doc --- tests/src/end-to-end/y-prosemirror/versioning.test.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/src/end-to-end/y-prosemirror/versioning.test.tsx b/tests/src/end-to-end/y-prosemirror/versioning.test.tsx index 62130795b3..8f10123ee1 100644 --- a/tests/src/end-to-end/y-prosemirror/versioning.test.tsx +++ b/tests/src/end-to-end/y-prosemirror/versioning.test.tsx @@ -41,9 +41,10 @@ function bytesEqual(a: Uint8Array, b: Uint8Array): boolean { } /** Clone a Y.Doc's content into a fresh doc with a pinned clientID (so the - * concurrent merge tiebreak — and thus the test — is deterministic). */ + * concurrent merge tiebreak — and thus the test — is deterministic). Deleted + * content is kept, as stored history and the gallery keep it. */ function cloneWithId(source: Y.Doc, clientID: number): Y.Doc { - const doc = new Y.Doc(); + const doc = new Y.Doc({ gc: false }); Y.applyUpdate(doc, Y.encodeStateAsUpdate(source)); doc.clientID = clientID; return doc; @@ -109,10 +110,7 @@ for (const scenario of scenarios) { // "After": each user applies their change on its own clone; the clones are // merged into `afterDoc` via the CRDT — exactly like the gallery's merge. - // Kept without garbage collection, as stored history and the gallery are. - const afterDoc = new Y.Doc({ gc: false }); - Y.applyUpdate(afterDoc, Y.encodeStateAsUpdate(beforeDoc)); - afterDoc.clientID = 2; + const afterDoc = cloneWithId(beforeDoc, 2); teardown.push(() => afterDoc.destroy()); for (let i = 0; i < applies.length; i++) {