From d24e3d0a193202aa98acf908ed40bd1805601e68 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 5 Jul 2026 16:23:40 +0000 Subject: [PATCH 1/2] [Release] Version packages (beta) --- .changeset/pre.json | 13 +- packages/browser/CHANGELOG.md | 7 + packages/browser/package.json | 2 +- packages/yjs/CHANGELOG.md | 7 + packages/yjs/package.json | 2 +- pnpm-lock.yaml | 514 ++-------------------------------- 6 files changed, 55 insertions(+), 490 deletions(-) create mode 100644 packages/browser/CHANGELOG.md create mode 100644 packages/yjs/CHANGELOG.md diff --git a/.changeset/pre.json b/.changeset/pre.json index 63447c6f0a..e116deb09d 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -56,7 +56,14 @@ "@udecode/react-utils": "52.3.4", "@udecode/utils": "52.3.4", "@platejs/utils": "53.1.2", - "@platejs/yjs": "53.2.0" + "@platejs/yjs": "53.2.0", + "plite": "0.0.0-private", + "@platejs/browser": "54.0.0-beta.0", + "@platejs/plite-dom": "54.0.0-beta.0", + "@platejs/plite-history": "54.0.0-beta.0", + "@platejs/plite-hyperscript": "54.0.0-beta.0", + "@platejs/plite-layout": "54.0.0-beta.0", + "@platejs/plite-react": "54.0.0-beta.0" }, "changesets": [ "auto-main-to-next-sync-platejs-ai", @@ -64,7 +71,9 @@ "auto-main-to-next-sync-platejs-markdown", "auto-main-to-next-sync-platejs-utils", "auto-main-to-next-sync-platejs", + "plite-yjs-attribute-keys", "prepare-v54-beta-core", - "prepare-v54-beta-plite" + "prepare-v54-beta-plite", + "slate-browser-proof-lane" ] } diff --git a/packages/browser/CHANGELOG.md b/packages/browser/CHANGELOG.md new file mode 100644 index 0000000000..6627b6f3c9 --- /dev/null +++ b/packages/browser/CHANGELOG.md @@ -0,0 +1,7 @@ +# @platejs/browser + +## 54.0.0-beta.2 + +### Patch Changes + +- [#5036](https://github.com/udecode/plate/pull/5036) by [@zbeyens](https://github.com/zbeyens) – Make `@platejs/browser/playwright` the first-party Playwright proof surface, including low-level editable, block, text, and browser-handle helpers. diff --git a/packages/browser/package.json b/packages/browser/package.json index 1a578daa1f..82dfc97b1a 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,6 +1,6 @@ { "name": "@platejs/browser", - "version": "54.0.0-beta.0", + "version": "54.0.0-beta.2", "description": "Browser proof harness for Plite editors.", "keywords": [ "browser", diff --git a/packages/yjs/CHANGELOG.md b/packages/yjs/CHANGELOG.md new file mode 100644 index 0000000000..0acc626313 --- /dev/null +++ b/packages/yjs/CHANGELOG.md @@ -0,0 +1,7 @@ +# @platejs/yjs + +## 54.0.0-beta.2 + +### Major Changes + +- [#5036](https://github.com/udecode/plate/pull/5036) by [@zbeyens](https://github.com/zbeyens) – Use Plite-owned Yjs metadata keys for serialized adapter state. diff --git a/packages/yjs/package.json b/packages/yjs/package.json index c122f3db94..4916d6b88c 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -1,6 +1,6 @@ { "name": "@platejs/yjs", - "version": "54.0.0-beta.0", + "version": "54.0.0-beta.2", "description": "Yjs collaboration bindings for Plite.", "keywords": [ "collaboration", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84ec4ea485..c356411296 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,7 +1,7 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: true + autoInstallPeers: false excludeLinksFromLockfile: false importers: @@ -545,7 +545,7 @@ importers: version: 1.2.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@slate-yjs/react': specifier: 1.1.0 - version: 1.1.0(@slate-yjs/core@1.0.2(slate@0.124.1)(yjs@13.6.30))(react@19.2.4)(slate-react@0.124.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(slate-dom@0.124.1(slate@0.124.1))(slate@0.124.1))(slate@0.124.1)(yjs@13.6.30) + version: 1.1.0(react@19.2.4)(slate-react@0.124.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(slate-dom@0.124.1(slate@0.124.1))(slate@0.124.1))(slate@0.124.1)(yjs@13.6.30) '@tabler/icons-react': specifier: 3.34.0 version: 3.34.0(react@19.2.4) @@ -596,10 +596,10 @@ importers: version: 16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.7)(lucide-react@0.514.0(react@19.2.4))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.61) fumadocs-mdx: specifier: 15.0.10 - version: 15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.7)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.7)(lucide-react@0.514.0(react@19.2.4))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.61))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(rolldown@1.0.0-beta.51)(vite@7.3.5(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.89.2)(tsx@4.20.1)(yaml@2.9.0)) + version: 15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.7)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.7)(lucide-react@0.514.0(react@19.2.4))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.61))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(vite@7.3.5(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.89.2)(tsx@4.20.1)(yaml@2.9.0)) fumadocs-typescript: specifier: 5.2.6 - version: 5.2.6(a5de71877dc435aec29aa4e6e43abdf9) + version: 5.2.6(lbh3kslnc5elzex46od55gmy6u) fumadocs-ui: specifier: 16.9.3 version: 16.9.3(@tailwindcss/oxide@4.1.8)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.7)(lucide-react@0.514.0(react@19.2.4))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.61))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.8) @@ -874,25 +874,19 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@ai-sdk/react': specifier: ^3.0.0 - version: 3.0.118(react@19.2.4)(zod@4.1.12) + version: 3.0.118(react@19.2.4)(zod@4.4.3) '@plate/scripts': specifier: workspace:* version: link:../plate-scripts ai: specifier: ^6.0.0 - version: 6.0.116(zod@4.1.12) + version: 6.0.116(zod@4.4.3) platejs: specifier: workspace:^ version: link:../plate @@ -911,15 +905,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -933,15 +921,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -979,15 +961,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1001,15 +977,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) react-textarea-autosize: specifier: ^8.5.9 version: 8.5.9(@types/react@19.2.7)(react@19.2.4) @@ -1026,15 +996,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1059,7 +1023,7 @@ importers: version: link:../plite '@uiw/react-codemirror': specifier: 4.25.4 - version: 4.25.4(@babel/runtime@7.28.6)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.16)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 4.25.4(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.16)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) flowchart.js: specifier: ^1.15.0 version: 1.18.0 @@ -1072,15 +1036,9 @@ importers: plantuml-encoder: specifier: ^1.4.0 version: 1.4.0 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) viz.js: specifier: ^2.1.2 version: 2.1.2 @@ -1106,15 +1064,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1131,15 +1083,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1201,15 +1147,9 @@ importers: optics-ts: specifier: 2.4.1 version: 2.4.1 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) use-deep-compare: specifier: ^1.3.0 version: 1.3.0(react@19.2.4) @@ -1235,15 +1175,9 @@ importers: papaparse: specifier: ^5.5.3 version: 5.5.3 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1260,15 +1194,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1282,15 +1210,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1310,15 +1232,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1338,21 +1254,9 @@ importers: raf: specifier: ^3.4.1 version: 3.4.1 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dnd: - specifier: '>=14.0.0' - version: 16.0.1(@types/node@24.12.0)(@types/react@19.2.7)(react@19.2.4) - react-dnd-html5-backend: - specifier: '>=14.0.0' - version: 16.0.1 - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1363,15 +1267,9 @@ importers: packages/docx: dependencies: - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) validator: specifier: ^13.15.15 version: 13.15.26 @@ -1385,12 +1283,6 @@ importers: packages/docx-io: dependencies: - '@platejs/docx': - specifier: '>=54.0.0-beta.0' - version: 54.0.0-beta.0(platejs@packages+plate)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@platejs/markdown': - specifier: '>=54.0.0-beta.0' - version: 54.0.0-beta.1(platejs@packages+plate)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2) color-name: specifier: ^2.0.0 version: 2.1.0 @@ -1418,15 +1310,9 @@ importers: nanoid: specifier: ^5.0.9 version: 5.1.6 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) validator: specifier: ^13.15.15 version: 13.15.26 @@ -1449,15 +1335,9 @@ importers: '@platejs/combobox': specifier: workspace:* version: link:../combobox - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@emoji-mart/data': specifier: ^1.2.1 @@ -1480,15 +1360,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1505,15 +1379,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1533,15 +1401,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1558,15 +1420,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1577,15 +1433,9 @@ importers: packages/indent: dependencies: - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1599,15 +1449,9 @@ importers: juice: specifier: ^11.0.1 version: 11.1.1 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1618,15 +1462,9 @@ importers: packages/layout: dependencies: - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1643,15 +1481,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1671,15 +1503,9 @@ importers: lodash: specifier: ^4.17.23 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1708,15 +1534,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1745,15 +1565,9 @@ importers: mdast-util-mdx: specifier: 3.0.0 version: 3.0.0 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) remark-mdx: specifier: ^3.1.0 version: 3.1.1 @@ -1809,15 +1623,9 @@ importers: katex: specifier: 0.16.22 version: 0.16.22 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1834,15 +1642,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1859,15 +1661,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -1896,15 +1692,9 @@ importers: '@udecode/utils': specifier: workspace:^ version: link:../udecode/utils - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2061,15 +1851,9 @@ importers: packages/resizable: dependencies: - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2086,15 +1870,9 @@ importers: copy-to-clipboard: specifier: ^3.3.3 version: 3.3.3 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2108,15 +1886,9 @@ importers: '@platejs/combobox': specifier: workspace:* version: link:../combobox - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2136,15 +1908,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2155,15 +1921,9 @@ importers: packages/tabbable: dependencies: - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) tabbable: specifier: ^6.2.0 version: 6.4.0 @@ -2186,15 +1946,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2211,15 +1965,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2243,15 +1991,9 @@ importers: '@platejs/plite': specifier: workspace:^ version: link:../plite - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2271,15 +2013,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2299,15 +2035,9 @@ importers: '@radix-ui/react-primitive': specifier: ^2.1.3 version: 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: - specifier: ^18 || ^19 || ^19.0.0-rc - version: 19.2.4 react-compiler-runtime: specifier: 1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: ^18 || ^19 || ^19.0.0-rc - version: 19.2.4(react@19.2.4) use-sync-external-store: specifier: ^1.5.0 version: 1.6.0(react@19.2.4) @@ -2324,21 +2054,9 @@ importers: '@udecode/react-utils': specifier: workspace:* version: link:../react-utils - class-variance-authority: - specifier: '>=0.7.0' - version: 0.7.1 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) - tailwind-merge: - specifier: '>=2.2.0' - version: 3.3.1 devDependencies: '@plate/scripts': specifier: workspace:* @@ -2374,15 +2092,9 @@ importers: packages/udecode/react-hotkeys: dependencies: - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2399,15 +2111,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2439,15 +2145,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.23 - react: - specifier: '>=18.0.0' - version: 19.2.4 react-compiler-runtime: specifier: ^1.0.0 version: 1.0.0(react@19.2.4) - react-dom: - specifier: '>=18.0.0' - version: 19.2.4(react@19.2.4) devDependencies: '@plate/scripts': specifier: workspace:* @@ -2704,28 +2404,24 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [musl] '@biomejs/cli-linux-arm64@2.5.0': resolution: {integrity: sha512-tl+LW8fdD96/xdeWtWwc82LIOc5CoY7N2AsogLTp5R4ECErYt+8Jl/N68ezN9vzSiqPTxw6vjcihoLPYKZHrlw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [glibc] '@biomejs/cli-linux-x64-musl@2.5.0': resolution: {integrity: sha512-+9hIcMngJ+yGUahXqZuZ8CoWKJE9SAZsFsM3QDvXpNsLbXZ9lqVzgBhOk/jTSYkOA0GLP9eu3teukqpLUojHMg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [musl] '@biomejs/cli-linux-x64@2.5.0': resolution: {integrity: sha512-zpEGf4RQbFEh8Vt7OmavLyyOzRbtcE9osCqrS1kfvt8jDvxwhKXLSf7n0ebr/ov0RJ9ssP+lhs6C8a9WwFvrQA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [glibc] '@biomejs/cli-win32-arm64@2.5.0': resolution: {integrity: sha512-jB0wAvTLI4itx5VidqVUejPQFhRUxiZ9l9FvZ26D5fl6t3qme+ZB4PD3bTSeL1vZ8NI2Rx/zj6H9zcESuGHKGw==} @@ -3528,105 +3224,89 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -3834,28 +3514,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@16.2.6': resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@16.2.6': resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@16.2.6': resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@16.2.6': resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} @@ -4027,42 +3703,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -4092,27 +3762,6 @@ packages: '@pdf-lib/upng@1.0.1': resolution: {integrity: sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==} - '@platejs/date@54.0.0-beta.0': - resolution: {integrity: sha512-vddUep39ClKCWn8PSYWWsLxig/uYIdRF83nz4iBydA03Trr+RbbAkOx4dPBnRnR3BGkZhBO5naGlU+2tfWpSMQ==} - peerDependencies: - platejs: '>=54.0.0-beta.0' - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@platejs/docx@54.0.0-beta.0': - resolution: {integrity: sha512-Kx7B8hUc3fkEQfiXYntxBdGfQye1RSQbwkrK8px40ShuttNPpufPBHkQXYDCq69GTaIozHB/W5GBryUEf0HpbA==} - peerDependencies: - platejs: '>=54.0.0-beta.0' - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@platejs/markdown@54.0.0-beta.1': - resolution: {integrity: sha512-hla87ckoIrnUC1VEZl1qcs8wLCgDKqHhq3u6EnFr0pEoHZ0c2/BgWTihlM+ltSn+I+ca3pX6WSDasl8BtoOXTQ==} - peerDependencies: - platejs: '>=54.0.0-beta.1' - react: '>=18.0.0' - react-dom: '>=18.0.0' - '@playwright/test@1.53.0': resolution: {integrity: sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==} engines: {node: '>=18'} @@ -5948,70 +5597,60 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.7': resolution: {integrity: sha512-TuUkeuEEPRyXMBbJ86NRhAiPNezxHW8merl3Om2HASA9Pl1rI+VZcTtsVQ6v/P0MDIFpSl0k0+tUUze9HIXyEw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': resolution: {integrity: sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.7': resolution: {integrity: sha512-G43ZElEvaby+YSOgrXfBgpeQv42LdS0ivFFYQufk2tBDWeBfzE/+ob5DmO8Izbyn4Y8k6GgLF11jFDYNnmU/3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.7': resolution: {integrity: sha512-Y48ShVxGE2zUTt0A0PR3grCLNxW4DWtAfe5lxf6L3uYEQujwo/LGuRogMsAtOJeYLCPTJo2i714LOdnK34cHpw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.7': resolution: {integrity: sha512-KU5DUYvX3qI8/TX6D3RA4awXi4Ge/1+M6Jqv7kRiUndpqoVGgD765xhV3Q6QvtABnYjLJenrWDl3S1B5U56ixA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': resolution: {integrity: sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-rc.7': resolution: {integrity: sha512-1THb6FdBkAEL12zvUue2bmK4W1+P+tz8Pgu5uEzq+xrtYa3iBzmmKNlyfUzCFNCqsPd8WJEQrYdLcw4iMW4AVw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': resolution: {integrity: sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-linux-x64-musl@1.0.0-rc.7': resolution: {integrity: sha512-12o73atFNWDgYnLyA52QEUn9AH8pHIe12W28cmqjyHt4bIEYRzMICvYVCPa2IQm6DJBvCBrEhD9K+ct4wr2hwg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': resolution: {integrity: sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==} @@ -6127,79 +5766,66 @@ packages: resolution: {integrity: sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.62.0': resolution: {integrity: sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.62.0': resolution: {integrity: sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.62.0': resolution: {integrity: sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.62.0': resolution: {integrity: sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.62.0': resolution: {integrity: sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.62.0': resolution: {integrity: sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.62.0': resolution: {integrity: sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.62.0': resolution: {integrity: sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.62.0': resolution: {integrity: sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.62.0': resolution: {integrity: sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.0': resolution: {integrity: sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.62.0': resolution: {integrity: sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.62.0': resolution: {integrity: sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==} @@ -6288,12 +5914,6 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@slate-yjs/core@1.0.2': - resolution: {integrity: sha512-X0hLFJbQu9c1ItWBaNuEn0pqcXYK76KCp8C4Gvy/VaTQVMo1VgAb2WiiJ0Je/AyuIYEPPSTNVOcyrGHwgA7e6Q==} - peerDependencies: - slate: '>=0.70.0' - yjs: ^13.5.29 - '@slate-yjs/react@1.1.0': resolution: {integrity: sha512-lGpEJLwThMPVZ+beqsoBowwBO2egu7K8ow+TOM4k2Liz9/dD1H9/ZNrdfZkPVSYT9NmgFm4dYc187t5GC4Wd6g==} peerDependencies: @@ -6338,28 +5958,24 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.12.0': resolution: {integrity: sha512-OeFHz/5Hl9v75J9TYA5jQxNIYAZMqaiPpd9dYSTK2Xyqa/ZGgTtNyPhIwVfxx+9mHBf6+9c1mTlXUtACMtHmaQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.12.0': resolution: {integrity: sha512-ltIvqNi7H0c5pRawyqjeYSKEIfZP4vv/datT3mwT6BW7muJtd1+KIDCPFLMIQ4wm/h76YQwPocsin3fzmnFdNA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.12.0': resolution: {integrity: sha512-Z/DhpjehaTK0uf+MhNB7mV9SuewpGs3P/q9/8+UsJeYoFr7yuOoPbAvrD6AqZkf6Bh7MRZ5OtG+KQgG5L+goiA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.12.0': resolution: {integrity: sha512-wHnvbfHIh2gfSbvuFT7qP97YCMUDh+fuiso+pcC6ug8IsMxuViNapHET4o0ZdFNWHhXJ7/s0e6w7mkOalsqQiQ==} @@ -6450,28 +6066,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.8': resolution: {integrity: sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.8': resolution: {integrity: sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.8': resolution: {integrity: sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.8': resolution: {integrity: sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg==} @@ -6900,23 +6512,12 @@ packages: '@uiw/codemirror-extensions-basic-setup@4.25.4': resolution: {integrity: sha512-YzNwkm0AbPv1EXhCHYR5v0nqfemG2jEB0Z3Att4rBYqKrlG7AA9Rhjc3IyBaOzsBu18wtrp9/+uhTyu7TXSRng==} - peerDependencies: - '@codemirror/autocomplete': '>=6.0.0' - '@codemirror/commands': '>=6.0.0' - '@codemirror/language': '>=6.0.0' - '@codemirror/lint': '>=6.0.0' - '@codemirror/search': '>=6.0.0' - '@codemirror/state': '>=6.0.0' - '@codemirror/view': '>=6.0.0' '@uiw/react-codemirror@4.25.4': resolution: {integrity: sha512-ipO067oyfUw+DVaXhQCxkB0ZD9b7RnY+ByrprSYSKCHaULvJ3sqWYC/Zen6zVQ8/XC4o5EPBfatGiX20kC7XGA==} peerDependencies: - '@babel/runtime': '>=7.11.0' - '@codemirror/state': '>=6.0.0' '@codemirror/theme-one-dark': '>=6.0.0' '@codemirror/view': '>=6.0.0' - codemirror: '>=6.0.0' react: '>=17.0.0' react-dom: '>=17.0.0' @@ -7045,11 +6646,6 @@ packages: ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} @@ -7338,7 +6934,6 @@ packages: bun@1.3.12: resolution: {integrity: sha512-KLwDUqs5WIny/94F4xZ4QfaAE6YWyjR+s79pt/ItQhk2CG+PJQ5xL6VuOWhiyN2eP3fryZK95vog9CTLCaYV2Q==} - cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -9613,28 +9208,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.30.1: resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.30.1: resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.30.1: resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.30.1: resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} @@ -12761,12 +12352,12 @@ snapshots: '@vercel/oidc': 3.1.0 zod: 3.25.61 - '@ai-sdk/gateway@3.0.66(zod@4.1.12)': + '@ai-sdk/gateway@3.0.66(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@4.1.12) + '@ai-sdk/provider-utils': 4.0.19(zod@4.4.3) '@vercel/oidc': 3.1.0 - zod: 4.1.12 + zod: 4.4.3 '@ai-sdk/google@3.0.43(zod@3.25.61)': dependencies: @@ -12787,12 +12378,12 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.61 - '@ai-sdk/provider-utils@4.0.19(zod@4.1.12)': + '@ai-sdk/provider-utils@4.0.19(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 - zod: 4.1.12 + zod: 4.4.3 '@ai-sdk/provider@3.0.8': dependencies: @@ -12808,10 +12399,10 @@ snapshots: transitivePeerDependencies: - zod - '@ai-sdk/react@3.0.118(react@19.2.4)(zod@4.1.12)': + '@ai-sdk/react@3.0.118(react@19.2.4)(zod@4.4.3)': dependencies: - '@ai-sdk/provider-utils': 4.0.19(zod@4.1.12) - ai: 6.0.116(zod@4.1.12) + '@ai-sdk/provider-utils': 4.0.19(zod@4.4.3) + ai: 6.0.116(zod@4.4.3) react: 19.2.4 swr: 2.4.1(react@19.2.4) throttleit: 2.1.0 @@ -14047,7 +13638,7 @@ snapshots: dependencies: '@hono/node-server': 1.19.11(hono@4.12.5) ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) + ajv-formats: 3.0.1 content-type: 1.0.5 cors: 2.8.6 cross-spawn: 7.0.6 @@ -14289,42 +13880,6 @@ snapshots: dependencies: pako: 1.0.11 - '@platejs/date@54.0.0-beta.0(platejs@packages+plate)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - platejs: link:packages/plate - react: 19.2.4 - react-compiler-runtime: 1.0.0(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - - '@platejs/docx@54.0.0-beta.0(platejs@packages+plate)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - platejs: link:packages/plate - react: 19.2.4 - react-compiler-runtime: 1.0.0(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - validator: 13.15.26 - - '@platejs/markdown@54.0.0-beta.1(platejs@packages+plate)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)': - dependencies: - '@platejs/date': 54.0.0-beta.0(platejs@packages+plate)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - lodash: 4.17.23 - marked: 15.0.12 - mdast-util-math: 3.0.0 - mdast-util-mdx: 3.0.0 - platejs: link:packages/plate - react: 19.2.4 - react-compiler-runtime: 1.0.0(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - remark-mdx: 3.1.1 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - ts-essentials: 10.1.0(typescript@6.0.2) - unified: 11.0.5 - unist-util-visit: 5.0.0 - transitivePeerDependencies: - - supports-color - - typescript - '@playwright/test@1.53.0': dependencies: playwright: 1.53.0 @@ -16485,15 +16040,8 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@slate-yjs/core@1.0.2(slate@0.124.1)(yjs@13.6.30)': - dependencies: - slate: 0.124.1 - y-protocols: 1.0.7(yjs@13.6.30) - yjs: 13.6.30 - - '@slate-yjs/react@1.1.0(@slate-yjs/core@1.0.2(slate@0.124.1)(yjs@13.6.30))(react@19.2.4)(slate-react@0.124.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(slate-dom@0.124.1(slate@0.124.1))(slate@0.124.1))(slate@0.124.1)(yjs@13.6.30)': + '@slate-yjs/react@1.1.0(react@19.2.4)(slate-react@0.124.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(slate-dom@0.124.1(slate@0.124.1))(slate@0.124.1))(slate@0.124.1)(yjs@13.6.30)': dependencies: - '@slate-yjs/core': 1.0.2(slate@0.124.1)(yjs@13.6.30) react: 19.2.4 slate: 0.124.1 slate-react: 0.124.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(slate-dom@0.124.1(slate@0.124.1))(slate@0.124.1) @@ -17118,7 +16666,7 @@ snapshots: '@typescript-eslint/types': 8.56.1 eslint-visitor-keys: 5.0.1 - '@uiw/codemirror-extensions-basic-setup@4.25.4(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.2)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/view@6.39.16)': + '@uiw/codemirror-extensions-basic-setup@4.25.4': dependencies: '@codemirror/autocomplete': 6.20.1 '@codemirror/commands': 6.10.2 @@ -17128,22 +16676,17 @@ snapshots: '@codemirror/state': 6.5.4 '@codemirror/view': 6.39.16 - '@uiw/react-codemirror@4.25.4(@babel/runtime@7.28.6)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.16)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@uiw/react-codemirror@4.25.4(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.16)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 '@codemirror/commands': 6.10.2 '@codemirror/state': 6.5.4 '@codemirror/theme-one-dark': 6.1.3 '@codemirror/view': 6.39.16 - '@uiw/codemirror-extensions-basic-setup': 4.25.4(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.2)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/view@6.39.16) + '@uiw/codemirror-extensions-basic-setup': 4.25.4 codemirror: 6.0.2 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@codemirror/autocomplete' - - '@codemirror/language' - - '@codemirror/lint' - - '@codemirror/search' '@ungap/structured-clone@1.3.0': {} @@ -17287,16 +16830,16 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.61 - ai@6.0.116(zod@4.1.12): + ai@6.0.116(zod@4.4.3): dependencies: - '@ai-sdk/gateway': 3.0.66(zod@4.1.12) + '@ai-sdk/gateway': 3.0.66(zod@4.4.3) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@4.1.12) + '@ai-sdk/provider-utils': 4.0.19(zod@4.4.3) '@opentelemetry/api': 1.9.0 - zod: 4.1.12 + zod: 4.4.3 - ajv-formats@3.0.1(ajv@8.18.0): - optionalDependencies: + ajv-formats@3.0.1: + dependencies: ajv: 8.18.0 ajv@6.14.0: @@ -19108,7 +18651,7 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.7)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.7)(lucide-react@0.514.0(react@19.2.4))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.61))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(rolldown@1.0.0-beta.51)(vite@7.3.5(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.89.2)(tsx@4.20.1)(yaml@2.9.0)): + fumadocs-mdx@15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.7)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.7)(lucide-react@0.514.0(react@19.2.4))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.61))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(vite@7.3.5(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.89.2)(tsx@4.20.1)(yaml@2.9.0)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 @@ -19133,12 +18676,11 @@ snapshots: '@types/react': 19.2.7 next: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2) react: 19.2.4 - rolldown: 1.0.0-beta.51 vite: 7.3.5(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.89.2)(tsx@4.20.1)(yaml@2.9.0) transitivePeerDependencies: - supports-color - fumadocs-typescript@5.2.6(a5de71877dc435aec29aa4e6e43abdf9): + fumadocs-typescript@5.2.6(lbh3kslnc5elzex46od55gmy6u): dependencies: estree-util-value-to-estree: 3.5.0 fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.7)(lucide-react@0.514.0(react@19.2.4))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.61) From ddf484b6d6f87d6a98642a265f5665f84d8b1364 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 5 Jul 2026 16:23:45 +0000 Subject: [PATCH 2/2] [Release] Sync release docs --- apps/www/src/generated/release-index.json | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/www/src/generated/release-index.json b/apps/www/src/generated/release-index.json index f8dd66383c..554472a3c3 100644 --- a/apps/www/src/generated/release-index.json +++ b/apps/www/src/generated/release-index.json @@ -1,7 +1,24 @@ [ + { + "changelogUrl": "https://github.com/udecode/plate/blob/main/packages/yjs/CHANGELOG.md", + "content": "`@platejs/yjs`\n\n### Breaking Changes\n\n- Use Plite-owned Yjs metadata keys for serialized adapter state. ([#5036](https://github.com/udecode/plate/pull/5036))\n\n`@platejs/browser`\n\n### Bug Fixes\n\n- Make `@platejs/browser/playwright` the first-party Playwright proof surface, including low-level editable, block, text, and browser-handle helpers. ([#5036](https://github.com/udecode/plate/pull/5036))\n\n[`CHANGELOG`](https://github.com/udecode/plate/pull/5038) · [`v54.0.0-beta.0...v54.0.0-beta.2`](https://github.com/udecode/plate/compare/platejs%4054.0.0-beta.0...%40platejs%2Fyjs%4054.0.0-beta.2) · By [@zbeyens](https://github.com/zbeyens)", + "contributors": [ + { + "url": "https://github.com/zbeyens", + "username": "@zbeyens" + } + ], + "date": "2026-07-05", + "packageTag": "@platejs/yjs@54.0.0-beta.2", + "tag": "v54.0.0-beta.2", + "title": "v54.0.0-beta.2", + "type": "major", + "versionPackagePrUrl": "https://github.com/udecode/plate/pull/5038", + "url": "https://github.com/udecode/plate/pull/5038" + }, { "changelogUrl": "https://github.com/udecode/plate/blob/main/packages/plate/CHANGELOG.md", - "content": "`@platejs/core`\n\n### Breaking Changes\n\n- Prepare v54 beta prerelease versioning. ([#5031](https://github.com/udecode/plate/pull/5031))\n\n`@platejs/plite`\n\n### Breaking Changes\n\n- Prepare v54 beta prerelease versioning for Plite. ([#5031](https://github.com/udecode/plate/pull/5031))\n\n[`CHANGELOG`](https://github.com/udecode/plate/pull/5033) · [`v53.2.0...v54.0.0-beta.0`](https://github.com/udecode/plate/compare/%40platejs%2Fyjs%4053.2.0...platejs%4054.0.0-beta.0) · By [@felixfeng33](https://github.com/felixfeng33)", + "content": "`@platejs/core`\n\n### Breaking Changes\n\n- Prepare v54 beta prerelease versioning. ([#5031](https://github.com/udecode/plate/pull/5031))\n\n`@platejs/plite`\n\n### Breaking Changes\n\n- Prepare v54 beta prerelease versioning for Plite. ([#5031](https://github.com/udecode/plate/pull/5031))\n\n[`v53.2.2...v54.0.0-beta.0`](https://github.com/udecode/plate/compare/v53.2.2...v54.0.0-beta.0) · By [@felixfeng33](https://github.com/felixfeng33)", "contributors": [ { "url": "https://github.com/felixfeng33", @@ -14,7 +31,7 @@ "title": "v54.0.0-beta.0", "type": "major", "versionPackagePrUrl": "https://github.com/udecode/plate/pull/5033", - "url": "https://github.com/udecode/plate/pull/5033" + "url": "https://github.com/udecode/plate/releases/tag/v54.0.0-beta.0" }, { "changelogUrl": "https://github.com/udecode/plate/blob/1ea6fcb03d5daa068a346b1b12719b4b2ad0b053/packages/ai/CHANGELOG.md", @@ -2574,7 +2591,7 @@ }, { "changelogUrl": "https://github.com/udecode/plate/blob/605ba3c65afa8c31c1af84e5b0828a3a5242943b/packages/ai/CHANGELOG.md", - "content": "`@udecode/plate-ai`\n\n### Breaking Changes\n\n- Copilot API method changes: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.api.copilot.accept` is now `editor.tf.copilot.accept`.\n - `editor.api.copilot.acceptNextWord` is now `editor.tf.copilot.acceptNextWord`.\n - `editor.api.copilot.reset` is now `editor.api.copilot.reject`.\n- Removed Default Shortcuts for Copilot:\n - Only `accept` (Tab) and `reject` (Escape) shortcuts are included by default for `CopilotPlugin`.\n - `acceptNextWord` and `triggerSuggestion` shortcuts must now be configured manually using the `shortcuts` field when configuring the plugin.\n - Example:\n ```tsx\n CopilotPlugin.configure({\n // ... other options\n shortcuts: {\n acceptNextWord: {\n keys: 'mod+right',\n },\n triggerSuggestion: {\n keys: 'ctrl+space',\n },\n },\n });\n ```\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-alignment`\n\n### Breaking Changes\n\n- Package `@udecode/plate-alignment` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - `TextAlignPlugin` (formerly `AlignPlugin`) has been moved to the `@platejs/basic-styles` package.\n\n - Migration:\n\n - Remove `@udecode/plate-alignment` from your dependencies.\n - Add `@platejs/basic-styles` to your dependencies if not already present.\n - Import `TextAlignPlugin` from `@platejs/basic-styles/react`.\n\n - Renamed `AlignPlugin` to `TextAlignPlugin` and changed plugin key from `'align'` to `'textAlign'`.\n\n ```ts\n // Before\n import { AlignPlugin } from '@udecode/plate-alignment/react';\n\n // After\n import { TextAlignPlugin } from '@platejs/basic-styles/react';\n ```\n\n - `setAlign` signature change:\n\n ```ts\n // Before\n setAlign(editor, { value: 'center', setNodesOptions });\n\n // After\n setAlign(editor, 'center', setNodesOptions);\n ```\n\n - Removed `useAlignDropdownMenu` and `useAlignDropdownMenuState`. Use it in your own codebase, for example:\n\n ```tsx\n export function AlignToolbarButton() {\n const editor = useEditorRef();\n const value = useSelectionFragmentProp({\n defaultValue: 'start',\n structuralTypes,\n getProp: (node) => node.align,\n });\n\n const onValueChange = (newValue: string) => {\n editor.tf.textAlign.setNodes(newValue as Alignment);\n editor.tf.focus();\n };\n\n // ...\n }\n ```\n\n### Features\n\n- New transform method to `AlignPlugin`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.tf.textAlign.setNodes` - Transform method for setting alignment values. Alias to `setAlign`\n\n`@udecode/plate-autoformat`\n\n### Breaking Changes\n\n- Replaced `BaseAutoformatPlugin` with `AutoformatPlugin`, which is no longer a React plugin. Migration: Replace `@udecode/plate-autoformat/react` import with `@udecode/plate-autoformat`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-basic-elements`\n\n### Breaking Changes\n\n- Package `@udecode/plate-basic-elements` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `BasicElementsPlugin` has been renamed to `BasicBlocksPlugin`.\n- Its plugins have been moved to the new `@platejs/basic-nodes` package.\n- Migration:\n - Replace `@udecode/plate-basic-elements` with `@platejs/basic-nodes` in your dependencies.\n - Update import paths from `@udecode/plate-basic-elements/react` to `@platejs/basic-nodes/react`.\n - For detailed changes to individual plugins, default HTML tags, and shortcut configurations, refer to the changeset for `@platejs/basic-nodes`.\n\n`@udecode/plate-basic-marks`\n\n### Breaking Changes\n\n- Package `@udecode/plate-basic-marks` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Its plugins have been moved to the new `@platejs/basic-nodes` package.\n- Migration:\n - Replace `@udecode/plate-basic-marks` with `@platejs/basic-nodes` in your dependencies.\n - Update import paths from `@udecode/plate-basic-marks/react` to `@platejs/basic-nodes/react`.\n - For detailed changes to individual plugins, default HTML tags, and shortcut configurations, refer to the changeset for `@platejs/basic-nodes`.\n\n`@udecode/plate-basic-nodes`\n\n### Breaking Changes\n\n- The packages `@udecode/plate-basic-elements` and `@udecode/plate-basic-marks` have been deprecated. All their plugins are now consolidated into the new `@platejs/basic-nodes` package. ([#4327](https://github.com/udecode/plate/pull/4327))\n- **Migration**:\n - Replace `@udecode/plate-basic-elements` and `@udecode/plate-basic-marks` in your dependencies with `@platejs/basic-nodes`.\n - Update all import paths from `@udecode/plate-basic-elements/react` or `@udecode/plate-basic-marks/react` to `@platejs/basic-nodes/react`.\n - `CodeBlockPlugin` is **not** part of `@platejs/basic-nodes`. Ensure it is imported from `@platejs/code-block/react`.\n- `SkipMarkPlugin` (standalone) is removed. Its functionality is now built into the core editor. To enable boundary clearing for a specific mark, configure the mark plugin directly: `plugin.configure({ rules: { selection: { affinity: 'outward' } } })`.\n- Default HTML Tag Changes:\n - **Blocks**: Element plugins in `@udecode/plate-basic-nodes` (e.g., `BlockquotePlugin`, `HeadingPlugin`, `HorizontalRulePlugin`) now default to rendering with specific HTML tags (`
`, `-
`, `
` respectively). `ParagraphPlugin` still defaults to ``. If you relied on previous defaults or need different tags, provide a custom component or use the `render.as` option.\n - **Marks**: Mark plugins in `@udecode/plate-basic-nodes` (e.g., `BoldPlugin`, `CodePlugin`, `ItalicPlugin`) now default to specific HTML tags (``, ``, `` respectively). If you relied on previous defaults or need different tags, provide a custom component or use the `render.as` option.\n- Removed Default Shortcuts:\n - Default keyboard shortcuts are no longer bundled with most plugins (exceptions: bold, italic, underline).\n - Configure shortcuts manually via the `shortcuts` field in plugin configuration.\n - Example (Block Plugins):\n ```ts\n H1Plugin.configure({ shortcuts: { toggle: { keys: 'mod+alt+1' } } });\n BlockquotePlugin.configure({\n shortcuts: { toggle: { keys: 'mod+shift+period' } },\n });\n ```\n - Example (Mark Plugins):\n ```ts\n CodePlugin.configure({ shortcuts: { toggle: { keys: 'mod+e' } } });\n StrikethroughPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+shift+x' } },\n });\n SubscriptPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+comma' } },\n });\n SuperscriptPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+period' } },\n });\n HighlightPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+shift+h' } },\n });\n ```\n\n### Features\n\n- New `toggle` Transforms Added: ([#4327](https://github.com/udecode/plate/pull/4327))\n - Block plugins with new `toggle` transforms: `BlockquotePlugin`, `H1Plugin`, `H2Plugin`, `H3Plugin`, `H4Plugin`, `H5Plugin`, `H6Plugin`.\n - All mark plugins in this package now also feature a `toggle` transform, including: `BoldPlugin`, `ItalicPlugin`, `UnderlinePlugin`, `CodePlugin`, `StrikethroughPlugin`, `SubscriptPlugin`, `SuperscriptPlugin`, `KbdPlugin`, `HighlightPlugin`.\n- Individual Heading Plugins Available:\n - `H1Plugin`, `H2Plugin`, `H3Plugin`, `H4Plugin`, `H5Plugin`, and `H6Plugin` offer a flexible alternative to the general `HeadingPlugin`, allowing granular control over heading level inclusion and configuration (e.g., custom components, shortcuts per level).\n- Plugin Consolidations into `@udecode/plate-basic-nodes`:\n - `KbdPlugin` (formerly from `@udecode/plate-kbd`).\n - `HighlightPlugin` (formerly from `@udecode/plate-highlight`).\n\n`@udecode/plate-block-quote`\n\n### Breaking Changes\n\n- Package `@udecode/plate-block-quote` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `BlockquotePlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-block-quote` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `BlockquotePlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-break`\n\n### Breaking Changes\n\n- Package `@udecode/plate-break` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `SoftBreakPlugin` has been removed. Migration:\n - For `shift+enter` rules: no migration is needed - this behavior is built into Plite by default.\n - For `enter` rules: use `plugin.configure({ rules: { break: { default: 'lineBreak' } } })` to insert a line break instead of a hard break on `Enter` keydown when the selection is within the configured node type.\n - For more complex break rules: use `overrideEditor` to override the `insertBreak` transform with custom logic.\n- `ExitBreakPlugin` has been moved to `@platejs/utils` (which is re-exported via `platejs`) with a simplified API and improved behavior.\n\n - **Behavior Change**: Instead of always exiting to the root level of the document, exiting will now insert a block to the nearest exitable ancestor that has `isStrictSiblings: false`. This means deeply nested structures (like tables in columns) are exitable at many levels.\n - Migration:\n\n - Remove `@udecode/plate-break` from your dependencies.\n - Replace `@udecode/plate-break` import with `platejs`.\n - **Important**: If not using Plate plugins, you must set `isStrictSiblings: true` on your custom node plugins that can't have paragraph siblings for exit break to work correctly.\n - Replace complex rule-based configuration with simple shortcuts:\n\n ```tsx\n // Before (old API)\n ExitBreakPlugin.configure({\n options: {\n rules: [\n { hotkey: 'mod+enter' },\n { hotkey: 'mod+shift+enter', before: true },\n ],\n },\n });\n\n // After (new API)\n ExitBreakPlugin.configure({\n shortcuts: {\n insert: { keys: 'mod+enter' },\n insertBefore: { keys: 'mod+shift+enter' },\n },\n });\n ```\n\n`@udecode/plate-callout`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-caption`\n\n### Breaking Changes\n\n- `CaptionPlugin` option `options.plugins` (accepting an array of `PlatePlugin`) has been renamed to `options.query.allow` (accepting an array of plugin keys). ([#4327](https://github.com/udecode/plate/pull/4327))\n- Migration:\n\n ```tsx\n // Before\n CaptionPlugin.configure({\n options: {\n plugins: [ImagePlugin], // ImagePlugin is an example\n },\n });\n\n // After\n CaptionPlugin.configure({\n options: {\n query: {\n allow: [ImagePlugin.key], // Use the plugin's key\n },\n },\n });\n ```\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-code-block`\n\n### Breaking Changes\n\n- `CodeBlockPlugin` now defaults to rendering the code block container with a `` HTML tag if no custom component is provided for `CodeBlockElement` (or the plugin key `code_block`). ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-combobox`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-comments`\n\n### Breaking Changes\n\n- `CommentsPlugin` has been renamed to `CommentPlugin`. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Update imports and plugin configurations accordingly.\n - Example: `CommentsPlugin.key` becomes `CommentPlugin.key`.\n- Package name has been changed to `@platejs/comment`.\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-core`\n\n### Breaking Changes\n\n- `editor.getType()` now takes a `pluginKey: string` instead of a `plugin: PlatePlugin` instance. ([#4327](https://github.com/udecode/plate/pull/4327))\n - Example: Use `editor.getType(ParagraphPlugin.key)` instead of `editor.getType(ParagraphPlugin)`.\n- Plugins without a `key` property will not be registered into the editor.\n- Passing `disabled: true` prop to `PlateContent` will now also set the editor to `readOnly: true` state internally.\n- Editor DOM state properties have been moved under `editor.dom` namespace:\n - `editor.currentKeyboardEvent` is now `editor.dom.currentKeyboardEvent`.\n - `editor.prevSelection` is now `editor.dom.prevSelection`.\n- Editor metadata properties have been moved under `editor.meta` namespace:\n - `editor.isFallback` is now `editor.meta.isFallback`\n - `editor.key` is now `editor.meta.key`\n - `editor.pluginList` is now `editor.meta.pluginList`\n - `editor.shortcuts` is now `editor.meta.shortcuts`\n - `editor.uid` is now `editor.meta.uid`\n- `NodeIdPlugin` is now enabled by default as part of the core plugins. This automatically assigns unique IDs to block nodes.\n - Migration: If you were not previously using `NodeIdPlugin` and wish to maintain the old behavior (no automatic IDs), explicitly disable it in your editor configuration:\n ```ts\n const editor = usePlateEditor({\n // ...other options\n nodeId: false, // Disables automatic node ID generation\n });\n ```\n- The `components` prop has been removed from `serializeHtml` and `PlateStatic`.\n - Migration: Pass the `components` to `createPliteEditor({ components })` or the individual plugins instead.\n- Plugin Shortcuts System Changes:\n - Shortcut keys defined in `editor.shortcuts` are now namespaced by the plugin key (e.g., `code.toggle` for `CodePlugin`).\n - The `priority` property for shortcuts is used to resolve conflicts when multiple shortcuts share the exact same key combination, not for overriding shortcuts by name.\n - `preventDefault` for plugin shortcuts now defaults to `true`, unless the handler returns `false` (i.e. not handled). This means browser default actions for these key combinations will be prevented unless explicitly allowed.\n - Migration: If you need to allow browser default behavior for a specific shortcut, set `preventDefault: false` in its configuration:\n ```ts\n MyPlugin.configure({\n shortcuts: {\n myAction: {\n keys: 'mod+s',\n preventDefault: false, // Example: Allow browser's default save dialog\n },\n },\n });\n ```\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n### Features\n\n- New editor DOM state fields available under `editor.dom`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.dom.composing`: Boolean, true if the editor is currently composing text (e.g., during IME input).\n - `editor.dom.focused`: Boolean, true if the editor currently has focus.\n - `editor.dom.readOnly`: Boolean, true if the editor is in read-only mode. Passing the `readOnly` prop to `PlateContent` will sync its value to this state and to the `useEditorReadOnly` hook.\n- New editor metadata fields:\n - `editor.meta.components` - stores the plugin components by key\n- New hook `useEditorComposing`: Allows subscription to the editor's composing state (`editor.dom.composing`) outside of `PlateContent`.\n- `createPlateEditor` and `usePlateEditor` now accept a `readOnly` option to initialize the editor in a read-only state. For dynamic read-only changes after initialization, continue to use the `readOnly` prop on the `` or ` ` component.\n- New plugin field: `editOnly` (boolean or object).\n - When `true` or when specific properties are true in the object, Plate will disable certain plugin behaviors (handlers, rendering, injections) in read-only mode and re-enable them if the editor becomes editable.\n - By default, `render`, `handlers`, and `inject` are considered edit-only (`true`). `normalizeInitialValue` defaults to always active (`false`).\n - Example: `editOnly: { render: false, normalizeInitialValue: true }` would make rendering active always, but normalization only in edit mode.\n- New plugin field: `render.as` (`keyof HTMLElementTagNameMap`).\n - Specifies the default HTML tag name to be used by `PlateElement` (default: `'div'`) or `PlateLeaf` (default: `'span'`) when rendering the node, but only if no custom `node.component` is provided for the plugin.\n - Example: `render: { as: 'h1' }` would make the plugin render its node as an ` ` tag by default without the need to provide a custom component.\n- New plugin field: `node.isContainer` (boolean).\n - When `true`, indicates that the plugin's elements are primarily containers for other content.\n- New plugin field: `node.isStrictSiblings` (boolean).\n - When `true`, indicates that the element enforces strict sibling type constraints and only allows specific siblings (e.g., `td` can only have `td` siblings, `column` can only have `column` siblings).\n - Used by `editor.tf.insertExitBreak` functionality to determine appropriate exit points in nested structures.\n- New plugin field: `rules` (object).\n - Configures common editing behaviors declaratively instead of overriding editor methods. See documentation for more details.\n - `rules.break`: Controls Enter key behavior (`empty`, `default`, `emptyLineEnd`, `splitReset`)\n - `rules.delete`: Controls Backspace key behavior (`start`, `empty`)\n - `rules.merge`: Controls block merging behavior (`removeEmpty`)\n - `rules.normalize`: Controls normalization behavior (`removeEmpty`)\n - `rules.selection`: Controls cursor positioning behavior (`affinity`)\n - `rules.match`: Conditional rule application based on node properties\n- Plugin shortcuts can now automatically leverage existing plugin transforms by specifying the transform name, in addition to custom handlers.\n- New editor transform methods for keyboard handling:\n - `editor.tf.escape`: Handle Escape key events. Returns `true` if the event is handled.\n - `editor.tf.moveLine`: Handle ArrowDown and ArrowUp key events with `reverse` option for direction. Returns `true` if the event is handled.\n - `editor.tf.selectAll`: Handle Ctrl/Cmd+A key events for selecting all content. Returns `true` if the event is handled.\n - `editor.tf.tab`: Handle Tab and Shift+Tab key events with `reverse` option for Shift+Tab. Returns `true` if the event is handled.\n\n### Bug Fixes\n\n- Fixed an issue where `editor.api` and `editor.tf` (transforms) were not consistently available in the props passed to default element components when no custom component was provided for a plugin. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-csv`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-cursor`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-date`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-diff`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-dnd`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-docx`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-emoji`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-excalidraw`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-find-replace`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-floating`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-font`\n\n### Breaking Changes\n\n- Removed `setBlockBackgroundColor` ([#4327](https://github.com/udecode/plate/pull/4327))\n- Removed `setFontSize` – use `tf.fontSize.addMark` instead:\n\n ```ts\n // Before\n editor.api.fontSize.addMark('16px');\n\n // After\n editor.tf.fontSize.addMark('16px');\n ```\n\n - Removed `useColorInput`. Use it in your own codebase, for example:\n\n ```tsx\n function ColorInput() {\n const inputRef = React.useRef
(null);\n\n const onClick = () => {\n inputRef.current?.click();\n };\n\n // ...\n }\n ```\n\n - Removed `useColorsCustom` and `useColorsCustomState`. Use it in your own codebase, for example:\n\n ```tsx\n function ColorCustom({ color, colors, customColors, updateCustomColor }) {\n const [customColor, setCustomColor] = React.useState ();\n const [value, setValue] = React.useState (color || '#000000');\n\n React.useEffect(() => {\n if (\n !color ||\n customColors.some((c) => c.value === color) ||\n colors.some((c) => c.value === color)\n ) {\n return;\n }\n\n setCustomColor(color);\n }, [color, colors, customColors]);\n\n const computedColors = React.useMemo(\n () =>\n customColor\n ? [\n ...customColors,\n {\n isBrightColor: false,\n name: '',\n value: customColor,\n },\n ]\n : customColors,\n [customColor, customColors]\n );\n\n const updateCustomColorDebounced = React.useCallback(\n debounce(updateCustomColor, 100),\n [updateCustomColor]\n );\n\n const inputProps = {\n value,\n onChange: (e: React.ChangeEvent ) => {\n setValue(e.target.value);\n updateCustomColorDebounced(e.target.value);\n },\n };\n\n // ...\n }\n ```\n\n - Removed `useColorDropdownMenu` and `useColorDropdownMenuState`. Use it in your own codebase, for example:\n\n ```tsx\n export function FontColorToolbarButton({ nodeType }) {\n const editor = useEditorRef();\n\n const selectionDefined = useEditorSelector(\n (editor) => !!editor.selection,\n []\n );\n\n const color = useEditorSelector(\n (editor) => editor.api.mark(nodeType) as string,\n [nodeType]\n );\n\n const [selectedColor, setSelectedColor] = React.useState ();\n const [open, setOpen] = React.useState(false);\n\n const onToggle = React.useCallback(\n (value = !open) => {\n setOpen(value);\n },\n [open, setOpen]\n );\n\n const updateColor = React.useCallback(\n (value: string) => {\n if (editor.selection) {\n setSelectedColor(value);\n editor.tf.select(editor.selection);\n editor.tf.focus();\n editor.tf.addMarks({ [nodeType]: value });\n }\n },\n [editor, nodeType]\n );\n\n const clearColor = React.useCallback(() => {\n if (editor.selection) {\n editor.tf.select(editor.selection);\n editor.tf.focus();\n if (selectedColor) {\n editor.tf.removeMarks(nodeType);\n }\n onToggle();\n }\n }, [editor, selectedColor, onToggle, nodeType]);\n\n React.useEffect(() => {\n if (selectionDefined) {\n setSelectedColor(color);\n }\n }, [color, selectionDefined]);\n\n // ...\n }\n ```\n\n`@udecode/plate-heading`\n\n### Breaking Changes\n\n- Package `@udecode/plate-heading` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n - `HeadingPlugin` and individual heading plugins (e.g., `H1Plugin`) have been moved to `@platejs/basic-nodes`.\n - Migration: Import from `@platejs/basic-nodes/react` (e.g., `import { HeadingPlugin } from '@platejs/basic-nodes/react';`).\n - `TocPlugin` has been moved to `@platejs/toc`.\n - Migration: Add `@platejs/toc` to your dependencies and import `TocPlugin` from `@platejs/toc/react`.\n- Remove `@udecode/plate-heading` from your dependencies.\n\n`@udecode/plate-highlight`\n\n### Breaking Changes\n\n- Package `@udecode/plate-highlight` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `HighlightPlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-highlight` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `HighlightPlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-horizontal-rule`\n\n### Breaking Changes\n\n- Package `@udecode/plate-horizontal-rule` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `HorizontalRulePlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-horizontal-rule` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `HorizontalRulePlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-indent`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-indent-list`\n\n### Breaking Changes\n\n- Package `@udecode/plate-indent-list` has been renamed to `@platejs/list`. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Migration:\n - Rename all import paths from `@udecode/plate-indent-list` to `@platejs/list`.\n - Update your `package.json`: remove `@udecode/plate-indent-list` and add `@platejs/list`.\n\n`@udecode/plate-juice`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-kbd`\n\n### Breaking Changes\n\n- Package `@udecode/plate-kbd` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `KbdPlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-kbd` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `KbdPlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-layout`\n\n### Breaking Changes\n\n- Delete backward from a column start will merge into the previous column ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-line-height`\n\n### Breaking Changes\n\n- Package `@udecode/plate-line-height` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - `LineHeightPlugin` has been moved to the `@platejs/basic-styles` package.\n\n - Migration:\n\n - Remove `@udecode/plate-line-height` from your dependencies.\n - Add `@platejs/basic-styles` to your dependencies if not already present.\n - Import `LineHeightPlugin` from `@platejs/basic-styles/react`.\n\n - `setLineHeight` signature change:\n\n ```ts\n // Before\n setLineHeight(editor, { value: 1.5, setNodesOptions });\n\n // After\n setLineHeight(editor, 1.5, setNodesOptions);\n ```\n\n - Removed `useLineHeightDropdownMenu` and `useLineHeightDropdownMenuState`. Use it in your own codebase, for example:\n\n ```tsx\n export function LineHeightToolbarButton() {\n const editor = useEditorRef();\n const { defaultNodeValue, validNodeValues: values = [] } =\n editor.getInjectProps(LineHeightPlugin);\n\n const value = useSelectionFragmentProp({\n defaultValue: defaultNodeValue,\n getProp: (node) => node.lineHeight,\n });\n\n const onValueChange = (newValue: string) => {\n editor.tf.lineHeight.setNodes(Number(newValue));\n editor.tf.focus();\n };\n\n // ...\n }\n ```\n\n### Features\n\n- New transform method to `LineHeightPlugin`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.tf.lineHeight.setNodes` - Transform method for setting line height values. Alias to `setLineHeight`\n\n`@udecode/plate-link`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-list`\n\n### Breaking Changes\n\n- The previous `@udecode/plate-list` (classic list implementation) has been moved to `@platejs/list-classic`. ([#4327](https://github.com/udecode/plate/pull/4327))\n - **Migration for users of the classic list**:\n - Rename all import paths from `@udecode/plate-list` to `@platejs/list-classic`.\n - Update your `package.json`: remove the old `@udecode/plate-list` (if it was a direct dependency) and add `@platejs/list-classic`.\n- This package, `@platejs/list`, now contains the functionality previously in `@udecode/plate-indent-list` (indent-based list system).\n - Plugin names have been generalized: `IndentListPlugin` is now `ListPlugin`, `BaseIndentListPlugin` is `BaseListPlugin`, etc. (`*IndentList*` -> `*List*`).\n - The primary plugin key is now `list` (e.g., `ListPlugin.key`) instead of `listStyleType`.\n - Constants for list keys previously in `INDENT_LIST_KEYS` are now available under `KEYS` from `platejs`.\n - Migration for constants:\n - `INDENT_LIST_KEYS.listStyleType` -> `KEYS.listType`\n - `INDENT_LIST_KEYS.todo` -> `KEYS.listTodo`\n - `INDENT_LIST_KEYS.checked` -> `KEYS.listChecked`\n - Other `INDENT_LIST_KEYS.*` map to `KEYS.*` accordingly.\n - Removed `listStyleTypes` option from `ListPlugin`. You should control list rendering via `render.belowNodes` instead.\n - Removed `renderListBelowNodes`.\n- For changelogs of the indent-based list system (now in this package) version `<=48` (when it was `@udecode/plate-indent-list`), refer to its [archived changelog](https://github.com/udecode/plate/blob/7afd88089f4a76c896f3edf928b03c7e9f2ab903/packages/indent-list/CHANGELOG.md).\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-list-classic`\n\n### Breaking Changes\n\n- **Removed Default Shortcuts** for `BulletedListPlugin` and `NumberedListPlugin`. ([#4327](https://github.com/udecode/plate/pull/4327))\n - These shortcuts must now be configured manually using the `shortcuts` field.\n - Example:\n ```tsx\n BulletedListPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+alt+5' } },\n });\n NumberedListPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+alt+6' } },\n });\n ```\n- Package `@udecode/plate-list` has been moved to `@platejs/list-classic`.\n - **Migration**:\n - Rename all import paths from `@udecode/plate-list` to `@platejs/list-classic`.\n - Update your `package.json`: remove `@udecode/plate-list` and add `@platejs/list-classic`.\n- For changelogs of `@udecode/plate-list` version `<=48`, refer to its [archived changelog](https://github.com/udecode/plate/blob/7afd88089f4a76c896f3edf928b03c7e9f2ab903/packages/list/CHANGELOG.md).\n\n`@udecode/plate-markdown`\n\n### Breaking Changes\n\n- Function `indentListToMdastTree` has been renamed to `listToMdastTree` to align with the list plugin renames (`IndentListPlugin` -> `ListPlugin`). ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-math`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-media`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-mention`\n\n### Breaking Changes\n\n- The type `TMentionInputElement` has been removed. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Use `TComboboxInputElement` from `@udecode/plate` instead for input elements, as mention functionality is built upon the combobox.\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-node-id`\n\n### Breaking Changes\n\n- Package `@udecode/plate-node-id` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `NodeIdPlugin` functionality is now part of `@platejs/core` and is **enabled by default**.\n- Migration:\n\n - Remove `NodeIdPlugin` from your explicit plugin list if it was added manually.\n\n - Remove `@udecode/plate-node-id` from your dependencies.\n\n - If you had `NodeIdPlugin` configured with options, move these options to the `nodeId` field in your main editor configuration (`createPlateEditor` or `usePlateEditor` options).\n Example:\n\n ```ts\n // Before\n // const editor = usePlateEditor({\n // plugins: [\n // NodeIdPlugin.configure({ /* ...your options... */ }),\n // ],\n // });\n\n // After\n const editor = usePlateEditor({\n nodeId: {\n /* ...your options... */\n },\n // ...other editor options\n });\n ```\n\n - If you want to disable automatic node ID generation (to replicate behavior if you weren't using `NodeIdPlugin` before), set `nodeId: false` in your editor configuration.\n\n`@udecode/plate-normalizers`\n\n### Breaking Changes\n\n- Package `@udecode/plate-normalizers` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Its plugins have been moved to `platejs` (which is re-exported via `platejs`).\n- Migration:\n - Remove `@udecode/plate-normalizers` from your dependencies.\n - Update import paths to use `platejs`\n\n`@udecode/plate`\n\n### Breaking Changes\n\n- Renamed package to `platejs`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - Replace all `@udecode/plate/react` with `platejs/react`\n - Replace all `'@udecode/plate'` with `'platejs'`\n\n`@udecode/plate-playwright`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-reset-node`\n\n### Breaking Changes\n\n- Package `@udecode/plate-reset-node` has been deprecated. Its functionality (e.g., `ResetNodePlugin`) is now exclusively configured using the `rules.break` and `rules.delete` options on plugin definitions. Migration: ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - Remove `@udecode/plate-reset-node` from your dependencies.\n - Remove any usage of `ResetNodePlugin` from your project.\n - Configure reset behaviors directly on the relevant plugins by defining `rules.break` and/or `rules.delete`.\n\n **Example: Resetting a Blockquote to a Paragraph**\n\n ```typescript\n ResetNodePlugin.configure({\n options: {\n rules: [\n {\n types: [BlockquotePlugin.key],\n defaultType: ParagraphPlugin.key,\n hotkey: 'Enter',\n predicate: (editor) =>\n editor.api.isEmpty(editor.selection, { block: true }),\n },\n ],\n },\n });\n\n // After\n BlockquotePlugin.configure({\n rules: {\n break: { empty: 'reset' },\n delete: { start: 'reset' },\n },\n });\n ```\n\n **For custom reset logic (previously `onReset`):**\n\n ```typescript\n // Before\n ResetNodePlugin.configure({\n options: {\n rules: [\n {\n types: [CodeBlockPlugin.key],\n defaultType: ParagraphPlugin.key,\n hotkey: 'Enter',\n predicate: isCodeBlockEmpty,\n onReset: unwrapCodeBlock,\n },\n ],\n },\n });\n\n // After\n CodeBlockPlugin.configure({\n rules: {\n delete: { empty: 'reset' },\n },\n }).overrideEditor(({ editor, tf: { resetBlock } }) => ({\n transforms: {\n resetBlock(options) {\n if (\n editor.api.block({\n at: options?.at,\n match: { type: editor.getType(CodeBlockPlugin.key) },\n })\n ) {\n unwrapCodeBlock(editor);\n return;\n }\n\n return resetBlock(options);\n },\n },\n }));\n ```\n\n`@udecode/plate-resizable`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-select`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Package `@udecode/plate-select` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `SelectOnBackspacePlugin` has been removed. This behavior is now built into Plate by default: delete (backward/forward) at the start of a block will select the previous/next void block instead of removing it.\n- `DeletePlugin` has been removed. This behavior is now built into Plate by default: delete (backward/forward) from an empty block will remove it instead of merging.\n- `RemoveEmptyNodesPlugin` has been removed. This behavior is now available through the `rules: { normalize: { removeEmpty: true } }` configuration on individual plugins.\n- Migration:\n - Remove `@udecode/plate-select` from your dependencies.\n - Remove any usage of `SelectOnBackspacePlugin`, `DeletePlugin` from your project.\n - Replace `RemoveEmptyNodesPlugin.configure({ options: { types: ['custom'] } })` with `CustomPlugin.configure({ rules: { normalize: { removeEmpty: true } } })`. This is used by our `LinkPlugin`.\n\n`@udecode/plate-selection`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-slash-command`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- The type `TSlashInputElement` has been removed. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Use `TComboboxInputElement` from `platejs` instead for Slash Command input elements, as slash command functionality is built upon the combobox.\n\n`@udecode/slate`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Replaced `editor.api.shouldMergeNodesRemovePrevNode` with `editor.api.shouldMergeNodes`. `shouldMergeNodes` is now controlling the remove + merge behavior ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - Returns `true` if the default merging behavior should be applied.\n - Returns `false` if the default merging behavior should not be applied. This is used by Plate to prevent void blocks deletion, and to prioritize empty block deletion over merging.\n\n ```ts\n // Before\n editor.api.shouldMergeNodesRemovePrevNode(prev, current);\n\n // After\n editor.api.shouldMergeNodes(prev, current);\n ```\n\n - Replace `editor.api.fragment` option `structuralTypes` with `unwrap`.\n\n ```ts\n // Before\n editor.api.fragment(editor.selection, { structuralTypes: ['table'] });\n\n // After\n editor.api.fragment(editor.selection, { unwrap: ['table'] });\n ```\n\n### Features\n\n- `editor.tf.insertSoftBreak` now inserts a soft break instead of a hard break. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-suggestion`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-tabbable`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-table`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-tag`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-test-utils`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-toc`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-toggle`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-trailing-block`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Package `@udecode/plate-trailing-block` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Its functionality (e.g., `TrailingBlockPlugin`) has been moved to `@platejs/utils` (which is re-exported via `platejs`).\n- Migration:\n - Remove `@udecode/plate-trailing-block` from your dependencies.\n - Update import paths to use `platejs` (e.g., `import { TrailingBlockPlugin } from 'platejs';`).\n\n`@udecode/plate-utils`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Node type definitions (e.g., `TImageElement`, `TParagraphElement`) previously co-located with their respective plugin packages (like `@udecode/plate-media`) have been centralized into `@platejs/utils`. These are typically re-exported via the main `platejs` package. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - Migration: Update imports for these types to pull from `platejs`.\n\n ```tsx\n // Before\n // import { TImageElement } from '@udecode/plate-media';\n\n // After\n import { TImageElement } from 'platejs';\n ```\n\n - Removed `structuralTypes` option from `useSelectionFragment` and `useSelectionFragmentProp`. These hooks now automatically use `plugin.node.isContainer` from enabled plugins.\n\n - Removed:\n - `createNodesHOC`\n - `createNodesWithHOC`\n - `createNodeHOC`\n\n - Removed `usePlaceholderState` hook.\n - Migration: Use the `BlockPlaceholderPlugin` (typically from `platejs`) instead of the `withPlaceholders` HOC and `usePlaceholderState`. Configure placeholders directly within the `BlockPlaceholderPlugin` options.\n ```ts\n // Example BlockPlaceholderPlugin configuration\n BlockPlaceholderPlugin.configure({\n options: {\n className:\n 'before:absolute before:cursor-text before:opacity-30 before:content-[attr(placeholder)]',\n placeholders: {\n [ParagraphPlugin.key]: 'Type something...',\n // ...other placeholders\n },\n query: ({ editor, path }) => {\n // Example query: only show for top-level empty blocks\n return (\n path.length === 1 && editor.api.isEmpty(editor.children[path[0]])\n );\n },\n },\n });\n ```\n\n### Features\n\n- New plugin `SingleBlockPlugin` to restrict editor content to a single block while preserving line breaks, while `SingleLinePlugin` prevents all line breaks. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - `@platejs/utils` (and by extension, `platejs`) now exports a comprehensive `KEYS` object containing all official plugin keys.\n\n - This is intended to improve decoupling and provide a centralized way to reference plugin keys.\n - Example Usage:\n\n ```ts\n import { KEYS } from 'platejs';\n\n // Instead of: ParagraphPlugin.key\n // Use: KEYS.p\n ```\n\n - Many node type definitions (e.g., `TParagraphElement`, `TLinkElement`) are also now exported from `platejs`, in addition to being available from their specific plugin packages if those still exist or from `@platejs/basic-nodes`.\n\n`@udecode/plate-yjs`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n[`CHANGELOG`](https://github.com/udecode/plate/pull/4339) · [`v48.0.6...v49.0.0`](https://github.com/udecode/plate/compare/%40udecode%2Fplate-node-id%4048.0.6...%40udecode%2Fplate-ai%4049.0.0) · By [@zbeyens](https://github.com/zbeyens)", + "content": "`@udecode/plate-ai`\n\n### Breaking Changes\n\n- Copilot API method changes: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.api.copilot.accept` is now `editor.tf.copilot.accept`.\n - `editor.api.copilot.acceptNextWord` is now `editor.tf.copilot.acceptNextWord`.\n - `editor.api.copilot.reset` is now `editor.api.copilot.reject`.\n- Removed Default Shortcuts for Copilot:\n - Only `accept` (Tab) and `reject` (Escape) shortcuts are included by default for `CopilotPlugin`.\n - `acceptNextWord` and `triggerSuggestion` shortcuts must now be configured manually using the `shortcuts` field when configuring the plugin.\n - Example:\n ```tsx\n CopilotPlugin.configure({\n // ... other options\n shortcuts: {\n acceptNextWord: {\n keys: 'mod+right',\n },\n triggerSuggestion: {\n keys: 'ctrl+space',\n },\n },\n });\n ```\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-alignment`\n\n### Breaking Changes\n\n- Package `@udecode/plate-alignment` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - `TextAlignPlugin` (formerly `AlignPlugin`) has been moved to the `@platejs/basic-styles` package.\n\n - Migration:\n\n - Remove `@udecode/plate-alignment` from your dependencies.\n - Add `@platejs/basic-styles` to your dependencies if not already present.\n - Import `TextAlignPlugin` from `@platejs/basic-styles/react`.\n\n - Renamed `AlignPlugin` to `TextAlignPlugin` and changed plugin key from `'align'` to `'textAlign'`.\n\n ```ts\n // Before\n import { AlignPlugin } from '@udecode/plate-alignment/react';\n\n // After\n import { TextAlignPlugin } from '@platejs/basic-styles/react';\n ```\n\n - `setAlign` signature change:\n\n ```ts\n // Before\n setAlign(editor, { value: 'center', setNodesOptions });\n\n // After\n setAlign(editor, 'center', setNodesOptions);\n ```\n\n - Removed `useAlignDropdownMenu` and `useAlignDropdownMenuState`. Use it in your own codebase, for example:\n\n ```tsx\n export function AlignToolbarButton() {\n const editor = useEditorRef();\n const value = useSelectionFragmentProp({\n defaultValue: 'start',\n structuralTypes,\n getProp: (node) => node.align,\n });\n\n const onValueChange = (newValue: string) => {\n editor.tf.textAlign.setNodes(newValue as Alignment);\n editor.tf.focus();\n };\n\n // ...\n }\n ```\n\n### Features\n\n- New transform method to `AlignPlugin`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.tf.textAlign.setNodes` - Transform method for setting alignment values. Alias to `setAlign`\n\n`@udecode/plate-autoformat`\n\n### Breaking Changes\n\n- Replaced `BaseAutoformatPlugin` with `AutoformatPlugin`, which is no longer a React plugin. Migration: Replace `@udecode/plate-autoformat/react` import with `@udecode/plate-autoformat`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-basic-elements`\n\n### Breaking Changes\n\n- Package `@udecode/plate-basic-elements` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `BasicElementsPlugin` has been renamed to `BasicBlocksPlugin`.\n- Its plugins have been moved to the new `@platejs/basic-nodes` package.\n- Migration:\n - Replace `@udecode/plate-basic-elements` with `@platejs/basic-nodes` in your dependencies.\n - Update import paths from `@udecode/plate-basic-elements/react` to `@platejs/basic-nodes/react`.\n - For detailed changes to individual plugins, default HTML tags, and shortcut configurations, refer to the changeset for `@platejs/basic-nodes`.\n\n`@udecode/plate-basic-marks`\n\n### Breaking Changes\n\n- Package `@udecode/plate-basic-marks` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Its plugins have been moved to the new `@platejs/basic-nodes` package.\n- Migration:\n - Replace `@udecode/plate-basic-marks` with `@platejs/basic-nodes` in your dependencies.\n - Update import paths from `@udecode/plate-basic-marks/react` to `@platejs/basic-nodes/react`.\n - For detailed changes to individual plugins, default HTML tags, and shortcut configurations, refer to the changeset for `@platejs/basic-nodes`.\n\n`@udecode/plate-basic-nodes`\n\n### Breaking Changes\n\n- The packages `@udecode/plate-basic-elements` and `@udecode/plate-basic-marks` have been deprecated. All their plugins are now consolidated into the new `@platejs/basic-nodes` package. ([#4327](https://github.com/udecode/plate/pull/4327))\n- **Migration**:\n - Replace `@udecode/plate-basic-elements` and `@udecode/plate-basic-marks` in your dependencies with `@platejs/basic-nodes`.\n - Update all import paths from `@udecode/plate-basic-elements/react` or `@udecode/plate-basic-marks/react` to `@platejs/basic-nodes/react`.\n - `CodeBlockPlugin` is **not** part of `@platejs/basic-nodes`. Ensure it is imported from `@platejs/code-block/react`.\n- `SkipMarkPlugin` (standalone) is removed. Its functionality is now built into the core editor. To enable boundary clearing for a specific mark, configure the mark plugin directly: `plugin.configure({ rules: { selection: { affinity: 'outward' } } })`.\n- Default HTML Tag Changes:\n - **Blocks**: Element plugins in `@udecode/plate-basic-nodes` (e.g., `BlockquotePlugin`, `HeadingPlugin`, `HorizontalRulePlugin`) now default to rendering with specific HTML tags (` `, `-
`, `
` respectively). `ParagraphPlugin` still defaults to ``. If you relied on previous defaults or need different tags, provide a custom component or use the `render.as` option.\n - **Marks**: Mark plugins in `@udecode/plate-basic-nodes` (e.g., `BoldPlugin`, `CodePlugin`, `ItalicPlugin`) now default to specific HTML tags (``, ``, `` respectively). If you relied on previous defaults or need different tags, provide a custom component or use the `render.as` option.\n- Removed Default Shortcuts:\n - Default keyboard shortcuts are no longer bundled with most plugins (exceptions: bold, italic, underline).\n - Configure shortcuts manually via the `shortcuts` field in plugin configuration.\n - Example (Block Plugins):\n ```ts\n H1Plugin.configure({ shortcuts: { toggle: { keys: 'mod+alt+1' } } });\n BlockquotePlugin.configure({\n shortcuts: { toggle: { keys: 'mod+shift+period' } },\n });\n ```\n - Example (Mark Plugins):\n ```ts\n CodePlugin.configure({ shortcuts: { toggle: { keys: 'mod+e' } } });\n StrikethroughPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+shift+x' } },\n });\n SubscriptPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+comma' } },\n });\n SuperscriptPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+period' } },\n });\n HighlightPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+shift+h' } },\n });\n ```\n\n### Features\n\n- New `toggle` Transforms Added: ([#4327](https://github.com/udecode/plate/pull/4327))\n - Block plugins with new `toggle` transforms: `BlockquotePlugin`, `H1Plugin`, `H2Plugin`, `H3Plugin`, `H4Plugin`, `H5Plugin`, `H6Plugin`.\n - All mark plugins in this package now also feature a `toggle` transform, including: `BoldPlugin`, `ItalicPlugin`, `UnderlinePlugin`, `CodePlugin`, `StrikethroughPlugin`, `SubscriptPlugin`, `SuperscriptPlugin`, `KbdPlugin`, `HighlightPlugin`.\n- Individual Heading Plugins Available:\n - `H1Plugin`, `H2Plugin`, `H3Plugin`, `H4Plugin`, `H5Plugin`, and `H6Plugin` offer a flexible alternative to the general `HeadingPlugin`, allowing granular control over heading level inclusion and configuration (e.g., custom components, shortcuts per level).\n- Plugin Consolidations into `@udecode/plate-basic-nodes`:\n - `KbdPlugin` (formerly from `@udecode/plate-kbd`).\n - `HighlightPlugin` (formerly from `@udecode/plate-highlight`).\n\n`@udecode/plate-block-quote`\n\n### Breaking Changes\n\n- Package `@udecode/plate-block-quote` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `BlockquotePlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-block-quote` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `BlockquotePlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-break`\n\n### Breaking Changes\n\n- Package `@udecode/plate-break` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `SoftBreakPlugin` has been removed. Migration:\n - For `shift+enter` rules: no migration is needed - this behavior is built into Plite by default.\n - For `enter` rules: use `plugin.configure({ rules: { break: { default: 'lineBreak' } } })` to insert a line break instead of a hard break on `Enter` keydown when the selection is within the configured node type.\n - For more complex break rules: use `overrideEditor` to override the `insertBreak` transform with custom logic.\n- `ExitBreakPlugin` has been moved to `@platejs/utils` (which is re-exported via `platejs`) with a simplified API and improved behavior.\n\n - **Behavior Change**: Instead of always exiting to the root level of the document, exiting will now insert a block to the nearest exitable ancestor that has `isStrictSiblings: false`. This means deeply nested structures (like tables in columns) are exitable at many levels.\n - Migration:\n\n - Remove `@udecode/plate-break` from your dependencies.\n - Replace `@udecode/plate-break` import with `platejs`.\n - **Important**: If not using Plate plugins, you must set `isStrictSiblings: true` on your custom node plugins that can't have paragraph siblings for exit break to work correctly.\n - Replace complex rule-based configuration with simple shortcuts:\n\n ```tsx\n // Before (old API)\n ExitBreakPlugin.configure({\n options: {\n rules: [\n { hotkey: 'mod+enter' },\n { hotkey: 'mod+shift+enter', before: true },\n ],\n },\n });\n\n // After (new API)\n ExitBreakPlugin.configure({\n shortcuts: {\n insert: { keys: 'mod+enter' },\n insertBefore: { keys: 'mod+shift+enter' },\n },\n });\n ```\n\n`@udecode/plate-callout`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-caption`\n\n### Breaking Changes\n\n- `CaptionPlugin` option `options.plugins` (accepting an array of `PlatePlugin`) has been renamed to `options.query.allow` (accepting an array of plugin keys). ([#4327](https://github.com/udecode/plate/pull/4327))\n- Migration:\n\n ```tsx\n // Before\n CaptionPlugin.configure({\n options: {\n plugins: [ImagePlugin], // ImagePlugin is an example\n },\n });\n\n // After\n CaptionPlugin.configure({\n options: {\n query: {\n allow: [ImagePlugin.key], // Use the plugin's key\n },\n },\n });\n ```\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-code-block`\n\n### Breaking Changes\n\n- `CodeBlockPlugin` now defaults to rendering the code block container with a `` HTML tag if no custom component is provided for `CodeBlockElement` (or the plugin key `code_block`). ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-combobox`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-comments`\n\n### Breaking Changes\n\n- `CommentsPlugin` has been renamed to `CommentPlugin`. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Update imports and plugin configurations accordingly.\n - Example: `CommentsPlugin.key` becomes `CommentPlugin.key`.\n- Package name has been changed to `@platejs/comment`.\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-core`\n\n### Breaking Changes\n\n- `editor.getType()` now takes a `pluginKey: string` instead of a `plugin: PlatePlugin` instance. ([#4327](https://github.com/udecode/plate/pull/4327))\n - Example: Use `editor.getType(ParagraphPlugin.key)` instead of `editor.getType(ParagraphPlugin)`.\n- Plugins without a `key` property will not be registered into the editor.\n- Passing `disabled: true` prop to `PlateContent` will now also set the editor to `readOnly: true` state internally.\n- Editor DOM state properties have been moved under `editor.dom` namespace:\n - `editor.currentKeyboardEvent` is now `editor.dom.currentKeyboardEvent`.\n - `editor.prevSelection` is now `editor.dom.prevSelection`.\n- Editor metadata properties have been moved under `editor.meta` namespace:\n - `editor.isFallback` is now `editor.meta.isFallback`\n - `editor.key` is now `editor.meta.key`\n - `editor.pluginList` is now `editor.meta.pluginList`\n - `editor.shortcuts` is now `editor.meta.shortcuts`\n - `editor.uid` is now `editor.meta.uid`\n- `NodeIdPlugin` is now enabled by default as part of the core plugins. This automatically assigns unique IDs to block nodes.\n - Migration: If you were not previously using `NodeIdPlugin` and wish to maintain the old behavior (no automatic IDs), explicitly disable it in your editor configuration:\n ```ts\n const editor = usePlateEditor({\n // ...other options\n nodeId: false, // Disables automatic node ID generation\n });\n ```\n- The `components` prop has been removed from `serializeHtml` and `PlateStatic`.\n - Migration: Pass the `components` to `createPliteEditor({ components })` or the individual plugins instead.\n- Plugin Shortcuts System Changes:\n - Shortcut keys defined in `editor.shortcuts` are now namespaced by the plugin key (e.g., `code.toggle` for `CodePlugin`).\n - The `priority` property for shortcuts is used to resolve conflicts when multiple shortcuts share the exact same key combination, not for overriding shortcuts by name.\n - `preventDefault` for plugin shortcuts now defaults to `true`, unless the handler returns `false` (i.e. not handled). This means browser default actions for these key combinations will be prevented unless explicitly allowed.\n - Migration: If you need to allow browser default behavior for a specific shortcut, set `preventDefault: false` in its configuration:\n ```ts\n MyPlugin.configure({\n shortcuts: {\n myAction: {\n keys: 'mod+s',\n preventDefault: false, // Example: Allow browser's default save dialog\n },\n },\n });\n ```\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n### Features\n\n- New editor DOM state fields available under `editor.dom`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.dom.composing`: Boolean, true if the editor is currently composing text (e.g., during IME input).\n - `editor.dom.focused`: Boolean, true if the editor currently has focus.\n - `editor.dom.readOnly`: Boolean, true if the editor is in read-only mode. Passing the `readOnly` prop to `PlateContent` will sync its value to this state and to the `useEditorReadOnly` hook.\n- New editor metadata fields:\n - `editor.meta.components` - stores the plugin components by key\n- New hook `useEditorComposing`: Allows subscription to the editor's composing state (`editor.dom.composing`) outside of `PlateContent`.\n- `createPlateEditor` and `usePlateEditor` now accept a `readOnly` option to initialize the editor in a read-only state. For dynamic read-only changes after initialization, continue to use the `readOnly` prop on the `` or ` ` component.\n- New plugin field: `editOnly` (boolean or object).\n - When `true` or when specific properties are true in the object, Plate will disable certain plugin behaviors (handlers, rendering, injections) in read-only mode and re-enable them if the editor becomes editable.\n - By default, `render`, `handlers`, and `inject` are considered edit-only (`true`). `normalizeInitialValue` defaults to always active (`false`).\n - Example: `editOnly: { render: false, normalizeInitialValue: true }` would make rendering active always, but normalization only in edit mode.\n- New plugin field: `render.as` (`keyof HTMLElementTagNameMap`).\n - Specifies the default HTML tag name to be used by `PlateElement` (default: `'div'`) or `PlateLeaf` (default: `'span'`) when rendering the node, but only if no custom `node.component` is provided for the plugin.\n - Example: `render: { as: 'h1' }` would make the plugin render its node as an ` ` tag by default without the need to provide a custom component.\n- New plugin field: `node.isContainer` (boolean).\n - When `true`, indicates that the plugin's elements are primarily containers for other content.\n- New plugin field: `node.isStrictSiblings` (boolean).\n - When `true`, indicates that the element enforces strict sibling type constraints and only allows specific siblings (e.g., `td` can only have `td` siblings, `column` can only have `column` siblings).\n - Used by `editor.tf.insertExitBreak` functionality to determine appropriate exit points in nested structures.\n- New plugin field: `rules` (object).\n - Configures common editing behaviors declaratively instead of overriding editor methods. See documentation for more details.\n - `rules.break`: Controls Enter key behavior (`empty`, `default`, `emptyLineEnd`, `splitReset`)\n - `rules.delete`: Controls Backspace key behavior (`start`, `empty`)\n - `rules.merge`: Controls block merging behavior (`removeEmpty`)\n - `rules.normalize`: Controls normalization behavior (`removeEmpty`)\n - `rules.selection`: Controls cursor positioning behavior (`affinity`)\n - `rules.match`: Conditional rule application based on node properties\n- Plugin shortcuts can now automatically leverage existing plugin transforms by specifying the transform name, in addition to custom handlers.\n- New editor transform methods for keyboard handling:\n - `editor.tf.escape`: Handle Escape key events. Returns `true` if the event is handled.\n - `editor.tf.moveLine`: Handle ArrowDown and ArrowUp key events with `reverse` option for direction. Returns `true` if the event is handled.\n - `editor.tf.selectAll`: Handle Ctrl/Cmd+A key events for selecting all content. Returns `true` if the event is handled.\n - `editor.tf.tab`: Handle Tab and Shift+Tab key events with `reverse` option for Shift+Tab. Returns `true` if the event is handled.\n\n### Bug Fixes\n\n- Fixed an issue where `editor.api` and `editor.tf` (transforms) were not consistently available in the props passed to default element components when no custom component was provided for a plugin. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-csv`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-cursor`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-date`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-diff`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-dnd`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-docx`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-emoji`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-excalidraw`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-find-replace`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-floating`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-font`\n\n### Breaking Changes\n\n- Removed `setBlockBackgroundColor` ([#4327](https://github.com/udecode/plate/pull/4327))\n- Removed `setFontSize` – use `tf.fontSize.addMark` instead:\n\n ```ts\n // Before\n editor.api.fontSize.addMark('16px');\n\n // After\n editor.tf.fontSize.addMark('16px');\n ```\n\n - Removed `useColorInput`. Use it in your own codebase, for example:\n\n ```tsx\n function ColorInput() {\n const inputRef = React.useRef
(null);\n\n const onClick = () => {\n inputRef.current?.click();\n };\n\n // ...\n }\n ```\n\n - Removed `useColorsCustom` and `useColorsCustomState`. Use it in your own codebase, for example:\n\n ```tsx\n function ColorCustom({ color, colors, customColors, updateCustomColor }) {\n const [customColor, setCustomColor] = React.useState ();\n const [value, setValue] = React.useState (color || '#000000');\n\n React.useEffect(() => {\n if (\n !color ||\n customColors.some((c) => c.value === color) ||\n colors.some((c) => c.value === color)\n ) {\n return;\n }\n\n setCustomColor(color);\n }, [color, colors, customColors]);\n\n const computedColors = React.useMemo(\n () =>\n customColor\n ? [\n ...customColors,\n {\n isBrightColor: false,\n name: '',\n value: customColor,\n },\n ]\n : customColors,\n [customColor, customColors]\n );\n\n const updateCustomColorDebounced = React.useCallback(\n debounce(updateCustomColor, 100),\n [updateCustomColor]\n );\n\n const inputProps = {\n value,\n onChange: (e: React.ChangeEvent ) => {\n setValue(e.target.value);\n updateCustomColorDebounced(e.target.value);\n },\n };\n\n // ...\n }\n ```\n\n - Removed `useColorDropdownMenu` and `useColorDropdownMenuState`. Use it in your own codebase, for example:\n\n ```tsx\n export function FontColorToolbarButton({ nodeType }) {\n const editor = useEditorRef();\n\n const selectionDefined = useEditorSelector(\n (editor) => !!editor.selection,\n []\n );\n\n const color = useEditorSelector(\n (editor) => editor.api.mark(nodeType) as string,\n [nodeType]\n );\n\n const [selectedColor, setSelectedColor] = React.useState ();\n const [open, setOpen] = React.useState(false);\n\n const onToggle = React.useCallback(\n (value = !open) => {\n setOpen(value);\n },\n [open, setOpen]\n );\n\n const updateColor = React.useCallback(\n (value: string) => {\n if (editor.selection) {\n setSelectedColor(value);\n editor.tf.select(editor.selection);\n editor.tf.focus();\n editor.tf.addMarks({ [nodeType]: value });\n }\n },\n [editor, nodeType]\n );\n\n const clearColor = React.useCallback(() => {\n if (editor.selection) {\n editor.tf.select(editor.selection);\n editor.tf.focus();\n if (selectedColor) {\n editor.tf.removeMarks(nodeType);\n }\n onToggle();\n }\n }, [editor, selectedColor, onToggle, nodeType]);\n\n React.useEffect(() => {\n if (selectionDefined) {\n setSelectedColor(color);\n }\n }, [color, selectionDefined]);\n\n // ...\n }\n ```\n\n`@udecode/plate-heading`\n\n### Breaking Changes\n\n- Package `@udecode/plate-heading` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n - `HeadingPlugin` and individual heading plugins (e.g., `H1Plugin`) have been moved to `@platejs/basic-nodes`.\n - Migration: Import from `@platejs/basic-nodes/react` (e.g., `import { HeadingPlugin } from '@platejs/basic-nodes/react';`).\n - `TocPlugin` has been moved to `@platejs/toc`.\n - Migration: Add `@platejs/toc` to your dependencies and import `TocPlugin` from `@platejs/toc/react`.\n- Remove `@udecode/plate-heading` from your dependencies.\n\n`@udecode/plate-highlight`\n\n### Breaking Changes\n\n- Package `@udecode/plate-highlight` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `HighlightPlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-highlight` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `HighlightPlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-horizontal-rule`\n\n### Breaking Changes\n\n- Package `@udecode/plate-horizontal-rule` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `HorizontalRulePlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-horizontal-rule` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `HorizontalRulePlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-indent`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-indent-list`\n\n### Breaking Changes\n\n- Package `@udecode/plate-indent-list` has been renamed to `@platejs/list`. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Migration:\n - Rename all import paths from `@udecode/plate-indent-list` to `@platejs/list`.\n - Update your `package.json`: remove `@udecode/plate-indent-list` and add `@platejs/list`.\n\n`@udecode/plate-juice`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-kbd`\n\n### Breaking Changes\n\n- Package `@udecode/plate-kbd` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `KbdPlugin` has been moved to the `@platejs/basic-nodes` package.\n- Migration:\n - Remove `@udecode/plate-kbd` from your dependencies.\n - Add `@platejs/basic-nodes` to your dependencies if not already present.\n - Import `KbdPlugin` from `@platejs/basic-nodes/react`.\n\n`@udecode/plate-layout`\n\n### Breaking Changes\n\n- Delete backward from a column start will merge into the previous column ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-line-height`\n\n### Breaking Changes\n\n- Package `@udecode/plate-line-height` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - `LineHeightPlugin` has been moved to the `@platejs/basic-styles` package.\n\n - Migration:\n\n - Remove `@udecode/plate-line-height` from your dependencies.\n - Add `@platejs/basic-styles` to your dependencies if not already present.\n - Import `LineHeightPlugin` from `@platejs/basic-styles/react`.\n\n - `setLineHeight` signature change:\n\n ```ts\n // Before\n setLineHeight(editor, { value: 1.5, setNodesOptions });\n\n // After\n setLineHeight(editor, 1.5, setNodesOptions);\n ```\n\n - Removed `useLineHeightDropdownMenu` and `useLineHeightDropdownMenuState`. Use it in your own codebase, for example:\n\n ```tsx\n export function LineHeightToolbarButton() {\n const editor = useEditorRef();\n const { defaultNodeValue, validNodeValues: values = [] } =\n editor.getInjectProps(LineHeightPlugin);\n\n const value = useSelectionFragmentProp({\n defaultValue: defaultNodeValue,\n getProp: (node) => node.lineHeight,\n });\n\n const onValueChange = (newValue: string) => {\n editor.tf.lineHeight.setNodes(Number(newValue));\n editor.tf.focus();\n };\n\n // ...\n }\n ```\n\n### Features\n\n- New transform method to `LineHeightPlugin`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - `editor.tf.lineHeight.setNodes` - Transform method for setting line height values. Alias to `setLineHeight`\n\n`@udecode/plate-link`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-list`\n\n### Breaking Changes\n\n- The previous `@udecode/plate-list` (classic list implementation) has been moved to `@platejs/list-classic`. ([#4327](https://github.com/udecode/plate/pull/4327))\n - **Migration for users of the classic list**:\n - Rename all import paths from `@udecode/plate-list` to `@platejs/list-classic`.\n - Update your `package.json`: remove the old `@udecode/plate-list` (if it was a direct dependency) and add `@platejs/list-classic`.\n- This package, `@platejs/list`, now contains the functionality previously in `@udecode/plate-indent-list` (indent-based list system).\n - Plugin names have been generalized: `IndentListPlugin` is now `ListPlugin`, `BaseIndentListPlugin` is `BaseListPlugin`, etc. (`*IndentList*` -> `*List*`).\n - The primary plugin key is now `list` (e.g., `ListPlugin.key`) instead of `listStyleType`.\n - Constants for list keys previously in `INDENT_LIST_KEYS` are now available under `KEYS` from `platejs`.\n - Migration for constants:\n - `INDENT_LIST_KEYS.listStyleType` -> `KEYS.listType`\n - `INDENT_LIST_KEYS.todo` -> `KEYS.listTodo`\n - `INDENT_LIST_KEYS.checked` -> `KEYS.listChecked`\n - Other `INDENT_LIST_KEYS.*` map to `KEYS.*` accordingly.\n - Removed `listStyleTypes` option from `ListPlugin`. You should control list rendering via `render.belowNodes` instead.\n - Removed `renderListBelowNodes`.\n- For changelogs of the indent-based list system (now in this package) version `<=48` (when it was `@udecode/plate-indent-list`), refer to its [archived changelog](https://github.com/udecode/plate/blob/7afd88089f4a76c896f3edf928b03c7e9f2ab903/packages/indent-list/CHANGELOG.md).\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-list-classic`\n\n### Breaking Changes\n\n- **Removed Default Shortcuts** for `BulletedListPlugin` and `NumberedListPlugin`. ([#4327](https://github.com/udecode/plate/pull/4327))\n - These shortcuts must now be configured manually using the `shortcuts` field.\n - Example:\n ```tsx\n BulletedListPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+alt+5' } },\n });\n NumberedListPlugin.configure({\n shortcuts: { toggle: { keys: 'mod+alt+6' } },\n });\n ```\n- Package `@udecode/plate-list` has been moved to `@platejs/list-classic`.\n - **Migration**:\n - Rename all import paths from `@udecode/plate-list` to `@platejs/list-classic`.\n - Update your `package.json`: remove `@udecode/plate-list` and add `@platejs/list-classic`.\n- For changelogs of `@udecode/plate-list` version `<=48`, refer to its [archived changelog](https://github.com/udecode/plate/blob/7afd88089f4a76c896f3edf928b03c7e9f2ab903/packages/list/CHANGELOG.md).\n\n`@udecode/plate-markdown`\n\n### Breaking Changes\n\n- Function `indentListToMdastTree` has been renamed to `listToMdastTree` to align with the list plugin renames (`IndentListPlugin` -> `ListPlugin`). ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-math`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-media`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-mention`\n\n### Breaking Changes\n\n- The type `TMentionInputElement` has been removed. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Use `TComboboxInputElement` from `@udecode/plate` instead for input elements, as mention functionality is built upon the combobox.\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-node-id`\n\n### Breaking Changes\n\n- Package `@udecode/plate-node-id` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `NodeIdPlugin` functionality is now part of `@platejs/core` and is **enabled by default**.\n- Migration:\n\n - Remove `NodeIdPlugin` from your explicit plugin list if it was added manually.\n\n - Remove `@udecode/plate-node-id` from your dependencies.\n\n - If you had `NodeIdPlugin` configured with options, move these options to the `nodeId` field in your main editor configuration (`createPlateEditor` or `usePlateEditor` options).\n Example:\n\n ```ts\n // Before\n // const editor = usePlateEditor({\n // plugins: [\n // NodeIdPlugin.configure({ /* ...your options... */ }),\n // ],\n // });\n\n // After\n const editor = usePlateEditor({\n nodeId: {\n /* ...your options... */\n },\n // ...other editor options\n });\n ```\n\n - If you want to disable automatic node ID generation (to replicate behavior if you weren't using `NodeIdPlugin` before), set `nodeId: false` in your editor configuration.\n\n`@udecode/plate-normalizers`\n\n### Breaking Changes\n\n- Package `@udecode/plate-normalizers` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Its plugins have been moved to `platejs` (which is re-exported via `platejs`).\n- Migration:\n - Remove `@udecode/plate-normalizers` from your dependencies.\n - Update import paths to use `platejs`\n\n`@udecode/plate`\n\n### Breaking Changes\n\n- Renamed package to `platejs`: ([#4327](https://github.com/udecode/plate/pull/4327))\n - Replace all `@udecode/plate/react` with `platejs/react`\n - Replace all `'@udecode/plate'` with `'platejs'`\n\n`@udecode/plate-playwright`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-reset-node`\n\n### Breaking Changes\n\n- Package `@udecode/plate-reset-node` has been deprecated. Its functionality (e.g., `ResetNodePlugin`) is now exclusively configured using the `rules.break` and `rules.delete` options on plugin definitions. Migration: ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - Remove `@udecode/plate-reset-node` from your dependencies.\n - Remove any usage of `ResetNodePlugin` from your project.\n - Configure reset behaviors directly on the relevant plugins by defining `rules.break` and/or `rules.delete`.\n\n **Example: Resetting a Blockquote to a Paragraph**\n\n ```typescript\n ResetNodePlugin.configure({\n options: {\n rules: [\n {\n types: [BlockquotePlugin.key],\n defaultType: ParagraphPlugin.key,\n hotkey: 'Enter',\n predicate: (editor) =>\n editor.api.isEmpty(editor.selection, { block: true }),\n },\n ],\n },\n });\n\n // After\n BlockquotePlugin.configure({\n rules: {\n break: { empty: 'reset' },\n delete: { start: 'reset' },\n },\n });\n ```\n\n **For custom reset logic (previously `onReset`):**\n\n ```typescript\n // Before\n ResetNodePlugin.configure({\n options: {\n rules: [\n {\n types: [CodeBlockPlugin.key],\n defaultType: ParagraphPlugin.key,\n hotkey: 'Enter',\n predicate: isCodeBlockEmpty,\n onReset: unwrapCodeBlock,\n },\n ],\n },\n });\n\n // After\n CodeBlockPlugin.configure({\n rules: {\n delete: { empty: 'reset' },\n },\n }).overrideEditor(({ editor, tf: { resetBlock } }) => ({\n transforms: {\n resetBlock(options) {\n if (\n editor.api.block({\n at: options?.at,\n match: { type: editor.getType(CodeBlockPlugin.key) },\n })\n ) {\n unwrapCodeBlock(editor);\n return;\n }\n\n return resetBlock(options);\n },\n },\n }));\n ```\n\n`@udecode/plate-resizable`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-select`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Package `@udecode/plate-select` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- `SelectOnBackspacePlugin` has been removed. This behavior is now built into Plate by default: delete (backward/forward) at the start of a block will select the previous/next void block instead of removing it.\n- `DeletePlugin` has been removed. This behavior is now built into Plate by default: delete (backward/forward) from an empty block will remove it instead of merging.\n- `RemoveEmptyNodesPlugin` has been removed. This behavior is now available through the `rules: { normalize: { removeEmpty: true } }` configuration on individual plugins.\n- Migration:\n - Remove `@udecode/plate-select` from your dependencies.\n - Remove any usage of `SelectOnBackspacePlugin`, `DeletePlugin` from your project.\n - Replace `RemoveEmptyNodesPlugin.configure({ options: { types: ['custom'] } })` with `CustomPlugin.configure({ rules: { normalize: { removeEmpty: true } } })`. This is used by our `LinkPlugin`.\n\n`@udecode/plate-selection`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-slash-command`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- The type `TSlashInputElement` has been removed. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Use `TComboboxInputElement` from `platejs` instead for Slash Command input elements, as slash command functionality is built upon the combobox.\n\n`@udecode/slate`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Replaced `editor.api.shouldMergeNodesRemovePrevNode` with `editor.api.shouldMergeNodes`. `shouldMergeNodes` is now controlling the remove + merge behavior ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - Returns `true` if the default merging behavior should be applied.\n - Returns `false` if the default merging behavior should not be applied. This is used by Plate to prevent void blocks deletion, and to prioritize empty block deletion over merging.\n\n ```ts\n // Before\n editor.api.shouldMergeNodesRemovePrevNode(prev, current);\n\n // After\n editor.api.shouldMergeNodes(prev, current);\n ```\n\n - Replace `editor.api.fragment` option `structuralTypes` with `unwrap`.\n\n ```ts\n // Before\n editor.api.fragment(editor.selection, { structuralTypes: ['table'] });\n\n // After\n editor.api.fragment(editor.selection, { unwrap: ['table'] });\n ```\n\n### Features\n\n- `editor.tf.insertSoftBreak` now inserts a soft break instead of a hard break. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-suggestion`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-tabbable`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-table`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-tag`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-test-utils`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-toc`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-toggle`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n`@udecode/plate-trailing-block`\n\n### Breaking Changes\n\n- The following plugins now default to `editOnly: true`. This means their core functionalities (handlers, rendering injections, etc.) will be disabled when the editor is in read-only mode. To override this behavior for a specific plugin, configure its `editOnly` field. For example, `SomePlugin.configure({ editOnly: false })`. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Package `@udecode/plate-trailing-block` has been deprecated. ([#4327](https://github.com/udecode/plate/pull/4327))\n- Its functionality (e.g., `TrailingBlockPlugin`) has been moved to `@platejs/utils` (which is re-exported via `platejs`).\n- Migration:\n - Remove `@udecode/plate-trailing-block` from your dependencies.\n - Update import paths to use `platejs` (e.g., `import { TrailingBlockPlugin } from 'platejs';`).\n\n`@udecode/plate-utils`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n- Node type definitions (e.g., `TImageElement`, `TParagraphElement`) previously co-located with their respective plugin packages (like `@udecode/plate-media`) have been centralized into `@platejs/utils`. These are typically re-exported via the main `platejs` package. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - Migration: Update imports for these types to pull from `platejs`.\n\n ```tsx\n // Before\n // import { TImageElement } from '@udecode/plate-media';\n\n // After\n import { TImageElement } from 'platejs';\n ```\n\n - Removed `structuralTypes` option from `useSelectionFragment` and `useSelectionFragmentProp`. These hooks now automatically use `plugin.node.isContainer` from enabled plugins.\n\n - Removed:\n - `createNodesHOC`\n - `createNodesWithHOC`\n - `createNodeHOC`\n\n - Removed `usePlaceholderState` hook.\n - Migration: Use the `BlockPlaceholderPlugin` (typically from `platejs`) instead of the `withPlaceholders` HOC and `usePlaceholderState`. Configure placeholders directly within the `BlockPlaceholderPlugin` options.\n ```ts\n // Example BlockPlaceholderPlugin configuration\n BlockPlaceholderPlugin.configure({\n options: {\n className:\n 'before:absolute before:cursor-text before:opacity-30 before:content-[attr(placeholder)]',\n placeholders: {\n [ParagraphPlugin.key]: 'Type something...',\n // ...other placeholders\n },\n query: ({ editor, path }) => {\n // Example query: only show for top-level empty blocks\n return (\n path.length === 1 && editor.api.isEmpty(editor.children[path[0]])\n );\n },\n },\n });\n ```\n\n### Features\n\n- New plugin `SingleBlockPlugin` to restrict editor content to a single block while preserving line breaks, while `SingleLinePlugin` prevents all line breaks. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n - `@platejs/utils` (and by extension, `platejs`) now exports a comprehensive `KEYS` object containing all official plugin keys.\n\n - This is intended to improve decoupling and provide a centralized way to reference plugin keys.\n - Example Usage:\n\n ```ts\n import { KEYS } from 'platejs';\n\n // Instead of: ParagraphPlugin.key\n // Use: KEYS.p\n ```\n\n - Many node type definitions (e.g., `TParagraphElement`, `TLinkElement`) are also now exported from `platejs`, in addition to being available from their specific plugin packages if those still exist or from `@platejs/basic-nodes`.\n\n`@udecode/plate-yjs`\n\n### Breaking Changes\n\n- Renamed all `@udecode/plate-*` packages to `@platejs/*`. Replace `@udecode/plate-` with `@platejs/` in your code. ([#4327](https://github.com/udecode/plate/pull/4327))\n\n[`CHANGELOG`](https://github.com/udecode/plate/pull/4339) · [`v49.0.0`](https://github.com/udecode/plate/pull/4339) · By [@zbeyens](https://github.com/zbeyens)", "contributors": [ { "url": "https://github.com/zbeyens",