diff --git a/CHANGELOG.md b/CHANGELOG.md index d581422dc..3cc73ea23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Historical release entries from **0.1.0 through 0.5.27** are preserved verbatim - Restored a visible `:focus-visible` indicator on the editable textbox, mapped it to `CanvasText` in forced-colors mode, and suppresses that interactive focus chrome under `@media print`; dependency-locked Chromium, Firefox, and WebKit acceptance exercises the packed stylesheet on the real `role="textbox"` surface. ### Security +- Patched an editor dependency vulnerability while preserving the existing formatting, collaboration-presence, safe-link, and exact document-restore behavior. - Raised workspace-wide transitive development-tool overrides for `fast-uri`, `nanoid`, and `postcss` to patched minimums, keeping the lockfile audit clean without changing runtime package authority. - Normalized isolated package-verifier temporary roots before containment checks on macOS. diff --git a/docs/atomic-envelope-restore.md b/docs/atomic-envelope-restore.md index b0c97f2c4..31e3f0a07 100644 --- a/docs/atomic-envelope-restore.md +++ b/docs/atomic-envelope-restore.md @@ -35,7 +35,7 @@ Restore performs these operations in order: 4. validate the Inkspan envelope schema identifier and version; 5. detach and deeply freeze the document JSON; 6. reconstruct and recursively check the complete document against the active ProseMirror schema; -7. dispatch one TipTap `setContent(..., false)` replacement; +7. dispatch one TipTap `setContent(..., { emitUpdate: false })` replacement; 8. verify that the resulting active document is structurally equal to the prepared document. Any failure before step 7 leaves the current document unchanged. A ProseMirror transaction filter may reject a schema-valid replacement at step 7; Inkspan then throws `DocumentEnvelopeRestoreError` and never reports the operation as successful. Inkspan's built-in safe-link and inline-image policies reject unsafe replacements without changing the document. @@ -87,7 +87,7 @@ The helper adds no database, credential, environment-variable, transport, provid ## Primary references -- [TipTap v2 `setContent` command](https://v2.tiptap.dev/docs/editor/api/commands/content/set-content) +- [TipTap `setContent` command](https://tiptap.dev/docs/editor/api/commands/content/set-content) - [ProseMirror `PluginSpec.filterTransaction`](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) - [ProseMirror `Schema.nodeFromJSON()` and `Node.check()`](https://prosemirror.net/docs/ref/#model.Schema.nodeFromJSON) - [RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format](https://www.rfc-editor.org/rfc/rfc8259) diff --git a/docs/collaboration.md b/docs/collaboration.md index 6fdea724b..491ba20f1 100644 --- a/docs/collaboration.md +++ b/docs/collaboration.md @@ -187,8 +187,8 @@ editor or coupling its core package to organization infrastructure. ## Primary references -- [TipTap v2 Collaboration](https://v2.tiptap.dev/docs/editor/extensions/functionality/collaboration) -- [TipTap v2 Collaboration Cursor](https://v2.tiptap.dev/docs/editor/extensions/functionality/collaboration-cursor) +- [TipTap Collaboration](https://tiptap.dev/docs/editor/extensions/functionality/collaboration) +- [TipTap Collaboration Caret](https://tiptap.dev/docs/editor/extensions/functionality/collaboration-caret) - [Yjs Awareness and Presence](https://docs.yjs.dev/getting-started/adding-awareness) - [WAI-ARIA `status` role](https://www.w3.org/TR/wai-aria-1.2/#status) - [WCAG relative luminance definition](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html) diff --git a/docs/doctoring/tiptap-v2-prosemirror-paste-adapter.md b/docs/doctoring/tiptap-v2-prosemirror-paste-adapter.md index 519012601..401c8c4dd 100644 --- a/docs/doctoring/tiptap-v2-prosemirror-paste-adapter.md +++ b/docs/doctoring/tiptap-v2-prosemirror-paste-adapter.md @@ -1,8 +1,8 @@ -# TipTap v2 ProseMirror paste adapter +# TipTap ProseMirror paste adapter ## Decision -Inkspan registers SafeClipboard through a TipTap v2 extension whose +Inkspan registers SafeClipboard through a TipTap v3 extension whose `addProseMirrorPlugins` hook returns a ProseMirror `Plugin` with a `transformPastedHTML` editor property. That property receives rich clipboard HTML before ProseMirror parses it into an editor document. @@ -16,7 +16,7 @@ retention, migration, and model-use policy. ## Root cause -Inkspan locks `@tiptap/core 2.27.2`. The first implementation placed a +Inkspan previously locked `@tiptap/core 2.27.2`. The first implementation placed a `transformPastedHTML` field directly on a TipTap extension configuration and its unit tests invoked that field manually. That appeared consistent with current TipTap documentation, but it did not prove registration in the installed v2 @@ -28,7 +28,13 @@ plugins. It does not collect an arbitrary direct extension `transformPastedHTML` field into editor props. The locked source is authoritative for the installed runtime, while current mutable documentation is useful design context but not evidence that an API existed in this historical dependency -version. +version. Inkspan now locks the coherent TipTap 3.30.4 package family; the same +real-pipeline tests prove that the adapter remains registered after migration. +The published `@tiptap/react` 3.30.4 ESM and CommonJS declarations qualify four +`Editor` references through an internal namespace that does not export that +type. The lockfile applies one bounded patch to those declarations, and the +packed strict-TypeScript consumer check prevents the broken public types from +shipping. The practical result was a false assurance gap: direct sanitizer unit tests were green, but the real `editor.view` paste pipeline had no SafeClipboard @@ -57,7 +63,7 @@ result is not completion evidence for a later exact head. ## Ordering and residual host boundary -TipTap v2.27.2 sorts extension priorities from higher to lower when resolving +TipTap v3.30.4 sorts extension priorities from higher to lower when resolving extensions and again when assembling ProseMirror plugins. ProseMirror checks plugin-provided editor properties in plugin order. SafeClipboard therefore uses a deliberately low priority so ordinary host transforms run first and the @@ -107,6 +113,6 @@ TipTap GmbH. (n.d.). *Extension API*. TipTap Editor Docs. Retrieved August 7, 2026, from https://tiptap.dev/docs/editor/extensions/custom-extensions/create-new/extension -TipTap GmbH. (2025). *ExtensionManager.ts (Version 2.27.2)* [Source code]. -GitHub. Retrieved August 7, 2026, from -https://github.com/ueberdosis/tiptap/blob/%40tiptap/core%402.27.2/packages/core/src/ExtensionManager.ts +TipTap GmbH. (2026). *ExtensionManager.ts (Version 3.30.4)* [Source code]. +GitHub. Retrieved September 4, 2026, from +https://github.com/ueberdosis/tiptap/blob/%40tiptap/core%403.30.4/packages/core/src/ExtensionManager.ts diff --git a/docs/imperative-envelope-persistence.md b/docs/imperative-envelope-persistence.md index e219ec12d..42b1b4632 100644 --- a/docs/imperative-envelope-persistence.md +++ b/docs/imperative-envelope-persistence.md @@ -94,7 +94,7 @@ Object and JSON-text inputs use `validateDocumentEnvelope()` and `...Bytes` methods. Validation is non-mutating. Restore completes duplicate object-name detection, resource checks, schema/version routing, hostile-value detachment, and full active ProseMirror schema reconstruction before one -`setContent(..., false)` mutation. A failure leaves the current document +`setContent(..., { emitUpdate: false })` mutation. A failure leaves the current document unchanged. Successful restore suppresses normal change callbacks because loading an @@ -216,5 +216,5 @@ metadata rather than extending the strict envelope with ad hoc fields. - [W3C Web Cryptography API Recommendation](https://www.w3.org/TR/2017/REC-WebCryptoAPI-20170126/) - [WHATWG Encoding Standard: UTF-8](https://encoding.spec.whatwg.org/#utf-8) - [TipTap persistence guidance](https://tiptap.dev/docs/editor/core-concepts/persistence) -- [TipTap v2 `setContent`](https://v2.tiptap.dev/docs/editor/api/commands/content/set-content) +- [TipTap `setContent`](https://tiptap.dev/docs/editor/api/commands/content/set-content) - [ProseMirror `Node.fromJSON`](https://prosemirror.net/docs/ref/#model.Node^fromJSON) diff --git a/docs/papers/README.md b/docs/papers/README.md index 97e700de4..a5f812288 100644 --- a/docs/papers/README.md +++ b/docs/papers/README.md @@ -35,4 +35,4 @@ GFM table and strikethrough extensions. as base64, which this module relies on so figures travel with the document and remain readable by a downstream LLM. - **ProseMirror** (Marijn Haverbeke) — the MIT-licensed document model and - editing toolkit that TipTap v2 is built on. + editing toolkit that TipTap is built on. diff --git a/package.json b/package.json index 7e861123e..7f99c12dc 100644 --- a/package.json +++ b/package.json @@ -125,19 +125,16 @@ } }, "dependencies": { - "@tiptap/core": "^2.27.2", - "@tiptap/extension-collaboration": "^2.27.2", - "@tiptap/extension-collaboration-cursor": "^2.27.2", - "@tiptap/extension-image": "^2.11.5", - "@tiptap/extension-link": "^2.11.5", - "@tiptap/extension-placeholder": "^2.11.5", - "@tiptap/extension-table": "^2.11.5", - "@tiptap/extension-table-cell": "^2.11.5", - "@tiptap/extension-table-header": "^2.11.5", - "@tiptap/extension-table-row": "^2.11.5", - "@tiptap/pm": "^2.11.5", - "@tiptap/react": "^2.11.5", - "@tiptap/starter-kit": "^2.11.5", + "@tiptap/core": "3.30.4", + "@tiptap/extension-collaboration": "3.30.4", + "@tiptap/extension-collaboration-caret": "3.30.4", + "@tiptap/extension-image": "3.30.4", + "@tiptap/extension-link": "3.30.4", + "@tiptap/extension-table": "3.30.4", + "@tiptap/extensions": "3.30.4", + "@tiptap/pm": "3.30.4", + "@tiptap/react": "3.30.4", + "@tiptap/starter-kit": "3.30.4", "marked": "^15.0.6", "turndown": "^7.2.0", "turndown-plugin-gfm": "^1.0.2", diff --git a/patches/@tiptap__react@3.30.4.patch b/patches/@tiptap__react@3.30.4.patch new file mode 100644 index 000000000..c5fb3308f --- /dev/null +++ b/patches/@tiptap__react@3.30.4.patch @@ -0,0 +1,70 @@ +diff --git a/dist/index.d.cts b/dist/index.d.cts +index 331a7a57ec202e68d67e2c692c4b1bedb928c6cc..5fc696b31890d469d3b1cd07bc2f860f5cfc782e 100644 +--- a/dist/index.d.cts ++++ b/dist/index.d.cts +@@ -402,7 +402,7 @@ declare function ReactWidgetRenderer

= object>(com + */ + type TiptapContextType = { + /** The Tiptap editor instance. */ +- editor: index_d_exports.Editor; ++ editor: Editor; + }; + /** + * React context that stores the current editor instance. +@@ -459,18 +459,18 @@ declare const useTiptap: () => TiptapContextType; + * } + * ``` + */ +-declare function useTiptapState(selector: (context: EditorStateSnapshot) => TSelectorResult, equalityFn?: (a: TSelectorResult, b: TSelectorResult | null) => boolean): TSelectorResult; ++declare function useTiptapState(selector: (context: EditorStateSnapshot) => TSelectorResult, equalityFn?: (a: TSelectorResult, b: TSelectorResult | null) => boolean): TSelectorResult; + type TiptapWrapperEditorInstanceProps = { + /** + * The editor instance to provide to child components. + * Use `useEditor()` to create this instance. + */ +- editor: index_d_exports.Editor; ++ editor: Editor; + } | { + /** + * @deprecated Use `editor` instead. Will be removed in the next major version. + */ +- instance: index_d_exports.Editor; ++ instance: Editor; + }; + /** + * Props for the `Tiptap` root/provider component. +diff --git a/dist/index.d.ts b/dist/index.d.ts +index 1ea46992a97b34957359edd7e70186dfa060fe87..1aeb997fa11b4dfb57604596dded3f54f2c3e270 100644 +--- a/dist/index.d.ts ++++ b/dist/index.d.ts +@@ -402,7 +402,7 @@ declare function ReactWidgetRenderer

= object>(com + */ + type TiptapContextType = { + /** The Tiptap editor instance. */ +- editor: index_d_exports.Editor; ++ editor: Editor; + }; + /** + * React context that stores the current editor instance. +@@ -459,18 +459,18 @@ declare const useTiptap: () => TiptapContextType; + * } + * ``` + */ +-declare function useTiptapState(selector: (context: EditorStateSnapshot) => TSelectorResult, equalityFn?: (a: TSelectorResult, b: TSelectorResult | null) => boolean): TSelectorResult; ++declare function useTiptapState(selector: (context: EditorStateSnapshot) => TSelectorResult, equalityFn?: (a: TSelectorResult, b: TSelectorResult | null) => boolean): TSelectorResult; + type TiptapWrapperEditorInstanceProps = { + /** + * The editor instance to provide to child components. + * Use `useEditor()` to create this instance. + */ +- editor: index_d_exports.Editor; ++ editor: Editor; + } | { + /** + * @deprecated Use `editor` instead. Will be removed in the next major version. + */ +- instance: index_d_exports.Editor; ++ instance: Editor; + }; + /** + * Props for the `Tiptap` root/provider component. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77e8723f1..b6d6bb2b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,8 @@ settings: excludeLinksFromLockfile: false overrides: + '@tiptap/extension-bubble-menu': 3.30.4 + '@tiptap/extension-floating-menu': 3.30.4 vite: ^6.4.3 esbuild: ^0.25.0 fast-uri: ^3.1.5 @@ -13,49 +15,43 @@ overrides: brace-expansion: ^5.0.8 minimatch: ^10.0.0 +patchedDependencies: + '@tiptap/react@3.30.4': af087c2b6d7b037140520eccaea4545af8309648a75f788ed6d7f6afa37cb1c7 + importers: .: dependencies: '@tiptap/core': - specifier: ^2.27.2 - version: 2.27.2(@tiptap/pm@2.27.2) + specifier: 3.30.4 + version: 3.30.4(@tiptap/pm@3.30.4) '@tiptap/extension-collaboration': - specifier: ^2.27.2 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(y-prosemirror@1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)) - '@tiptap/extension-collaboration-cursor': - specifier: ^2.27.2 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(y-prosemirror@1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)) + specifier: 3.30.4 + version: 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31) + '@tiptap/extension-collaboration-caret': + specifier: 3.30.4 + version: 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)) '@tiptap/extension-image': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + specifier: 3.30.4 + version: 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) '@tiptap/extension-link': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-placeholder': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + specifier: 3.30.4 + version: 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) '@tiptap/extension-table': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-table-cell': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-table-header': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-table-row': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + specifier: 3.30.4 + version: 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/extensions': + specifier: 3.30.4 + version: 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) '@tiptap/pm': - specifier: ^2.11.5 - version: 2.27.2 + specifier: 3.30.4 + version: 3.30.4 '@tiptap/react': - specifier: ^2.11.5 - version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 3.30.4 + version: 3.30.4(patch_hash=af087c2b6d7b037140520eccaea4545af8309648a75f788ed6d7f6afa37cb1c7)(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^2.11.5 - version: 2.27.2 + specifier: 3.30.4 + version: 3.30.4 marked: specifier: ^15.0.6 version: 15.0.12 @@ -438,6 +434,15 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -737,12 +742,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@remirror/core-constants@3.0.0': - resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} - '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -1036,187 +1035,191 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tiptap/core@2.27.2': - resolution: {integrity: sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==} - peerDependencies: - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-blockquote@2.27.2': - resolution: {integrity: sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-bold@2.27.2': - resolution: {integrity: sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==} + '@tiptap/core@3.30.4': + resolution: {integrity: sha512-V9yKuUfV8qC9WBrnVxkFWmYLBomc3d1CwXoFSjED5DRu5q2oyxv07F+jOJSRogJAY+feHjuxvjhixwxeHm2DXQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-bubble-menu@2.27.2': - resolution: {integrity: sha512-VkwlCOcr0abTBGzjPXklJ92FCowG7InU8+Od9FyApdLNmn0utRYGRhw0Zno6VgE9EYr1JY4BRnuSa5f9wlR72w==} + '@tiptap/extension-blockquote@3.30.4': + resolution: {integrity: sha512-n25/pFfDpZRJS4f6Ga/PkNrQFBEr3pRvPkDlY99kl8Kt8jFa1EUxbx+uUVIilqwiUjUnHtwCfqjSDFooQjezjg==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-bullet-list@2.27.2': - resolution: {integrity: sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==} + '@tiptap/extension-bold@3.30.4': + resolution: {integrity: sha512-eCOkf+/jdQte7lTZ4pQF10akrsFM4TzYc0ysSAkPa7QA+ex1aI8QT5UUx+mK8RwFo57lqE8PCX/Mx1gTqlCDnQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-code-block@2.27.2': - resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} + '@tiptap/extension-bubble-menu@3.30.4': + resolution: {integrity: sha512-diB5stCiuffFIIKhDAVvSYTYW/zzEVh7QqTuk2JAqdkAmAGP2YvUXXZBVhA9ITTIYD1+cp5p6rx9pdM25fsVRQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-code@2.27.2': - resolution: {integrity: sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==} + '@tiptap/extension-bullet-list@3.30.4': + resolution: {integrity: sha512-kJFOF3U4b1ad4T7Vm+CIIp+nxcr6wwWVeqpVe6Jhq9gudsWCKP0+KVAmOiJCePoDu9fpc/ZuGMXDefXYnyQDxg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': 3.30.4 - '@tiptap/extension-collaboration-cursor@2.27.2': - resolution: {integrity: sha512-ScgoVszsFpYs3EldKze1wLcyumNhZHgiOpAj7DpdTEdfSaFAB2gGvzenPBy1zI/PGcLPFEuC/fdLc5ntD3di4Q==} + '@tiptap/extension-code-block@3.30.4': + resolution: {integrity: sha512-eKLKxgLCvi+M5tiLkW+fIMzDtR7HvSKnigSE9RYHZmzSrv1ejVjgNj5FH8nGTim98hXiQGfWotss3zqG6bpdDw==} peerDependencies: - '@tiptap/core': ^2.7.0 - y-prosemirror: ^1.2.11 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-collaboration@2.27.2': - resolution: {integrity: sha512-Y61ItHxQ1uc/Ir27mBQRI/wY9JkOui194V+awNv+1YHeaKArTjC2cdSvNzj9+h8JIh5MyfvslSf8hBa7t7PzAg==} + '@tiptap/extension-code@3.30.4': + resolution: {integrity: sha512-z9v9rBA/0MecUvf8QkcKKOGgceO9X3DT/JvFNka8Mdd68V5fhBs0jGsxYrj3qDWtdXyyUQIWs0t8HzL6LTdLiA==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - y-prosemirror: ^1.2.11 + '@tiptap/core': 3.30.4 - '@tiptap/extension-document@2.27.2': - resolution: {integrity: sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==} + '@tiptap/extension-collaboration-caret@3.30.4': + resolution: {integrity: sha512-Br/J0o+zxt4KMV6CQBieWGJyvD20zFDKG1mhVBAlyHbBdKkXNngz2yoqCeKPpZjFj8htj0l9c5klA7A2mdAjZA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 + '@tiptap/y-tiptap': ^3.0.7 - '@tiptap/extension-dropcursor@2.27.2': - resolution: {integrity: sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==} + '@tiptap/extension-collaboration@3.30.4': + resolution: {integrity: sha512-80ASfIiXfWwiA8tiNU+k6xDcbIfOslYc3q1GJS4Ghmwt3YGi13e5seIdRp0awPs401G9IJQ3HxfHgabIcsfb6A==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 + '@tiptap/y-tiptap': ^3.0.7 + yjs: ^13 - '@tiptap/extension-floating-menu@2.27.2': - resolution: {integrity: sha512-GUN6gPIGXS7ngRJOwdSmtBRBDt9Kt9CM/9pSwKebhLJ+honFoNA+Y6IpVyDvvDMdVNgBchiJLs6qA5H97gAePQ==} + '@tiptap/extension-document@3.30.4': + resolution: {integrity: sha512-N+FbI+X1FVH8HxsM8C4fNkkzKXiyhXc9oh9oSqAIKOAAYGAjnHLMxW9TzYXbvm60SlAn6DIMypNf6nULGEc1oQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-gapcursor@2.27.2': - resolution: {integrity: sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==} + '@tiptap/extension-dropcursor@3.30.4': + resolution: {integrity: sha512-P1V0y/FKdyNVBImeW3WN+uGI77Uboc0dW44izAjrII0jcW2KUoBQeNrbbm9UZR1xuRvQJ1Z0OrFHmYrxP5ClNQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extensions': 3.30.4 - '@tiptap/extension-hard-break@2.27.2': - resolution: {integrity: sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==} + '@tiptap/extension-floating-menu@3.30.4': + resolution: {integrity: sha512-75kDLGkVqLBL7OPGNhJZQkmI3KGGVN9S5i+ZHKZEhk4HNOQUU+YMs7qu4I/XSJMXSh7mGrQlMi/OD/Fn3JmkKg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-heading@2.27.2': - resolution: {integrity: sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==} + '@tiptap/extension-gapcursor@3.30.4': + resolution: {integrity: sha512-wsuXsB8Rp9BgfWlWYsRVzoHg9LwhoPAQGaw/gku1buDSTMcbLYQvok5MwJ/uJRECaJRLGgbUe5WBXoRvSY+o3g==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extensions': 3.30.4 - '@tiptap/extension-history@2.27.2': - resolution: {integrity: sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==} + '@tiptap/extension-hard-break@3.30.4': + resolution: {integrity: sha512-eZ66SyfgmMK861S5SYtQROT/+ZfXtDHxllz7ao+X+dcl+DMdffmOzBeSfwrHQENmgl7umjbdAjqC7PT95jaU+w==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-horizontal-rule@2.27.2': - resolution: {integrity: sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==} + '@tiptap/extension-heading@3.30.4': + resolution: {integrity: sha512-sVJxoRnbfK/QC7IoUw/Ezzx9b87+cqFz5d5WZvN8O8yobDWuh7IS8ZgqZiPypTW5RuhnZI+ahvmSyO3WLm8q5Q==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-image@2.27.2': - resolution: {integrity: sha512-5zL/BY41FIt72azVrCrv3n+2YJ/JyO8wxCcA4Dk1eXIobcgVyIdo4rG39gCqIOiqziAsqnqoj12QHTBtHsJ6mQ==} + '@tiptap/extension-horizontal-rule@3.30.4': + resolution: {integrity: sha512-RmvjVVkUf5pF70XvwI7Sb4vIUSDbLTLEcFl1l5X9vPcDgDT5G0SiUL6l8F49+qYc6wrMvnLcenApnAiiQ0Vbpw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-italic@2.27.2': - resolution: {integrity: sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==} + '@tiptap/extension-image@3.30.4': + resolution: {integrity: sha512-BwO+SJ+1ZWFLDFbebT80q0PlsbrnmWRExzQqurubM93M22SlADnQxNzS7AKfNmv/e3qKAAXXsoBOkx66BuFjaQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-link@2.27.2': - resolution: {integrity: sha512-bnP61qkr0Kj9Cgnop1hxn2zbOCBzNtmawxr92bVTOE31fJv6FhtCnQiD6tuPQVGMYhcmAj7eihtvuEMFfqEPcQ==} + '@tiptap/extension-italic@3.30.4': + resolution: {integrity: sha512-6cEjcyjPRcLEMB75BwiUc6S7yzkqc7VPXCeRgY26UqMg4AvcLrseY70+pO4sLv3n2DS5w8DBbMXZJ4rb1BhpUw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-list-item@2.27.2': - resolution: {integrity: sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==} + '@tiptap/extension-link@3.30.4': + resolution: {integrity: sha512-HPHaey3+nQZl+lsr/RvjoXSgSC67SAkNEF4qNELzzDwMUfI0UrZ3H/HhBe6XBeRnGli9gfuSpeRkh63ke5JpOw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-ordered-list@2.27.2': - resolution: {integrity: sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==} + '@tiptap/extension-list-item@3.30.4': + resolution: {integrity: sha512-8E1ffdC7v3dwSrsqyxY3YP5uEQHTrwBDDmYF6o2YoHfzQ9nhXX5GmBz8fTxukjXUzSpuO76N/gwHIM8hBfdxMQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': 3.30.4 - '@tiptap/extension-paragraph@2.27.2': - resolution: {integrity: sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==} + '@tiptap/extension-list-keymap@3.30.4': + resolution: {integrity: sha512-6RIzF3aThqIt4sia81K+6wA7H7bgPKjd3D66qLOGxdqdyfnAegk0OD5pUYhMZKhDCWGYKylyRVd2yIn/VNXqAg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': 3.30.4 - '@tiptap/extension-placeholder@2.27.2': - resolution: {integrity: sha512-IjsgSVYJRjpAKmIoapU0E2R4E2FPY3kpvU7/1i7PUYisylqejSJxmtJPGYw0FOMQY9oxnEEvfZHMBA610tqKpg==} + '@tiptap/extension-list@3.30.4': + resolution: {integrity: sha512-Usqez9DBRoG78tdLwPDcd1j1mBBU7mr5D2yrRP2JL/eXXkhAfdWqEFRYXwct5T4/o9JkGcW3aQf+gUvp12v0pw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-strike@2.27.2': - resolution: {integrity: sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==} + '@tiptap/extension-ordered-list@3.30.4': + resolution: {integrity: sha512-hInlH8I2UFGGULm9XLPtLWWFBECrYf/eNkloQb+udbF7ltLBL5JRCPcB3aM29qSSUQVxCCN8ICHdbwgpnTUAsw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': 3.30.4 - '@tiptap/extension-table-cell@2.27.2': - resolution: {integrity: sha512-9Lk46MjZMFzVZfOj9Kd7VgC6Odt6vmEhlCYVumErShUY7EkFqCw3b2IYoUtQkntfOEx/Afnhff/okNQwPsJeUA==} + '@tiptap/extension-paragraph@3.30.4': + resolution: {integrity: sha512-gM0WXvOP1tNcvpyRXTCtGhwVxye0VaFMCzDPjLrVAUtZMpo3cOrqDSrFl5tCurA59Qc2p5TUOR4g3/fKw8Yx9Q==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-table-header@2.27.2': - resolution: {integrity: sha512-ZEb6lbG0NbbodWLV0b4BS/QrDIPlUbCcuOsUxzqVvlMUY1Vg6Fj6fKwLaBcsIUDHi8sxZDBEgYEDw3BR/zcO6A==} + '@tiptap/extension-strike@3.30.4': + resolution: {integrity: sha512-iM3QhkEvNwDsxyNKTZM4wwqYhIKOjgXHTamPWnCICrPQ3aYFVdidfpDMePlHl6XL8aEAqPa1Xlj0aumFvSphOQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-table-row@2.27.2': - resolution: {integrity: sha512-Nw9+tA56Y5HtLVP01NGCZSUuTQhJPtfK9OfmDgGgcxynn2cRVdEtj+9FNZqRhQ1iRVaAI+Rd4xRvX9qYePMOxw==} + '@tiptap/extension-table@3.30.4': + resolution: {integrity: sha512-hH6E4y4QK8F2h4Eb/qiu8/tRXSQPbJn8pNOIQqcvA30luUnFWSpqHFDxO/a/XrzwF6F1l268WTekrn0PKogOzg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/extension-table@2.27.2': - resolution: {integrity: sha512-pDbhOpT5phZkcsyPjGBQlXv0+0hmdrvqHJ+dJjkGcCtlfy2pHiEIhmIItOFagc7wXy8G9iUFZ9Jie4zvDf+brg==} + '@tiptap/extension-text@3.30.4': + resolution: {integrity: sha512-bzgVlPhkVan+m6jycXkyq08fKCNyQff/cl/5U+/wQf8s3GlX+Le2/pTxbbC3ClfO1D8VLzLwcd2HJTYIoBOdAA==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-text-style@2.27.2': - resolution: {integrity: sha512-Omk+uxjJLyEY69KStpCw5fA9asvV+MGcAX2HOxyISDFoLaL49TMrNjhGAuz09P1L1b0KGXo4ml7Q3v/Lfy4WPA==} + '@tiptap/extension-underline@3.30.4': + resolution: {integrity: sha512-h6nM3ykKswJLWvJVD1eiUFbanNmNj2SeV+2vuW666/xOy2WPyMnE2NZnsbvCKeK0wlUj7AE3l1m602mFwA4sDg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 - '@tiptap/extension-text@2.27.2': - resolution: {integrity: sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==} + '@tiptap/extensions@3.30.4': + resolution: {integrity: sha512-WeBl/ggeNCOoOySX7647lwtSUHWbCh8I1Qqp8NQBsGyHXEE6/7jHbKcxpw4fplOgScgVMfPz8WZ+3yrfXYCUFw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 - '@tiptap/pm@2.27.2': - resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} + '@tiptap/pm@3.30.4': + resolution: {integrity: sha512-oPbE+BOzzDKkxsvF9wepTWELvq385oifDkKIigqKCPKpGqplEIHIjNztCj/nOqHCfJBiU9LcoyyWH0qkHAQ9TQ==} - '@tiptap/react@2.27.2': - resolution: {integrity: sha512-0EAs8Cpkfbvben1PZ34JN2Nd79Dhioynm2jML27DBbf1VWPk+FFWFGTMLUT0bu+Np5iVxio8fqV9t0mc4D6thA==} + '@tiptap/react@3.30.4': + resolution: {integrity: sha512-NxGcKg4xBF6ngk6xORyzRCvG9zb7Z/cf59GpDBsiYpPpD/6m+J4kfNF0KVIOhRSAhNxm2u2ZPuGIWBtS/CDUBQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': 3.30.4 + '@tiptap/pm': 3.30.4 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.27.2': - resolution: {integrity: sha512-bb0gJvPoDuyRUQ/iuN52j1//EtWWttw+RXAv1uJxfR0uKf8X7uAqzaOOgwjknoCIDC97+1YHwpGdnRjpDkOBxw==} + '@tiptap/starter-kit@3.30.4': + resolution: {integrity: sha512-rZiv2QOqfQU4/MNsAmvbymIwx0tKrGrtdJg76aEaej+aGU1QNDhZbUNutV8AnZxFjSJMm8rt810qzAU98OmCAg==} + + '@tiptap/y-tiptap@3.0.9': + resolution: {integrity: sha512-7/El8NQ8R5V5MkdrOUdfj9IgZacpt0H071xNimX7B0AnYiWiKefQnMKd41neQYzo2MOXbWdN3iZ+7Z7BruzOSA==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -1251,15 +1254,6 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/mdx@2.0.14': resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} @@ -1428,9 +1422,6 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -1516,9 +1507,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - crelt@1.0.7: - resolution: {integrity: sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1610,10 +1598,6 @@ packages: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -1650,10 +1634,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -1679,6 +1659,10 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-equals@5.4.1: + resolution: {integrity: sha512-DjlFSM5Pk9cGcL0q5QXl66eGzx0N6szNgaswwc5ZphlBohjTVJSnGgI+rJVOgOi65qUoQnDZN4nDqi33udtydQ==} + engines: {node: '>=6.0.0'} + fast-uri@3.1.5: resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} @@ -1884,9 +1868,6 @@ packages: engines: {node: '>=16'} hasBin: true - linkify-it@5.0.2: - resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} - linkifyjs@4.3.3: resolution: {integrity: sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==} @@ -1925,10 +1906,6 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - markdown-it@14.3.0: - resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} - hasBin: true - marked@15.0.12: resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} engines: {node: '>= 18'} @@ -1938,9 +1915,6 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2058,9 +2032,6 @@ packages: prosemirror-changeset@2.4.1: resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} - prosemirror-collab@1.3.1: - resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} - prosemirror-commands@1.7.1: resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} @@ -2079,18 +2050,9 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.5: - resolution: {integrity: sha512-ac8trNQ01ybKDRTcfUc56LZufG3oYyU4N25qSXgp8dS0U4JtzzCj7oQlKu5v09VSmS5IseYoQ2yDkTbo7f7D8Q==} - - prosemirror-menu@1.3.2: - resolution: {integrity: sha512-6VgUJTYod0nMBlCaYJGhXGLu7Gt4AvcwcOq0YfJCY/6Uh+3S7UsWhpy6rJFCBFOmonq1hD8KyWOtZhkppd4YPg==} - prosemirror-model@1.25.11: resolution: {integrity: sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==} - prosemirror-schema-basic@1.2.4: - resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} - prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -2100,23 +2062,12 @@ packages: prosemirror-tables@1.8.5: resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} - prosemirror-trailing-node@3.0.0: - resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} - peerDependencies: - prosemirror-model: ^1.22.1 - prosemirror-state: ^1.4.2 - prosemirror-view: ^1.33.8 - prosemirror-transform@1.12.0: resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} prosemirror-view@1.42.1: resolution: {integrity: sha512-rRqzZnRgkyh69XoOMrfFJHwauHscLBmHbq772kwbic1ymQAM8gXjzEbJse5j1ep2UO2HRIAQL0bY3kZ/RoqjVw==} - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2334,9 +2285,6 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} - tippy.js@6.3.7: - resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} - tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -2375,9 +2323,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -2854,6 +2799,20 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + optional: true + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + optional: true + + '@floating-ui/utils@0.2.12': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3079,10 +3038,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@popperjs/core@2.11.8': {} - - '@remirror/core-constants@3.0.0': {} - '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/pluginutils@5.4.0(rollup@4.62.2)': @@ -3336,202 +3291,209 @@ snapshots: dependencies: '@testing-library/dom': 10.4.1 - '@tiptap/core@2.27.2(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-blockquote@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/core@3.30.4(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 3.30.4 - '@tiptap/extension-bold@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-blockquote@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 - '@tiptap/extension-bubble-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-bold@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - tippy.js: 6.3.7 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-bullet-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-bubble-menu@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 + optional: true - '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-bullet-list@3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/extension-list': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) - '@tiptap/extension-code@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-code-block@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 - '@tiptap/extension-collaboration-cursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(y-prosemirror@1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))': + '@tiptap/extension-code@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - y-prosemirror: 1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-collaboration@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(y-prosemirror@1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))': + '@tiptap/extension-collaboration-caret@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - y-prosemirror: 1.3.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 + '@tiptap/y-tiptap': 3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) - '@tiptap/extension-document@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-collaboration@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 + '@tiptap/y-tiptap': 3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) + yjs: 13.6.31 - '@tiptap/extension-dropcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-document@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-floating-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-dropcursor@3.30.4(@tiptap/extensions@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - tippy.js: 6.3.7 + '@tiptap/extensions': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) - '@tiptap/extension-gapcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-floating-menu@3.30.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 + optional: true - '@tiptap/extension-hard-break@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-gapcursor@3.30.4(@tiptap/extensions@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extensions': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) - '@tiptap/extension-heading@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-hard-break@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-history@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-heading@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-horizontal-rule@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-horizontal-rule@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 - '@tiptap/extension-image@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-image@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-italic@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-italic@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-link@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-link@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 linkifyjs: 4.3.3 - '@tiptap/extension-list-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-list-item@3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-list': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) - '@tiptap/extension-ordered-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-list-keymap@3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-list': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) - '@tiptap/extension-paragraph@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 - '@tiptap/extension-placeholder@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-ordered-list@3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/extension-list': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) - '@tiptap/extension-strike@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-paragraph@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-table-cell@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-strike@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-table-header@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-table@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 - '@tiptap/extension-table-row@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extension-text@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-table@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + '@tiptap/extension-underline@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) - '@tiptap/extension-text-style@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + '@tiptap/extensions@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 - '@tiptap/extension-text@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/pm@2.27.2': + '@tiptap/pm@3.30.4': dependencies: prosemirror-changeset: 2.4.1 - prosemirror-collab: 1.3.1 prosemirror-commands: 1.7.1 prosemirror-dropcursor: 1.8.3 prosemirror-gapcursor: 1.4.1 prosemirror-history: 1.5.0 prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-markdown: 1.13.5 - prosemirror-menu: 1.3.2 prosemirror-model: 1.25.11 - prosemirror-schema-basic: 1.2.4 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1) prosemirror-transform: 1.12.0 prosemirror-view: 1.42.1 - '@tiptap/react@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@3.30.4(patch_hash=af087c2b6d7b037140520eccaea4545af8309648a75f788ed6d7f6afa37cb1c7)(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/extension-bubble-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-floating-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) '@types/use-sync-external-store': 0.0.6 - fast-deep-equal: 3.1.3 + fast-equals: 5.4.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1) - - '@tiptap/starter-kit@2.27.2': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/extension-blockquote': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-bold': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-bullet-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-code': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-document': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-dropcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-gapcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-hard-break': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-heading': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-history': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-horizontal-rule': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-italic': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-list-item': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-ordered-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-paragraph': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-strike': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-text': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-text-style': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/pm': 2.27.2 + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/extension-floating-menu': 3.30.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + transitivePeerDependencies: + - '@floating-ui/dom' + + '@tiptap/starter-kit@3.30.4': + dependencies: + '@tiptap/core': 3.30.4(@tiptap/pm@3.30.4) + '@tiptap/extension-blockquote': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/extension-bold': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-bullet-list': 3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)) + '@tiptap/extension-code': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-code-block': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/extension-document': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-dropcursor': 3.30.4(@tiptap/extensions@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)) + '@tiptap/extension-gapcursor': 3.30.4(@tiptap/extensions@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)) + '@tiptap/extension-hard-break': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-heading': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-horizontal-rule': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/extension-italic': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-link': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/extension-list': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/extension-list-item': 3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)) + '@tiptap/extension-list-keymap': 3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)) + '@tiptap/extension-ordered-list': 3.30.4(@tiptap/extension-list@3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4)) + '@tiptap/extension-paragraph': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-strike': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-text': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extension-underline': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4)) + '@tiptap/extensions': 3.30.4(@tiptap/core@3.30.4(@tiptap/pm@3.30.4))(@tiptap/pm@3.30.4) + '@tiptap/pm': 3.30.4 + + '@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)': + dependencies: + lib0: 0.2.117 + prosemirror-model: 1.25.11 + prosemirror-state: 1.4.4 + prosemirror-view: 1.42.1 + y-protocols: 1.0.7(yjs@13.6.31) + yjs: 13.6.31 '@tybys/wasm-util@0.10.3': dependencies: @@ -3574,15 +3536,6 @@ snapshots: '@types/estree@1.0.9': {} - '@types/linkify-it@5.0.0': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - - '@types/mdurl@2.0.0': {} - '@types/mdx@2.0.14': {} '@types/node@22.20.1': @@ -3785,8 +3738,6 @@ snapshots: dependencies: sprintf-js: 1.0.3 - argparse@2.0.1: {} - aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -3864,8 +3815,6 @@ snapshots: convert-source-map@2.0.0: {} - crelt@1.0.7: {} - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3935,8 +3884,6 @@ snapshots: empathic@2.0.1: {} - entities@4.5.0: {} - entities@6.0.1: {} entities@7.0.1: {} @@ -3989,8 +3936,6 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@4.0.0: {} - esprima@4.0.1: {} estree-walker@2.0.2: {} @@ -4007,6 +3952,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-equals@5.4.1: {} + fast-uri@3.1.5: {} fdir@6.5.0(picomatch@4.0.5): @@ -4223,10 +4170,6 @@ snapshots: dependencies: isomorphic.js: 0.2.5 - linkify-it@5.0.2: - dependencies: - uc.micro: 2.1.0 - linkifyjs@4.3.3: {} local-pkg@1.2.1: @@ -4265,21 +4208,10 @@ snapshots: dependencies: semver: 7.8.5 - markdown-it@14.3.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.2 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - marked@15.0.12: {} math-intrinsics@1.1.0: {} - mdurl@2.0.0: {} - mime-db@1.52.0: {} mime-types@2.1.35: @@ -4431,10 +4363,6 @@ snapshots: dependencies: prosemirror-transform: 1.12.0 - prosemirror-collab@1.3.1: - dependencies: - prosemirror-state: 1.4.4 - prosemirror-commands@1.7.1: dependencies: prosemirror-model: 1.25.11 @@ -4471,27 +4399,10 @@ snapshots: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.5: - dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.3.0 - prosemirror-model: 1.25.11 - - prosemirror-menu@1.3.2: - dependencies: - crelt: 1.0.7 - prosemirror-commands: 1.7.1 - prosemirror-history: 1.5.0 - prosemirror-state: 1.4.4 - prosemirror-model@1.25.11: dependencies: orderedmap: 2.1.1 - prosemirror-schema-basic@1.2.4: - dependencies: - prosemirror-model: 1.25.11 - prosemirror-schema-list@1.5.1: dependencies: prosemirror-model: 1.25.11 @@ -4512,14 +4423,6 @@ snapshots: prosemirror-transform: 1.12.0 prosemirror-view: 1.42.1 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1): - dependencies: - '@remirror/core-constants': 3.0.0 - escape-string-regexp: 4.0.0 - prosemirror-model: 1.25.11 - prosemirror-state: 1.4.4 - prosemirror-view: 1.42.1 - prosemirror-transform@1.12.0: dependencies: prosemirror-model: 1.25.11 @@ -4530,8 +4433,6 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - punycode.js@2.3.1: {} - punycode@2.3.1: {} quansync@0.2.11: {} @@ -4761,10 +4662,6 @@ snapshots: tinyspy@4.0.4: {} - tippy.js@6.3.7: - dependencies: - '@popperjs/core': 2.11.8 - tldts-core@6.1.86: {} tldts@6.1.86: @@ -4797,8 +4694,6 @@ snapshots: typescript@5.9.3: {} - uc.micro@2.1.0: {} - ufo@1.6.4: {} undici-types@6.21.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 37053afea..f4796a091 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -31,6 +31,8 @@ trustPolicyIgnoreAfter: 43200 # cannot take 5.x, so lift minimatch to ^10 (glob@10 / test-exclude@7 resolve # cleanly) and pin brace-expansion to the patched 5.x line. overrides: + '@tiptap/extension-bubble-menu': 3.30.4 + '@tiptap/extension-floating-menu': 3.30.4 vite: ^6.4.3 esbuild: ^0.25.0 fast-uri: ^3.1.5 @@ -38,3 +40,6 @@ overrides: postcss: ^8.5.23 brace-expansion: ^5.0.8 minimatch: ^10.0.0 + +patchedDependencies: + '@tiptap/react@3.30.4': patches/@tiptap__react@3.30.4.patch diff --git a/src/collaboration/CollaborativeCwlEditor.tsx b/src/collaboration/CollaborativeCwlEditor.tsx index eea89b6c5..c8aeb23ab 100644 --- a/src/collaboration/CollaborativeCwlEditor.tsx +++ b/src/collaboration/CollaborativeCwlEditor.tsx @@ -1,5 +1,5 @@ import Collaboration from '@tiptap/extension-collaboration'; -import CollaborationCursor from '@tiptap/extension-collaboration-cursor'; +import CollaborationCaret from '@tiptap/extension-collaboration-caret'; import { type Editor, useEditor } from '@tiptap/react'; import { forwardRef, @@ -198,7 +198,7 @@ export const CollaborativeCwlEditor = forwardRef< }), ...(scopedProvider && cursorUser ? [ - CollaborationCursor.configure({ + CollaborationCaret.configure({ provider: scopedProvider, user: cursorUser, render: renderCollaborationCursor, diff --git a/src/components/CwlEditor.tsx b/src/components/CwlEditor.tsx index 598ac948a..240f87423 100644 --- a/src/components/CwlEditor.tsx +++ b/src/components/CwlEditor.tsx @@ -213,7 +213,7 @@ export const CwlEditor = forwardRef( if (current !== value) { /* v8 ignore next -- isControlled guarantees value is defined. */ const next = editorValueToHtml(value ?? '', mode); - editor.commands.setContent(next, false); + editor.commands.setContent(next, { emitUpdate: false }); } }, [editor, isControlled, value, mode]); diff --git a/src/components/EditorFormField.tsx b/src/components/EditorFormField.tsx index a8f9282ce..2e7481e71 100644 --- a/src/components/EditorFormField.tsx +++ b/src/components/EditorFormField.tsx @@ -23,7 +23,7 @@ export interface EditorFormFieldProps { * * Named fields subscribe only to document-changing transactions, avoiding a * full Markdown/HTML serialization on cursor movement while still observing - * programmatic `setContent(..., false)` calls that intentionally suppress the + * programmatic `setContent(..., { emitUpdate: false })` calls that suppress the * higher-level TipTap update event. The field's native value is written * synchronously before returning from each document transaction, so immediate * `FormData` construction or browser submission cannot observe a React-batched diff --git a/src/components/editorFormReset.test.ts b/src/components/editorFormReset.test.ts index c160cb9d7..11f9332cf 100644 --- a/src/components/editorFormReset.test.ts +++ b/src/components/editorFormReset.test.ts @@ -31,7 +31,9 @@ describe('editor form reset application', () => { onFormReset, }); - expect(setContent).toHaveBeenCalledWith('

Reset baseline

', false); + expect(setContent).toHaveBeenCalledWith('

Reset baseline

', { + emitUpdate: false, + }); expect(onChange).toHaveBeenCalledWith('

Reset baseline

'); expect(onFormReset).toHaveBeenCalledWith({ editor, event }); }); @@ -66,6 +68,8 @@ describe('editor form reset application', () => { event: new Event('reset'), }), ).not.toThrow(); - expect(setContent).toHaveBeenCalledWith('

Reset baseline

', false); + expect(setContent).toHaveBeenCalledWith('

Reset baseline

', { + emitUpdate: false, + }); }); }); diff --git a/src/components/editorFormReset.ts b/src/components/editorFormReset.ts index f424786af..3e7ed292c 100644 --- a/src/components/editorFormReset.ts +++ b/src/components/editorFormReset.ts @@ -37,7 +37,9 @@ export function applyEditorFormReset({ onFormReset, }: ApplyEditorFormResetOptions): void { if (resetValue !== undefined) { - editor.commands.setContent(editorValueToHtml(resetValue, mode), false); + editor.commands.setContent(editorValueToHtml(resetValue, mode), { + emitUpdate: false, + }); onChange?.(editorHtmlToValue(editor.getHTML(), mode)); } onFormReset?.({ editor, event }); diff --git a/src/components/useEditorHandle.ts b/src/components/useEditorHandle.ts index 710fe883f..b47fb036e 100644 --- a/src/components/useEditorHandle.ts +++ b/src/components/useEditorHandle.ts @@ -132,7 +132,7 @@ export function useEditorHandle( if (!editor) return; editor.commands.setContent( editorValueToHtml(next, modeRef.current), - false, + { emitUpdate: false }, ); }, validateDocumentEnvelope: (source, limits) => @@ -182,7 +182,7 @@ export function useEditorHandle( setDocumentJson: (documentJson) => { if (!editor) return; const documentNode = parseDocumentJsonForEditor(editor, documentJson); - editor.commands.setContent(documentNode, false); + editor.commands.setContent(documentNode, { emitUpdate: false }); }, insertValue: (next: string) => { if (!editor) return; diff --git a/src/documentEnvelopeIfMatch.evidence.test.tsx b/src/documentEnvelopeIfMatch.evidence.test.tsx index fcecfe170..8ba5b3c7f 100644 --- a/src/documentEnvelopeIfMatch.evidence.test.tsx +++ b/src/documentEnvelopeIfMatch.evidence.test.tsx @@ -228,7 +228,7 @@ describe('atomic revision-envelope conflict evidence', () => { sourceTrapInvoked = true; editor.commands.setContent( '

Newer document from source preparation

', - false, + { emitUpdate: false }, ); } return Reflect.ownKeys(target); @@ -301,7 +301,9 @@ describe('atomic revision-envelope conflict evidence', () => { ); await nextDigestStarted; act(() => { - editor.commands.setContent('

Newer local document

', false); + editor.commands.setContent('

Newer local document

', { + emitUpdate: false, + }); }); releaseNextDigest(); diff --git a/src/documentEnvelopeIfMatch.reentrancy.test.tsx b/src/documentEnvelopeIfMatch.reentrancy.test.tsx index d994b014b..48ac4fd2b 100644 --- a/src/documentEnvelopeIfMatch.reentrancy.test.tsx +++ b/src/documentEnvelopeIfMatch.reentrancy.test.tsx @@ -59,7 +59,9 @@ describe('revision-guarded restore reentrancy', () => { getPrototypeOf(target) { if (!changed) { changed = true; - editor.commands.setContent('

Reentrant newer document

', false); + editor.commands.setContent('

Reentrant newer document

', { + emitUpdate: false, + }); } return Reflect.getPrototypeOf(target); }, diff --git a/src/documentEnvelopeIfMatch.test.tsx b/src/documentEnvelopeIfMatch.test.tsx index 4b94574a1..ba2ef1d79 100644 --- a/src/documentEnvelopeIfMatch.test.tsx +++ b/src/documentEnvelopeIfMatch.test.tsx @@ -218,7 +218,9 @@ describe('revision-guarded document-envelope restore', () => { deferred.provider, ); await act(async () => { - editor.commands.setContent('

Newer local document

', false); + editor.commands.setContent('

Newer local document

', { + emitUpdate: false, + }); }); deferred.resolve(); diff --git a/src/documentEnvelopeRestore.ts b/src/documentEnvelopeRestore.ts index 4546eb1c8..c265e0765 100644 --- a/src/documentEnvelopeRestore.ts +++ b/src/documentEnvelopeRestore.ts @@ -113,7 +113,7 @@ export function applyPreparedDocumentEnvelope( editor: Editor, prepared: PreparedDocumentEnvelope, ): CwlEditorDocumentEnvelope { - editor.commands.setContent(prepared.documentNode, false); + editor.commands.setContent(prepared.documentNode, { emitUpdate: false }); if (!editor.state.doc.eq(prepared.documentNode)) { throw new DocumentEnvelopeRestoreError(); } diff --git a/src/extensions/SafeClipboardExtension.test.ts b/src/extensions/SafeClipboardExtension.test.ts index 6932326a1..4558341a7 100644 --- a/src/extensions/SafeClipboardExtension.test.ts +++ b/src/extensions/SafeClipboardExtension.test.ts @@ -30,7 +30,7 @@ function transformFromExtension( return transform.call(plugin, html, {} as never); } -describe('SafeClipboard TipTap v2 adapter', () => { +describe('SafeClipboard TipTap v3 adapter', () => { it('runs last in the real ProseMirror transform chain', () => { const competingTransform = Extension.create({ name: 'competingPasteTransform', diff --git a/src/extensions/SafeClipboardExtension.ts b/src/extensions/SafeClipboardExtension.ts index 4778313ad..6a914b9e9 100644 --- a/src/extensions/SafeClipboardExtension.ts +++ b/src/extensions/SafeClipboardExtension.ts @@ -1,5 +1,5 @@ /** - * TipTap v2 adapter that installs Inkspan's SafeClipboard policy in the actual + * TipTap v3 adapter that installs Inkspan's SafeClipboard policy in the actual * ProseMirror HTML-paste transform chain used before clipboard parsing. */ import { Extension } from '@tiptap/core'; @@ -18,7 +18,7 @@ const SAFE_CLIPBOARD_PRIORITY = -1_000_000; /** ProseMirror plugin key for the rich-clipboard pre-parse safety boundary. */ export const safeClipboardPluginKey = new PluginKey('cwlSafeClipboard'); -/** Options held by the TipTap v2 SafeClipboard extension adapter. */ +/** Options held by the TipTap v3 SafeClipboard extension adapter. */ export interface SafeClipboardOptions { /** Maximum UTF-8 bytes accepted when no nested config object is supplied. */ maxHtmlBytes: number; @@ -69,11 +69,11 @@ function transformPastedClipboardHtml( } /** - * Shared TipTap v2 extension that sanitizes rich HTML in ProseMirror's real + * Shared TipTap v3 extension that sanitizes rich HTML in ProseMirror's real * `transformPastedHTML` pipeline before the browser fragment is parsed. * * The deliberately low priority places this plugin after ordinary host - * transforms in TipTap v2's plugin order, making sanitization the final + * transforms in TipTap v3's plugin order, making sanitization the final * supported HTML transform before ProseMirror parsing. */ export const SafeClipboard = Extension.create({ diff --git a/src/extensions/kit.ts b/src/extensions/kit.ts index 71554bc28..8efbbf32a 100644 --- a/src/extensions/kit.ts +++ b/src/extensions/kit.ts @@ -3,11 +3,8 @@ * Kept separate from React so hosts may reuse it in headless workflows. */ import StarterKit from '@tiptap/starter-kit'; -import Placeholder from '@tiptap/extension-placeholder'; -import Table from '@tiptap/extension-table'; -import TableRow from '@tiptap/extension-table-row'; -import TableHeader from '@tiptap/extension-table-header'; -import TableCell from '@tiptap/extension-table-cell'; +import { Placeholder } from '@tiptap/extensions'; +import { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table'; import type { Extensions } from '@tiptap/react'; import { Base64Image } from './Base64Image.js'; import type { @@ -43,12 +40,16 @@ export function buildExtensions( ): Extensions { const image = options.image ?? {}; const historyConfiguration = options.disableHistory - ? { history: false as const } + ? { undoRedo: false as const } : {}; return [ StarterKit.configure({ heading: { levels: [1, 2, 3, 4, 5, 6] }, + link: false, + listKeymap: false, + underline: false, + trailingNode: false, codeBlock: { HTMLAttributes: { class: 'cwl-code-block' }, }, diff --git a/src/index.ts b/src/index.ts index ca2fabe4b..ff676baad 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ /** * @contextualwisdomlab/cwl-editor * - * Commercial-grade Markdown + HTML WYSIWYG editor built on TipTap v2 + * Commercial-grade Markdown + HTML WYSIWYG editor built on TipTap v3 * (ProseMirror, MIT), with inline base64 images and a standalone base64 * converter. * diff --git a/src/tiptapV2ClipboardAdapterDocumentation.test.ts b/src/tiptapV2ClipboardAdapterDocumentation.test.ts index aff38963a..faae00206 100644 --- a/src/tiptapV2ClipboardAdapterDocumentation.test.ts +++ b/src/tiptapV2ClipboardAdapterDocumentation.test.ts @@ -5,6 +5,8 @@ const doctoringPath = 'docs/doctoring/tiptap-v2-prosemirror-paste-adapter.md'; const adapterPath = 'src/extensions/SafeClipboardExtension.ts'; const kitPath = 'src/extensions/kit.ts'; const lockPath = 'pnpm-lock.yaml'; +const workspacePath = 'pnpm-workspace.yaml'; +const reactPatchPath = 'patches/@tiptap__react@3.30.4.patch'; const changelogPath = 'CHANGELOG.md'; /** Read one authoritative repository artifact for deterministic contract tests. */ @@ -12,17 +14,22 @@ function readRepositoryText(path: string): string { return readFileSync(path, 'utf8'); } -describe('TipTap v2 SafeClipboard adapter doctoring', () => { +describe('TipTap SafeClipboard adapter doctoring', () => { it('records the locked-version root cause and actual ProseMirror registration path', () => { const doctoring = readRepositoryText(doctoringPath); const adapter = readRepositoryText(adapterPath); const kit = readRepositoryText(kitPath); const lock = readRepositoryText(lockPath); + const workspace = readRepositoryText(workspacePath); + const reactPatch = readRepositoryText(reactPatchPath); const changelog = readRepositoryText(changelogPath); expect(lock).toContain("'@tiptap/core':"); - expect(lock).toContain('version: 2.27.2'); - expect(doctoring).toContain('@tiptap/core 2.27.2'); + expect(lock).toContain('specifier: 3.30.4'); + expect(doctoring).toContain('TipTap 3.30.4 package family'); + expect(doctoring).toContain('packed strict-TypeScript consumer check'); + expect(workspace).toContain("'@tiptap/react@3.30.4':"); + expect(reactPatch).toContain('EditorStateSnapshot'); expect(doctoring).toContain('addProseMirrorPlugins'); expect(doctoring).toContain('transformPastedHTML'); expect(doctoring).toContain('before ProseMirror parses'); diff --git a/tests/browser/harness.ts b/tests/browser/harness.ts index c00b47a7d..c4ca1059f 100644 --- a/tests/browser/harness.ts +++ b/tests/browser/harness.ts @@ -59,7 +59,7 @@ window.runInkspanClipboardProbe = ( return Object.freeze({ sanitizedHtml, documentJson: null, errorCode }); } - editor.commands.setContent(sanitizedHtml, false); + editor.commands.setContent(sanitizedHtml, { emitUpdate: false }); return Object.freeze({ sanitizedHtml, documentJson: editor.getJSON(),