From 24c77a95e9c47fcd2c331256c4a3c5e6ea60fcf0 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Sat, 5 Apr 2025 02:02:51 +0400 Subject: [PATCH 01/17] clean up sidesheet --- src/assets/calendar.png | Bin 12228 -> 0 bytes src/assets/process.png | Bin 23468 -> 0 bytes src/assets/process_dark.png | Bin 18824 -> 0 bytes src/components/EditorHeader/ControlPanel.jsx | 8 +++++ .../EditorHeader/SideSheet/Revisions.jsx | 5 +++ .../EditorHeader/SideSheet/Sidesheet.jsx | 34 ++++++------------ .../EditorHeader/SideSheet/Timeline.jsx | 4 +-- .../EditorHeader/SideSheet/Todo.jsx | 6 ++-- src/data/constants.js | 1 + src/i18n/locales/en.js | 1 + 10 files changed, 30 insertions(+), 29 deletions(-) delete mode 100644 src/assets/calendar.png delete mode 100644 src/assets/process.png delete mode 100644 src/assets/process_dark.png create mode 100644 src/components/EditorHeader/SideSheet/Revisions.jsx diff --git a/src/assets/calendar.png b/src/assets/calendar.png deleted file mode 100644 index 132b77817ce6f91726f7777c8ec091d0ae50b4db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12228 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 diff --git a/src/assets/process.png b/src/assets/process.png deleted file mode 100644 index 37474f3d24885c0a0e426030aea637688365ea6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23468 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 + + + {tasks.length > 0 ? ( - + {tasks.map((task, i) => ( ) : ( -
{t("no_tasks")}
+
{t("no_tasks")}
)} ); diff --git a/src/data/constants.js b/src/data/constants.js index 338d65d8a..1ac6fd394 100644 --- a/src/data/constants.js +++ b/src/data/constants.js @@ -99,6 +99,7 @@ export const SIDESHEET = { NONE: 0, TODO: 1, TIMELINE: 2, + REVISIONS: 3, }; export const DB = { diff --git a/src/i18n/locales/en.js b/src/i18n/locales/en.js index f280f4d40..adaeb2e3e 100644 --- a/src/i18n/locales/en.js +++ b/src/i18n/locales/en.js @@ -258,6 +258,7 @@ const en = { tab_view: "Tab view", label: "Label", many_side_label: "Many(n) side label", + revisions: "Revisions", }, }; From 1367ef37452f254e4d7c64935b96ef900b2cf38c Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Sat, 5 Apr 2025 15:41:26 +0400 Subject: [PATCH 02/17] clean up sharing --- src/components/EditorHeader/Modal/Share.jsx | 1 + .../EditorHeader/SideSheet/Revisions.jsx | 32 +++++++++++++++++-- src/components/Workspace.jsx | 4 +-- src/i18n/locales/en.js | 1 + 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/components/EditorHeader/Modal/Share.jsx b/src/components/EditorHeader/Modal/Share.jsx index 87f843c00..b72e2966f 100644 --- a/src/components/EditorHeader/Modal/Share.jsx +++ b/src/components/EditorHeader/Modal/Share.jsx @@ -66,6 +66,7 @@ export default function Share({ title, setModal }) { useEffect(() => { const updateOrGenerateLink = async () => { + setLoading(true); try { setLoading(true); if (!gistId || gistId === "") { diff --git a/src/components/EditorHeader/SideSheet/Revisions.jsx b/src/components/EditorHeader/SideSheet/Revisions.jsx index dfcb67d8b..9d23e2135 100644 --- a/src/components/EditorHeader/SideSheet/Revisions.jsx +++ b/src/components/EditorHeader/SideSheet/Revisions.jsx @@ -1,5 +1,33 @@ +import { useContext, useEffect, useState } from "react"; +import { IdContext } from "../../Workspace"; +import { useTranslation } from "react-i18next"; +import { Button, Spin } from "@douyinfe/semi-ui"; +import { IconPlus } from "@douyinfe/semi-icons"; + export default function Revisions() { + const { gistId } = useContext(IdContext); + const { t } = useTranslation(); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + setIsLoading(false); + }, []); + + if (gistId && isLoading) { + return ( +
+ +
{t("loading")}
+
+ ); + } + return ( -
Revisions
- ) +
+ + {!gistId &&
{t("no_saved_revisions")}
} +
+ ); } diff --git a/src/components/Workspace.jsx b/src/components/Workspace.jsx index fd24554c7..1f3a220b2 100644 --- a/src/components/Workspace.jsx +++ b/src/components/Workspace.jsx @@ -287,8 +287,8 @@ export default function WorkSpace() { const loadFromGist = async (shareId) => { try { - const res = await get(shareId); - const diagramSrc = res.data.files["share.json"].content; + const gist = await get(shareId); + const diagramSrc = gist.files["share.json"].content; const d = JSON.parse(diagramSrc); setGistId(shareId); setUndoStack([]); diff --git a/src/i18n/locales/en.js b/src/i18n/locales/en.js index adaeb2e3e..b298f0e73 100644 --- a/src/i18n/locales/en.js +++ b/src/i18n/locales/en.js @@ -259,6 +259,7 @@ const en = { label: "Label", many_side_label: "Many(n) side label", revisions: "Revisions", + no_saved_revisions: "No saved revisions", }, }; From d17c552424e4d5d8e6004a30fd3d26f4c5369150 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Sun, 6 Apr 2025 02:35:46 +0400 Subject: [PATCH 03/17] add revisions sidesheet --- package-lock.json | 1870 ++++------------- package.json | 1 + src/api/gists.js | 14 + .../EditorHeader/SideSheet/Revisions.jsx | 76 +- .../EditorHeader/SideSheet/Sidesheet.jsx | 2 +- .../EditorHeader/SideSheet/Versions.jsx | 195 ++ src/i18n/locales/en.js | 2 + src/index.css | 7 +- 8 files changed, 701 insertions(+), 1466 deletions(-) create mode 100644 src/components/EditorHeader/SideSheet/Versions.jsx diff --git a/package-lock.json b/package-lock.json index f21ad1cb0..fb17a5e2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "jspdf": "^3.0.1", "jszip": "^3.10.1", "lexical": "^0.12.5", + "moment": "^2.30.1", "nanoid": "^5.1.5", "node-sql-parser": "^5.3.11", "oracle-sql-parser": "^0.1.0", @@ -603,703 +604,295 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/win32-x64": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", - "cpu": [ - "arm64" - ], + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=18" + "node": ">=10.10.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", - "cpu": [ - "x64" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", - "cpu": [ - "arm" - ], + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", - "cpu": [ - "arm64" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", - "cpu": [ - "ia32" - ], + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", - "cpu": [ - "loong64" - ], + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", - "cpu": [ - "mips64el" - ], + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "node_modules/@lexical/clipboard": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.12.5.tgz", + "integrity": "sha512-A0k0g5mCHDgROLF33TwiKdjMWEfajyPcIF64lsHapZ19ZTi1iabGkXvpHnyHaMq79py1Se/e6tOcmFe9nOJkrQ==", + "dependencies": { + "@lexical/html": "0.12.5", + "@lexical/list": "0.12.5", + "@lexical/selection": "0.12.5", + "@lexical/utils": "0.12.5" + }, + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "node_modules/@lexical/code": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.12.5.tgz", + "integrity": "sha512-YV879sO2C0efWXgj4ZUzpowPWxbid8T5I0vysQIzuWPiaQG0fjilz1maYV+X95hD2VXW8yhyOnEdScfeKk62Zg==", + "dependencies": { + "@lexical/utils": "0.12.5", + "prismjs": "^1.27.0" + }, + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "node_modules/@lexical/dragon": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.12.5.tgz", + "integrity": "sha512-RFU6wIIUS0/ab5JtLp2rKaUi7nltDT96+GdmvNVHpAfa7TZuepYsoi7PtZB9aF/Outye4U7dQU2tNwesDBf8kg==", + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "node_modules/@lexical/hashtag": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.12.5.tgz", + "integrity": "sha512-nlPFScTiuZgUtuBSnRkHK9AuRDV35zZug4JLG1Hkky+Fh1PJ+0MK+/K8mhoatp13zm7GqN2fMOrrUGufqEingw==", + "dependencies": { + "@lexical/utils": "0.12.5" + }, + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, + "node_modules/@lexical/history": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.12.5.tgz", + "integrity": "sha512-nF5TurEE4qRbuNP/i5pDtVfWHQXb4ONof+MvKmHNfLRJbxSj7Ee33MVG9x851PjAzXoXuGJvw6FMBCasGXQx7A==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@lexical/utils": "0.12.5" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "lexical": "0.12.5" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node_modules/@lexical/html": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.12.5.tgz", + "integrity": "sha512-OzsWKVcr9wUGvAbgyUdG+32/cI2RclI4I4JmIyfLbiYMBYdafu+j160cjohNWu9gQFjVFszIjG4CBxfwRM+Sag==", + "dependencies": { + "@lexical/selection": "0.12.5", + "@lexical/utils": "0.12.5" + }, + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@lexical/link": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.12.5.tgz", + "integrity": "sha512-h7p5G+XXKqNrb4lk55mJL23Us5pz2szbzZevccADJ9Om6o3i4aNyjv1MeC29WXjmgS0YKHDlYcnKEgyAPKvVMw==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@lexical/utils": "0.12.5" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/@lexical/list": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.12.5.tgz", + "integrity": "sha512-KNJ262krlpcDZ2U1LC8xp86uw2nqt88iEQgpF+khv3SAqqLbhT8tMpyZ6+eWbW3mHPhQIxFutJGazMAqMW3uUA==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "@lexical/utils": "0.12.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/@lexical/mark": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.12.5.tgz", + "integrity": "sha512-61ctAYrxTGl4uMDTnE5fRH4yrs8sqnRyivuNWyOmQR6W/G3s0gHwkUZC7akOSnPLYhfnXRl3C4haY8pH93sWQg==", + "dependencies": { + "@lexical/utils": "0.12.5" + }, + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, + "node_modules/@lexical/markdown": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.12.5.tgz", + "integrity": "sha512-F3cBcuhoGWxxCqERUXF4fYfJhceK7gFYQPRsXir5mYriSNZIQIMhJoeAt8Pjer0UjFyQvNfQ+AzzXHu5xYNLLA==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@lexical/code": "0.12.5", + "@lexical/link": "0.12.5", + "@lexical/list": "0.12.5", + "@lexical/rich-text": "0.12.5", + "@lexical/text": "0.12.5", + "@lexical/utils": "0.12.5" }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lexical/clipboard": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.12.5.tgz", - "integrity": "sha512-A0k0g5mCHDgROLF33TwiKdjMWEfajyPcIF64lsHapZ19ZTi1iabGkXvpHnyHaMq79py1Se/e6tOcmFe9nOJkrQ==", - "dependencies": { - "@lexical/html": "0.12.5", - "@lexical/list": "0.12.5", - "@lexical/selection": "0.12.5", - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/code": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.12.5.tgz", - "integrity": "sha512-YV879sO2C0efWXgj4ZUzpowPWxbid8T5I0vysQIzuWPiaQG0fjilz1maYV+X95hD2VXW8yhyOnEdScfeKk62Zg==", - "dependencies": { - "@lexical/utils": "0.12.5", - "prismjs": "^1.27.0" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/dragon": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.12.5.tgz", - "integrity": "sha512-RFU6wIIUS0/ab5JtLp2rKaUi7nltDT96+GdmvNVHpAfa7TZuepYsoi7PtZB9aF/Outye4U7dQU2tNwesDBf8kg==", - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/hashtag": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.12.5.tgz", - "integrity": "sha512-nlPFScTiuZgUtuBSnRkHK9AuRDV35zZug4JLG1Hkky+Fh1PJ+0MK+/K8mhoatp13zm7GqN2fMOrrUGufqEingw==", - "dependencies": { - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/history": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.12.5.tgz", - "integrity": "sha512-nF5TurEE4qRbuNP/i5pDtVfWHQXb4ONof+MvKmHNfLRJbxSj7Ee33MVG9x851PjAzXoXuGJvw6FMBCasGXQx7A==", - "dependencies": { - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/html": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.12.5.tgz", - "integrity": "sha512-OzsWKVcr9wUGvAbgyUdG+32/cI2RclI4I4JmIyfLbiYMBYdafu+j160cjohNWu9gQFjVFszIjG4CBxfwRM+Sag==", - "dependencies": { - "@lexical/selection": "0.12.5", - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/link": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.12.5.tgz", - "integrity": "sha512-h7p5G+XXKqNrb4lk55mJL23Us5pz2szbzZevccADJ9Om6o3i4aNyjv1MeC29WXjmgS0YKHDlYcnKEgyAPKvVMw==", - "dependencies": { - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/list": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.12.5.tgz", - "integrity": "sha512-KNJ262krlpcDZ2U1LC8xp86uw2nqt88iEQgpF+khv3SAqqLbhT8tMpyZ6+eWbW3mHPhQIxFutJGazMAqMW3uUA==", - "dependencies": { - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/mark": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.12.5.tgz", - "integrity": "sha512-61ctAYrxTGl4uMDTnE5fRH4yrs8sqnRyivuNWyOmQR6W/G3s0gHwkUZC7akOSnPLYhfnXRl3C4haY8pH93sWQg==", - "dependencies": { - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/markdown": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.12.5.tgz", - "integrity": "sha512-F3cBcuhoGWxxCqERUXF4fYfJhceK7gFYQPRsXir5mYriSNZIQIMhJoeAt8Pjer0UjFyQvNfQ+AzzXHu5xYNLLA==", - "dependencies": { - "@lexical/code": "0.12.5", - "@lexical/link": "0.12.5", - "@lexical/list": "0.12.5", - "@lexical/rich-text": "0.12.5", - "@lexical/text": "0.12.5", - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" + "peerDependencies": { + "lexical": "0.12.5" } }, "node_modules/@lexical/offset": { @@ -1327,704 +920,268 @@ "@lexical/selection": "0.12.5", "@lexical/utils": "0.12.5", "lexical": "0.12.5" - } - }, - "node_modules/@lexical/react": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.12.5.tgz", - "integrity": "sha512-pAbJQksin223Yp1p1VsPKxkRtSppVij+HcLTzP89q2QuSA0z0p/T+f5jZjs8eV6tecMtmrjizhdLTbk0jkej1w==", - "dependencies": { - "@lexical/clipboard": "0.12.5", - "@lexical/code": "0.12.5", - "@lexical/dragon": "0.12.5", - "@lexical/hashtag": "0.12.5", - "@lexical/history": "0.12.5", - "@lexical/link": "0.12.5", - "@lexical/list": "0.12.5", - "@lexical/mark": "0.12.5", - "@lexical/markdown": "0.12.5", - "@lexical/overflow": "0.12.5", - "@lexical/plain-text": "0.12.5", - "@lexical/rich-text": "0.12.5", - "@lexical/selection": "0.12.5", - "@lexical/table": "0.12.5", - "@lexical/text": "0.12.5", - "@lexical/utils": "0.12.5", - "@lexical/yjs": "0.12.5", - "react-error-boundary": "^3.1.4" - }, - "peerDependencies": { - "lexical": "0.12.5", - "react": ">=17.x", - "react-dom": ">=17.x" - } - }, - "node_modules/@lexical/rich-text": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.12.5.tgz", - "integrity": "sha512-33R8ODRI5kKGbF70A/FWdISbbSPk+q4hKtiEJaV67zYPBuzrz0YHcni+tgKiykS05LgCksI/e43sfEkiykjrVQ==", - "peerDependencies": { - "@lexical/clipboard": "0.12.5", - "@lexical/selection": "0.12.5", - "@lexical/utils": "0.12.5", - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/selection": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.12.5.tgz", - "integrity": "sha512-oWJ87T4j6plf2yQzElOeudUyv7kdwTkuhzTZbcCTBNH/cSMdp55/Kv2doBynxhfHYEceuBKE7f8rci//T9DUPQ==", - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/table": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.12.5.tgz", - "integrity": "sha512-vgSTsjvGw+TrYYBmf3FR0kYJ+j1oOlBmrO1sqvuIrGPXKWmvYL+RbKIkm2xhtApVHVYgqfFvxNiZrPL5Wf9dXg==", - "dependencies": { - "@lexical/utils": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/text": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.12.5.tgz", - "integrity": "sha512-PU1ntXQCqon3HTjrEPl/HdKB/boyW36vKgiPvojoaAhBhkEnuiN+Pq9hrexORBcZPyLFp6wYoWXjKSO4fJVYeA==", - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/utils": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.12.5.tgz", - "integrity": "sha512-wPVyvi1Cvtf7aHwVKlG/9RlgHxSUzpGvXm87t889Rg7uZfOteyvXHJStjpSCZ3pvZ60y5ETin4OoetaVZciPfw==", - "dependencies": { - "@lexical/list": "0.12.5", - "@lexical/selection": "0.12.5", - "@lexical/table": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5" - } - }, - "node_modules/@lexical/yjs": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.12.5.tgz", - "integrity": "sha512-GNiRND/8ePdTWuSDFloPo/1355V0ce6OtH/25qxCq5D9MLNiIkAcwqQfnWFUdOtVMuNJOVc4OfCE9ARCGuEjyQ==", - "dependencies": { - "@lexical/offset": "0.12.5" - }, - "peerDependencies": { - "lexical": "0.12.5", - "yjs": ">=13.5.22" - } - }, - "node_modules/@mdx-js/mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", - "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@monaco-editor/loader": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz", - "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==", - "license": "MIT", - "dependencies": { - "state-local": "^1.0.6" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", - "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", - "license": "MIT", - "dependencies": { - "@monaco-editor/loader": "^1.5.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@remix-run/router": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.0.tgz", - "integrity": "sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", - "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", - "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", - "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", - "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", - "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", - "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", - "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", - "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", - "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", - "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", - "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", - "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", - "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", - "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", - "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", - "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", - "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", - "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", - "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "node_modules/@lexical/react": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.12.5.tgz", + "integrity": "sha512-pAbJQksin223Yp1p1VsPKxkRtSppVij+HcLTzP89q2QuSA0z0p/T+f5jZjs8eV6tecMtmrjizhdLTbk0jkej1w==", + "dependencies": { + "@lexical/clipboard": "0.12.5", + "@lexical/code": "0.12.5", + "@lexical/dragon": "0.12.5", + "@lexical/hashtag": "0.12.5", + "@lexical/history": "0.12.5", + "@lexical/link": "0.12.5", + "@lexical/list": "0.12.5", + "@lexical/mark": "0.12.5", + "@lexical/markdown": "0.12.5", + "@lexical/overflow": "0.12.5", + "@lexical/plain-text": "0.12.5", + "@lexical/rich-text": "0.12.5", + "@lexical/selection": "0.12.5", + "@lexical/table": "0.12.5", + "@lexical/text": "0.12.5", + "@lexical/utils": "0.12.5", + "@lexical/yjs": "0.12.5", + "react-error-boundary": "^3.1.4" + }, + "peerDependencies": { + "lexical": "0.12.5", + "react": ">=17.x", + "react-dom": ">=17.x" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", - "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "node_modules/@lexical/rich-text": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.12.5.tgz", + "integrity": "sha512-33R8ODRI5kKGbF70A/FWdISbbSPk+q4hKtiEJaV67zYPBuzrz0YHcni+tgKiykS05LgCksI/e43sfEkiykjrVQ==", + "peerDependencies": { + "@lexical/clipboard": "0.12.5", + "@lexical/selection": "0.12.5", + "@lexical/utils": "0.12.5", + "lexical": "0.12.5" + } }, - "node_modules/@swc/helpers": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", - "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", + "node_modules/@lexical/selection": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.12.5.tgz", + "integrity": "sha512-oWJ87T4j6plf2yQzElOeudUyv7kdwTkuhzTZbcCTBNH/cSMdp55/Kv2doBynxhfHYEceuBKE7f8rci//T9DUPQ==", + "peerDependencies": { + "lexical": "0.12.5" + } + }, + "node_modules/@lexical/table": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.12.5.tgz", + "integrity": "sha512-vgSTsjvGw+TrYYBmf3FR0kYJ+j1oOlBmrO1sqvuIrGPXKWmvYL+RbKIkm2xhtApVHVYgqfFvxNiZrPL5Wf9dXg==", "dependencies": { - "tslib": "^2.4.0" + "@lexical/utils": "0.12.5" + }, + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@tailwindcss/node": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.14.tgz", - "integrity": "sha512-Ux9NbFkKWYE4rfUFz6M5JFLs/GEYP6ysxT8uSyPn6aTbh2K3xDE1zz++eVK4Vwx799fzMF8CID9sdHn4j/Ab8w==", - "dev": true, - "license": "MIT", + "node_modules/@lexical/text": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.12.5.tgz", + "integrity": "sha512-PU1ntXQCqon3HTjrEPl/HdKB/boyW36vKgiPvojoaAhBhkEnuiN+Pq9hrexORBcZPyLFp6wYoWXjKSO4fJVYeA==", + "peerDependencies": { + "lexical": "0.12.5" + } + }, + "node_modules/@lexical/utils": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.12.5.tgz", + "integrity": "sha512-wPVyvi1Cvtf7aHwVKlG/9RlgHxSUzpGvXm87t889Rg7uZfOteyvXHJStjpSCZ3pvZ60y5ETin4OoetaVZciPfw==", "dependencies": { - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "tailwindcss": "4.0.14" + "@lexical/list": "0.12.5", + "@lexical/selection": "0.12.5", + "@lexical/table": "0.12.5" + }, + "peerDependencies": { + "lexical": "0.12.5" } }, - "node_modules/@tailwindcss/node/node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" + "node_modules/@lexical/yjs": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.12.5.tgz", + "integrity": "sha512-GNiRND/8ePdTWuSDFloPo/1355V0ce6OtH/25qxCq5D9MLNiIkAcwqQfnWFUdOtVMuNJOVc4OfCE9ARCGuEjyQ==", + "dependencies": { + "@lexical/offset": "0.12.5" + }, + "peerDependencies": { + "lexical": "0.12.5", + "yjs": ">=13.5.22" } }, - "node_modules/@tailwindcss/oxide": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.14.tgz", - "integrity": "sha512-M8VCNyO/NBi5vJ2cRcI9u8w7Si+i76a7o1vveoGtbbjpEYJZYiyc7f2VGps/DqawO56l3tImIbq2OT/533jcrA==", - "dev": true, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "license": "MIT", - "engines": { - "node": ">= 10" + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.0.14", - "@tailwindcss/oxide-darwin-arm64": "4.0.14", - "@tailwindcss/oxide-darwin-x64": "4.0.14", - "@tailwindcss/oxide-freebsd-x64": "4.0.14", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.14", - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.14", - "@tailwindcss/oxide-linux-arm64-musl": "4.0.14", - "@tailwindcss/oxide-linux-x64-gnu": "4.0.14", - "@tailwindcss/oxide-linux-x64-musl": "4.0.14", - "@tailwindcss/oxide-win32-arm64-msvc": "4.0.14", - "@tailwindcss/oxide-win32-x64-msvc": "4.0.14" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.14.tgz", - "integrity": "sha512-VBFKC2rFyfJ5J8lRwjy6ub3rgpY186kAcYgiUr8ArR8BAZzMruyeKJ6mlsD22Zp5ZLcPW/FXMasJiJBx0WsdQg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@monaco-editor/loader": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz", + "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "state-local": "^1.0.6" } }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.14.tgz", - "integrity": "sha512-U3XOwLrefGr2YQZ9DXasDSNWGPZBCh8F62+AExBEDMLDfvLLgI/HDzY8Oq8p/JtqkAY38sWPOaNnRwEGKU5Zmg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.14.tgz", - "integrity": "sha512-V5AjFuc3ndWGnOi1d379UsODb0TzAS2DYIP/lwEbfvafUaD2aNZIcbwJtYu2DQqO2+s/XBvDVA+w4yUyaewRwg==", - "cpu": [ - "x64" - ], + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.14.tgz", - "integrity": "sha512-tXvtxbaZfcPfqBwW3f53lTcyH6EDT+1eT7yabwcfcxTs+8yTPqxsDUhrqe9MrnEzpNkd+R/QAjJapfd4tjWdLg==", - "cpu": [ - "x64" - ], + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.14.tgz", - "integrity": "sha512-cSeLNWWqIWeSTmBntQvyY2/2gcLX8rkPFfDDTQVF8qbRcRMVPLxBvFVJyfSAYRNch6ZyVH2GI6dtgALOBDpdNA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.14.tgz", - "integrity": "sha512-bwDWLBalXFMDItcSXzFk6y7QKvj6oFlaY9vM+agTlwFL1n1OhDHYLZkSjaYsh6KCeG0VB0r7H8PUJVOM1LRZyg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@remix-run/router": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.0.tgz", + "integrity": "sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A==", "engines": { - "node": ">= 10" + "node": ">=14.0.0" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.14.tgz", - "integrity": "sha512-gVkJdnR/L6iIcGYXx64HGJRmlme2FGr/aZH0W6u4A3RgPMAb+6ELRLi+UBiH83RXBm9vwCfkIC/q8T51h8vUJQ==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", + "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "win32" + ] + }, + "node_modules/@swc/helpers": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", + "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "node_modules/@tailwindcss/node": { "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.14.tgz", - "integrity": "sha512-EE+EQ+c6tTpzsg+LGO1uuusjXxYx0Q00JE5ubcIGfsogSKth8n8i2BcS2wYTQe4jXGs+BQs35l78BIPzgwLddw==", - "cpu": [ - "x64" - ], + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.14.tgz", + "integrity": "sha512-Ux9NbFkKWYE4rfUFz6M5JFLs/GEYP6ysxT8uSyPn6aTbh2K3xDE1zz++eVK4Vwx799fzMF8CID9sdHn4j/Ab8w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.14" } }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.14.tgz", - "integrity": "sha512-KCCOzo+L6XPT0oUp2Jwh233ETRQ/F6cwUnMnR0FvMUCbkDAzHbcyOgpfuAtRa5HD0WbTbH4pVD+S0pn1EhNfbw==", - "cpu": [ - "x64" - ], + "node_modules/@tailwindcss/node/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "node_modules/@tailwindcss/oxide": { "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.14.tgz", - "integrity": "sha512-AHObFiFL9lNYcm3tZSPqa/cHGpM5wOrNmM2uOMoKppp+0Hom5uuyRh0QkOp7jftsHZdrZUpmoz0Mp6vhh2XtUg==", - "cpu": [ - "arm64" - ], + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.14.tgz", + "integrity": "sha512-M8VCNyO/NBi5vJ2cRcI9u8w7Si+i76a7o1vveoGtbbjpEYJZYiyc7f2VGps/DqawO56l3tImIbq2OT/533jcrA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-x64": "4.0.14", + "@tailwindcss/oxide-freebsd-x64": "4.0.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-x64-musl": "4.0.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.14" } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { @@ -3903,21 +3060,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4969,195 +4111,6 @@ "lightningcss-win32-x64-msvc": "1.29.2" } }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lightningcss-win32-x64-msvc": { "version": "1.29.2", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", @@ -6323,6 +5276,15 @@ "node": "*" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", diff --git a/package.json b/package.json index 284ffef31..a2f2f4ce6 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "jszip": "^3.10.1", "lexical": "^0.12.5", "nanoid": "^5.1.5", + "moment": "^2.30.1", "node-sql-parser": "^5.3.11", "oracle-sql-parser": "^0.1.0", "react": "^18.2.0", diff --git a/src/api/gists.js b/src/api/gists.js index 1a3cd4058..3f931b3f0 100644 --- a/src/api/gists.js +++ b/src/api/gists.js @@ -32,3 +32,17 @@ export async function get(gistId) { return res.data; } + +export async function getCommits(gistId, perPage = 20, page = 1) { + const res = await octokit.request( + `GET /gists/${gistId}/commits?per_page=${perPage}&page=${page}`, + { + gist_id: gistId, + headers: { + "X-GitHub-Api-Version": "2022-11-28", + }, + }, + ); + + return res.data; +} diff --git a/src/components/EditorHeader/SideSheet/Revisions.jsx b/src/components/EditorHeader/SideSheet/Revisions.jsx index 9d23e2135..779bb55dd 100644 --- a/src/components/EditorHeader/SideSheet/Revisions.jsx +++ b/src/components/EditorHeader/SideSheet/Revisions.jsx @@ -1,17 +1,40 @@ import { useContext, useEffect, useState } from "react"; import { IdContext } from "../../Workspace"; import { useTranslation } from "react-i18next"; -import { Button, Spin } from "@douyinfe/semi-ui"; -import { IconPlus } from "@douyinfe/semi-icons"; +import { Button, IconButton, Spin, Steps, Tag, Toast } from "@douyinfe/semi-ui"; +import { + IconPlus, + IconChevronRight, + IconChevronLeft, +} from "@douyinfe/semi-icons"; +import * as gists from "../../../api/gists"; +import moment from "moment"; -export default function Revisions() { +export default function Revisions({ open }) { const { gistId } = useContext(IdContext); const { t } = useTranslation(); - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(false); + const [revisions, setRevisions] = useState([]); useEffect(() => { - setIsLoading(false); - }, []); + const getRevisions = async (gistId) => { + setIsLoading(true); + try { + const gist = await gists.getCommits(gistId); + setRevisions(gist); + console.log(gist); + } catch (e) { + console.log(e); + Toast.error(t("oops_smth_went_wrong")); + } finally { + setIsLoading(false); + } + }; + + if (gistId && open) { + getRevisions(gistId); + } + }, [gistId, t, open]); if (gistId && isLoading) { return ( @@ -23,11 +46,44 @@ export default function Revisions() { } return ( -
- +
+
+ } /> + + } /> +
{!gistId &&
{t("no_saved_revisions")}
} + {gistId && ( +
+ console.log(i)} + > + {revisions.map((r, i) => ( + + {`${t("version")} ${revisions.length - i}`} + {r.version.substring(0, 7)} +
+ } + description={ +
+
{`Commited on ${moment( + new Date(r.committed_at), + ).format("MMMM Do YYYY, h:mm")}`}
+
+ } + icon={} + /> + ))} + +
+ )}
); } diff --git a/src/components/EditorHeader/SideSheet/Sidesheet.jsx b/src/components/EditorHeader/SideSheet/Sidesheet.jsx index 9e1c51f4e..f3784aad8 100644 --- a/src/components/EditorHeader/SideSheet/Sidesheet.jsx +++ b/src/components/EditorHeader/SideSheet/Sidesheet.jsx @@ -28,7 +28,7 @@ export default function Sidesheet({ type, onClose }) { case SIDESHEET.TODO: return ; case SIDESHEET.REVISIONS: - return ; + return ; default: break; } diff --git a/src/components/EditorHeader/SideSheet/Versions.jsx b/src/components/EditorHeader/SideSheet/Versions.jsx new file mode 100644 index 000000000..f2fce4b87 --- /dev/null +++ b/src/components/EditorHeader/SideSheet/Versions.jsx @@ -0,0 +1,195 @@ +import { useCallback, useContext, useEffect, useState } from "react"; +import { IdContext } from "../../Workspace"; +import { useTranslation } from "react-i18next"; +import { Button, IconButton, Spin, Steps, Tag, Toast } from "@douyinfe/semi-ui"; +import { + IconPlus, + IconChevronRight, + IconChevronLeft, +} from "@douyinfe/semi-icons"; +import { + create, + getCommitsWithFile, + getVersion, + patch, + VERSION_FILENAME, +} from "../../../api/gists"; +import { DateTime } from "luxon"; +import { + useAreas, + useDiagram, + useEnums, + useLayout, + useNotes, + useTransform, + useTypes, +} from "../../../hooks"; +import { databases } from "../../../data/databases"; + +export default function Versions({ open, title, setTitle }) { + const { gistId, setVersion } = useContext(IdContext); + const { areas, setAreas } = useAreas(); + const { setLayout } = useLayout(); + const { database, tables, relationships, setTables, setRelationships } = + useDiagram(); + const { notes, setNotes } = useNotes(); + const { types, setTypes } = useTypes(); + const { enums, setEnums } = useEnums(); + const { transform } = useTransform(); + const { t, i18n } = useTranslation(); + const [isLoading, setIsLoading] = useState(false); + const [versions, setVersions] = useState([]); + + const diagramToString = useCallback(() => { + return JSON.stringify({ + title, + tables, + relationships: relationships, + notes: notes, + subjectAreas: areas, + database: database, + ...(databases[database].hasTypes && { types: types }), + ...(databases[database].hasEnums && { enums: enums }), + transform: transform, + }); + }, [ + areas, + notes, + tables, + relationships, + database, + title, + enums, + types, + transform, + ]); + + const loadVersion = useCallback( + async (sha) => { + try { + const version = await getVersion(gistId, sha); + setVersion(sha); + setLayout((prev) => ({ ...prev, readOnly: true })); + + const content = version.data.files[VERSION_FILENAME].content; + + const parsedDiagram = JSON.parse(content); + + setTables(parsedDiagram.tables); + setRelationships(parsedDiagram.relationships); + setAreas(parsedDiagram.subjectAreas); + setNotes(parsedDiagram.notes); + setTitle(parsedDiagram.title); + + if (databases[database].hasTypes) { + setTypes(parsedDiagram.types); + } + + if (databases[database].hasEnums) { + setEnums(parsedDiagram.enums); + } + } catch (e) { + console.log(e); + Toast.error("failed_to_load_diagram"); + } + }, + [ + gistId, + setTables, + setRelationships, + setAreas, + setVersion, + setLayout, + database, + setNotes, + setTypes, + setEnums, + setTitle, + ], + ); + + const getRevisions = useCallback( + async (gistId) => { + try { + setIsLoading(true); + const { data } = await getCommitsWithFile(gistId, VERSION_FILENAME); + setVersions( + data.filter((version) => version.change_status.total !== 0), + ); + } catch (e) { + console.log(e); + Toast.error(t("oops_smth_went_wrong")); + } finally { + setIsLoading(false); + } + }, + [t], + ); + + const recordVersion = async () => { + try { + if (gistId) { + await patch(gistId, VERSION_FILENAME, diagramToString()); + } else { + await create(VERSION_FILENAME, diagramToString()); + } + await getRevisions(gistId); + } catch (e) { + Toast.error("failed_to_record_version"); + } + }; + + useEffect(() => { + if (gistId && open) { + getRevisions(gistId); + } + }, [gistId, getRevisions, open]); + + return ( +
+
+ } title="Previous" /> + + } title="Next" /> +
+ {isLoading ? ( +
+ +
{t("loading")}
+
+ ) : ( + <> + {(!gistId || !versions.length) && ( +
{t("no_saved_versions")}
+ )} + {gistId && ( +
+ + {versions.map((r, i) => ( + loadVersion(r.version)} + title={ +
+ {`${t("version")} ${versions.length - i}`} + {r.version.substring(0, 7)} +
+ } + description={`${t("commited_at")} ${DateTime.fromISO( + r.committed_at, + ) + .setLocale(i18n.language) + .toLocaleString(DateTime.DATETIME_MED)}`} + icon={} + /> + ))} +
+
+ )} + + )} +
+ ); +} diff --git a/src/i18n/locales/en.js b/src/i18n/locales/en.js index b298f0e73..46df0aba5 100644 --- a/src/i18n/locales/en.js +++ b/src/i18n/locales/en.js @@ -260,6 +260,8 @@ const en = { many_side_label: "Many(n) side label", revisions: "Revisions", no_saved_revisions: "No saved revisions", + version: "Version", + record_version: "Record version", }, }; diff --git a/src/index.css b/src/index.css index e0b3da508..0edbc6375 100644 --- a/src/index.css +++ b/src/index.css @@ -67,7 +67,12 @@ background-color: rgba(var(--semi-blue-6), 1); } -.semi-spin-wrapper { +.semi-steps-item-content, +.semi-steps-item-title { + width: 100%; +} + +.semi-spin-wrapper { color: inherit; } From 59dd4e0c4d70a742367f60c91f46ac93100849bd Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Sun, 13 Jul 2025 16:42:15 +0400 Subject: [PATCH 04/17] update getCommits and clean up --- src/api/gists.js | 15 +++++----- .../EditorHeader/SideSheet/Revisions.jsx | 7 ++--- src/components/Workspace.jsx | 29 +++++++++---------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/api/gists.js b/src/api/gists.js index 3f931b3f0..64ec45981 100644 --- a/src/api/gists.js +++ b/src/api/gists.js @@ -34,15 +34,14 @@ export async function get(gistId) { } export async function getCommits(gistId, perPage = 20, page = 1) { - const res = await octokit.request( - `GET /gists/${gistId}/commits?per_page=${perPage}&page=${page}`, - { - gist_id: gistId, - headers: { - "X-GitHub-Api-Version": "2022-11-28", - }, + const res = await axios.get(`${baseUrl}/gists/${gistId}/commits`, { + params: { + per_page: perPage, + page, }, - ); + }); + + console.log(res) return res.data; } diff --git a/src/components/EditorHeader/SideSheet/Revisions.jsx b/src/components/EditorHeader/SideSheet/Revisions.jsx index 779bb55dd..936788934 100644 --- a/src/components/EditorHeader/SideSheet/Revisions.jsx +++ b/src/components/EditorHeader/SideSheet/Revisions.jsx @@ -7,7 +7,7 @@ import { IconChevronRight, IconChevronLeft, } from "@douyinfe/semi-icons"; -import * as gists from "../../../api/gists"; +import { getCommits } from "../../../api/gists"; import moment from "moment"; export default function Revisions({ open }) { @@ -20,9 +20,8 @@ export default function Revisions({ open }) { const getRevisions = async (gistId) => { setIsLoading(true); try { - const gist = await gists.getCommits(gistId); - setRevisions(gist); - console.log(gist); + const { data } = await getCommits(gistId); + setRevisions(data); } catch (e) { console.log(e); Toast.error(t("oops_smth_went_wrong")); diff --git a/src/components/Workspace.jsx b/src/components/Workspace.jsx index 1f3a220b2..a9792027c 100644 --- a/src/components/Workspace.jsx +++ b/src/components/Workspace.jsx @@ -287,25 +287,24 @@ export default function WorkSpace() { const loadFromGist = async (shareId) => { try { - const gist = await get(shareId); - const diagramSrc = gist.files["share.json"].content; - const d = JSON.parse(diagramSrc); - setGistId(shareId); + const { data } = await get(shareId); + const parsedDiagram = JSON.parse(data.files["share.json"].content); setUndoStack([]); setRedoStack([]); + setGistId(shareId); setLoadedFromGistId(shareId); - setDatabase(d.database); - setTitle(d.title); - setTables(d.tables); - setRelationships(d.relationships); - setNotes(d.notes); - setAreas(d.subjectAreas); - setTransform(d.transform); - if (databases[d.database].hasTypes) { - setTypes(d.types ?? []); + setDatabase(parsedDiagram.database); + setTitle(parsedDiagram.title); + setTables(parsedDiagram.tables); + setRelationships(parsedDiagram.relationships); + setNotes(parsedDiagram.notes); + setAreas(parsedDiagram.subjectAreas); + setTransform(parsedDiagram.transform); + if (databases[parsedDiagram.database].hasTypes) { + setTypes(parsedDiagram.types ?? []); } - if (databases[d.database].hasEnums) { - setEnums(d.enums ?? []); + if (databases[parsedDiagram.database].hasEnums) { + setEnums(parsedDiagram.enums ?? []); } } catch (e) { console.log(e); From 8f121667f108554de37ea594260cb330564ed4d1 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Wed, 16 Jul 2025 20:37:53 +0400 Subject: [PATCH 05/17] update date localization --- package-lock.json | 20 +++++------ package.json | 2 +- src/api/gists.js | 2 -- src/components/EditorHeader/Modal/Share.jsx | 1 - .../EditorHeader/SideSheet/Revisions.jsx | 35 +++++++++---------- src/i18n/i18n.js | 14 ++++---- src/i18n/locales/en.js | 4 ++- src/index.css | 2 +- 8 files changed, 39 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb17a5e2b..558d2282f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "jspdf": "^3.0.1", "jszip": "^3.10.1", "lexical": "^0.12.5", - "moment": "^2.30.1", + "luxon": "^3.7.1", "nanoid": "^5.1.5", "node-sql-parser": "^5.3.11", "oracle-sql-parser": "^0.1.0", @@ -4205,6 +4205,15 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -5276,15 +5285,6 @@ "node": "*" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", diff --git a/package.json b/package.json index a2f2f4ce6..f60b0f50b 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,8 @@ "jspdf": "^3.0.1", "jszip": "^3.10.1", "lexical": "^0.12.5", + "luxon": "^3.7.1", "nanoid": "^5.1.5", - "moment": "^2.30.1", "node-sql-parser": "^5.3.11", "oracle-sql-parser": "^0.1.0", "react": "^18.2.0", diff --git a/src/api/gists.js b/src/api/gists.js index 64ec45981..d62c79e83 100644 --- a/src/api/gists.js +++ b/src/api/gists.js @@ -41,7 +41,5 @@ export async function getCommits(gistId, perPage = 20, page = 1) { }, }); - console.log(res) - return res.data; } diff --git a/src/components/EditorHeader/Modal/Share.jsx b/src/components/EditorHeader/Modal/Share.jsx index b72e2966f..87f843c00 100644 --- a/src/components/EditorHeader/Modal/Share.jsx +++ b/src/components/EditorHeader/Modal/Share.jsx @@ -66,7 +66,6 @@ export default function Share({ title, setModal }) { useEffect(() => { const updateOrGenerateLink = async () => { - setLoading(true); try { setLoading(true); if (!gistId || gistId === "") { diff --git a/src/components/EditorHeader/SideSheet/Revisions.jsx b/src/components/EditorHeader/SideSheet/Revisions.jsx index 936788934..ca1fc5a2b 100644 --- a/src/components/EditorHeader/SideSheet/Revisions.jsx +++ b/src/components/EditorHeader/SideSheet/Revisions.jsx @@ -8,20 +8,22 @@ import { IconChevronLeft, } from "@douyinfe/semi-icons"; import { getCommits } from "../../../api/gists"; -import moment from "moment"; +import { DateTime } from "luxon"; export default function Revisions({ open }) { const { gistId } = useContext(IdContext); - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const [isLoading, setIsLoading] = useState(false); const [revisions, setRevisions] = useState([]); useEffect(() => { const getRevisions = async (gistId) => { - setIsLoading(true); try { + setIsLoading(true); const { data } = await getCommits(gistId); - setRevisions(data); + setRevisions( + data.filter((version) => version.change_status.total !== 0), + ); } catch (e) { console.log(e); Toast.error(t("oops_smth_went_wrong")); @@ -47,36 +49,33 @@ export default function Revisions({ open }) { return (
- } /> + } title="Previous" /> - } /> + } title="Next" />
{!gistId &&
{t("no_saved_revisions")}
} {gistId && (
- console.log(i)} - > + {revisions.map((r, i) => ( { + alert(r.version); + }} title={
{`${t("version")} ${revisions.length - i}`} {r.version.substring(0, 7)}
} - description={ -
-
{`Commited on ${moment( - new Date(r.committed_at), - ).format("MMMM Do YYYY, h:mm")}`}
-
- } + description={`${t("commited_at")} ${DateTime.fromISO( + r.committed_at, + ) + .setLocale(i18n.language) + .toLocaleString(DateTime.DATETIME_MED)}`} icon={} /> ))} diff --git a/src/i18n/i18n.js b/src/i18n/i18n.js index c78cff2bc..aabbdb016 100644 --- a/src/i18n/i18n.js +++ b/src/i18n/i18n.js @@ -35,10 +35,10 @@ import { pl, polish } from "./locales/pl"; import { no, norwegian } from "./locales/no"; import { sv, swedish } from "./locales/sv-se"; import { ur, urdu } from "./locales/ur"; -import { jp, japanese} from "./locales/jp" -import {ne, nepali} from "./locales/ne" -import {ug, uyghur} from "./locales/ug"; -import {pa_pk,punjabipk } from "./locales/pa-pk"; +import { jp, japanese } from "./locales/jp"; +import { ne, nepali } from "./locales/ne"; +import { ug, uyghur } from "./locales/ug"; +import { pa_pk, punjabipk } from "./locales/pa-pk"; import { cz, czech } from "./locales/cz"; export const languages = [ @@ -80,7 +80,7 @@ export const languages = [ nepali, uyghur, punjabipk, - czech + czech, ].sort((a, b) => a.name.localeCompare(b.name)); i18n @@ -130,8 +130,8 @@ i18n jp, ne, ug, - "pa-PK":pa_pk, - cz + "pa-PK": pa_pk, + cz, }, }); diff --git a/src/i18n/locales/en.js b/src/i18n/locales/en.js index 46df0aba5..872e3f12f 100644 --- a/src/i18n/locales/en.js +++ b/src/i18n/locales/en.js @@ -9,7 +9,8 @@ const en = { report_bug: "Report a bug", import: "Import", inherits: "Inherits", - merging_column_w_inherited_definition: "Column '{{fieldName}}' in table '{{tableName}}' with inherited definition will be merged", + merging_column_w_inherited_definition: + "Column '{{fieldName}}' in table '{{tableName}}' with inherited definition will be merged", import_from: "Import from", file: "File", new: "New", @@ -262,6 +263,7 @@ const en = { no_saved_revisions: "No saved revisions", version: "Version", record_version: "Record version", + commited_at: "Commited at", }, }; diff --git a/src/index.css b/src/index.css index 0edbc6375..697313f67 100644 --- a/src/index.css +++ b/src/index.css @@ -69,7 +69,7 @@ .semi-steps-item-content, .semi-steps-item-title { - width: 100%; + width: 100% !important; } .semi-spin-wrapper { From b9da7e618f59206164a0dc20f6cb5c2951802042 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Sat, 19 Jul 2025 21:11:58 +0400 Subject: [PATCH 06/17] load diagram in read only mode from previous version --- src/api/gists.js | 6 +++ src/components/EditorCanvas/Area.jsx | 3 ++ src/components/EditorCanvas/Canvas.jsx | 11 +++-- src/components/EditorHeader/ControlPanel.jsx | 48 ++++++++++++------- src/components/EditorHeader/Modal/Rename.jsx | 3 ++ .../EditorHeader/Modal/SetTableWidth.jsx | 4 +- src/components/EditorHeader/Modal/Share.jsx | 2 +- .../EditorHeader/SideSheet/Revisions.jsx | 36 +++++++++++--- .../EditorSidePanel/AreasTab/AreaDetails.jsx | 8 +++- .../EditorSidePanel/ColorPicker.jsx | 4 +- .../EditorSidePanel/EnumsTab/EnumDetails.jsx | 13 +++-- .../EditorSidePanel/EnumsTab/EnumsTab.jsx | 10 +++- .../EditorSidePanel/NotesTab/NoteInfo.jsx | 9 +++- .../EditorSidePanel/NotesTab/NotesTab.jsx | 10 +++- .../RelationshipsTab/RelationshipInfo.jsx | 14 ++++-- .../TablesTab/FieldDetails.jsx | 19 ++++++-- .../TablesTab/IndexDetails.jsx | 12 +++-- .../EditorSidePanel/TablesTab/TableField.jsx | 22 +++++++-- .../EditorSidePanel/TablesTab/TableInfo.jsx | 20 ++++++-- .../EditorSidePanel/TablesTab/TablesTab.jsx | 14 ++++-- .../EditorSidePanel/TypesTab/TypeField.jsx | 23 +++++++-- .../EditorSidePanel/TypesTab/TypeInfo.jsx | 11 +++-- .../EditorSidePanel/TypesTab/TypesTab.jsx | 10 +++- src/components/SortableList/DragHandle.jsx | 7 +-- src/components/Workspace.jsx | 40 +++++++++++++--- src/context/LayoutContext.jsx | 1 + 26 files changed, 281 insertions(+), 79 deletions(-) diff --git a/src/api/gists.js b/src/api/gists.js index d62c79e83..87c15e9d1 100644 --- a/src/api/gists.js +++ b/src/api/gists.js @@ -43,3 +43,9 @@ export async function getCommits(gistId, perPage = 20, page = 1) { return res.data; } + +export async function getVersion(gistId, sha) { + const res = await axios.get(`${baseUrl}/gists/${gistId}/${sha}`); + + return res.data; +} diff --git a/src/components/EditorCanvas/Area.jsx b/src/components/EditorCanvas/Area.jsx index 4af88b60e..c031e5246 100644 --- a/src/components/EditorCanvas/Area.jsx +++ b/src/components/EditorCanvas/Area.jsx @@ -257,6 +257,7 @@ function EditPopoverContent({ data }) { const { updateArea, deleteArea } = useAreas(); const { setUndoStack, setRedoStack } = useUndoRedo(); const { t } = useTranslation(); + const {layout} = useLayout(); const initialColorRef = useRef(data.color); const handleColorPick = (color) => { @@ -302,6 +303,7 @@ function EditPopoverContent({ data }) { value={data.name} placeholder={t("name")} className="me-2" + readOnly={layout.readOnly} onChange={(value) => updateArea(data.id, { name: value })} onFocus={(e) => setEditField({ name: e.target.value })} onBlur={(e) => { @@ -325,6 +327,7 @@ function EditPopoverContent({ data }) { /> updateArea(data.id, { color })} onColorPick={(color) => handleColorPick(color)} diff --git a/src/components/EditorCanvas/Canvas.jsx b/src/components/EditorCanvas/Canvas.jsx index d37cfe0e4..7f8fc983e 100644 --- a/src/components/EditorCanvas/Canvas.jsx +++ b/src/components/EditorCanvas/Canvas.jsx @@ -279,21 +279,24 @@ export default function Canvas() { if (!e.isPrimary) return; + if (panning.isPanning) { setTransform((prev) => ({ ...prev, pan: { x: - panning.panStart.x + - (panning.cursorStart.x - pointer.spaces.screen.x) / transform.zoom, + panning.panStart.x + + (panning.cursorStart.x - pointer.spaces.screen.x) / transform.zoom, y: - panning.panStart.y + - (panning.cursorStart.y - pointer.spaces.screen.y) / transform.zoom, + panning.panStart.y + + (panning.cursorStart.y - pointer.spaces.screen.y) / transform.zoom, }, })); return; } + if(layout.readOnly) return; + if (linking) { setLinkingLine({ ...linkingLine, diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx index bc77c5fd7..8e6ebbee0 100644 --- a/src/components/EditorHeader/ControlPanel.jsx +++ b/src/components/EditorHeader/ControlPanel.jsx @@ -126,7 +126,7 @@ export default function ControlPanel({ const { selectedElement, setSelectedElement } = useSelect(); const { transform, setTransform } = useTransform(); const { t, i18n } = useTranslation(); - const { setGistId } = useContext(IdContext); + const { version, setGistId } = useContext(IdContext); const navigate = useNavigate(); const invertLayout = (component) => @@ -1751,7 +1751,7 @@ export default function ControlPanel({ /> )}
e.isPrimary && setShowEditName(true)} onPointerLeave={(e) => e.isPrimary && setShowEditName(false)} onPointerDown={(e) => { @@ -1761,12 +1761,20 @@ export default function ControlPanel({ }} onClick={() => setModal(MODAL.RENAME)} > - {window.name.split(" ")[0] === "t" ? "Templates/" : "Diagrams/"} - {title} + + {(window.name.split(" ")[0] === "t" + ? "Templates/" + : "Diagrams/") + title} + + {version && ( + + {version.substring(0, 7)} + + )}
{(showEditName || modal === MODAL.RENAME) && }
-
+
{Object.keys(menu).map((category) => ( ))}
- + {layout.readOnly && ( + + {t("read_only")} + + )} + {!layout.readOnly && ( + + ) : null + } + > + {getState()} + + )}
diff --git a/src/components/EditorHeader/Modal/Rename.jsx b/src/components/EditorHeader/Modal/Rename.jsx index 522d5e63d..3a8861e96 100644 --- a/src/components/EditorHeader/Modal/Rename.jsx +++ b/src/components/EditorHeader/Modal/Rename.jsx @@ -1,14 +1,17 @@ import { Input } from "@douyinfe/semi-ui"; import { useTranslation } from "react-i18next"; +import { useLayout } from "../../../hooks"; export default function Rename({ title, setTitle }) { const { t } = useTranslation(); + const { layout } = useLayout(); return ( setTitle(v)} + readonly={layout.readOnly} /> ); } diff --git a/src/components/EditorHeader/Modal/SetTableWidth.jsx b/src/components/EditorHeader/Modal/SetTableWidth.jsx index 93482e68e..aed463c2f 100644 --- a/src/components/EditorHeader/Modal/SetTableWidth.jsx +++ b/src/components/EditorHeader/Modal/SetTableWidth.jsx @@ -1,13 +1,15 @@ import { InputNumber } from "@douyinfe/semi-ui"; -import { useSettings } from "../../../hooks"; +import { useLayout, useSettings } from "../../../hooks"; export default function SetTableWidth() { + const { layout } = useLayout(); const { settings, setSettings } = useSettings(); return ( { if (c < 180) return; setSettings((prev) => ({ ...prev, tableWidth: c })); diff --git a/src/components/EditorHeader/Modal/Share.jsx b/src/components/EditorHeader/Modal/Share.jsx index 87f843c00..582669722 100644 --- a/src/components/EditorHeader/Modal/Share.jsx +++ b/src/components/EditorHeader/Modal/Share.jsx @@ -116,7 +116,7 @@ export default function Share({ title, setModal }) { {!error && ( <>
- +
{t("share_info")}
diff --git a/src/components/EditorHeader/SideSheet/Revisions.jsx b/src/components/EditorHeader/SideSheet/Revisions.jsx index ca1fc5a2b..4a312efc3 100644 --- a/src/components/EditorHeader/SideSheet/Revisions.jsx +++ b/src/components/EditorHeader/SideSheet/Revisions.jsx @@ -1,4 +1,4 @@ -import { useContext, useEffect, useState } from "react"; +import { useCallback, useContext, useEffect, useState } from "react"; import { IdContext } from "../../Workspace"; import { useTranslation } from "react-i18next"; import { Button, IconButton, Spin, Steps, Tag, Toast } from "@douyinfe/semi-ui"; @@ -7,15 +7,41 @@ import { IconChevronRight, IconChevronLeft, } from "@douyinfe/semi-icons"; -import { getCommits } from "../../../api/gists"; +import { getCommits, getVersion } from "../../../api/gists"; import { DateTime } from "luxon"; +import { useAreas, useDiagram, useLayout } from "../../../hooks"; export default function Revisions({ open }) { - const { gistId } = useContext(IdContext); + const { gistId, setVersion } = useContext(IdContext); + const { setAreas } = useAreas(); + const { setLayout } = useLayout(); + const { setTables, setRelationships } = useDiagram(); const { t, i18n } = useTranslation(); const [isLoading, setIsLoading] = useState(false); const [revisions, setRevisions] = useState([]); + const loadVersion = useCallback( + async (sha) => { + try { + const version = await getVersion(gistId, sha); + setVersion(sha); + setLayout((prev) => ({ ...prev, readOnly: true })); + + const content = version.data.files["share.json"].content; + + const parsedDiagram = JSON.parse(content); + + setTables(parsedDiagram.tables); + setRelationships(parsedDiagram.relationships); + setAreas(parsedDiagram.subjectAreas); + } catch (e) { + console.log(e); + Toast.error("failed_to_load_diagram"); + } + }, + [gistId, setTables, setRelationships, setAreas, setVersion, setLayout], + ); + useEffect(() => { const getRevisions = async (gistId) => { try { @@ -62,9 +88,7 @@ export default function Revisions({ open }) { {revisions.map((r, i) => ( { - alert(r.version); - }} + onClick={() => loadVersion(r.version)} title={
{`${t("version")} ${revisions.length - i}`} diff --git a/src/components/EditorSidePanel/AreasTab/AreaDetails.jsx b/src/components/EditorSidePanel/AreasTab/AreaDetails.jsx index 7686263fc..de677e71a 100644 --- a/src/components/EditorSidePanel/AreasTab/AreaDetails.jsx +++ b/src/components/EditorSidePanel/AreasTab/AreaDetails.jsx @@ -2,12 +2,13 @@ import { useState, useRef } from "react"; import { Button, Input } from "@douyinfe/semi-ui"; import ColorPicker from "../ColorPicker"; import { IconDeleteStroked } from "@douyinfe/semi-icons"; -import { useAreas, useUndoRedo } from "../../../hooks"; +import { useAreas, useLayout, useUndoRedo } from "../../../hooks"; import { Action, ObjectType } from "../../../data/constants"; import { useTranslation } from "react-i18next"; export default function AreaInfo({ data, i }) { const { t } = useTranslation(); + const { layout } = useLayout(); const { deleteArea, updateArea } = useAreas(); const { setUndoStack, setRedoStack } = useUndoRedo(); const [editField, setEditField] = useState({}); @@ -53,6 +54,7 @@ export default function AreaInfo({ data, i }) { updateArea(data.id, { name: value })} onFocus={(e) => setEditField({ name: e.target.value })} onBlur={(e) => { @@ -77,12 +79,14 @@ export default function AreaInfo({ data, i }) { updateArea(i, { color })} onColorPick={(color) => handleColorPick(color)} />
diff --git a/src/components/EditorSidePanel/ColorPicker.jsx b/src/components/EditorSidePanel/ColorPicker.jsx index c0ed31225..3bb4959c3 100644 --- a/src/components/EditorSidePanel/ColorPicker.jsx +++ b/src/components/EditorSidePanel/ColorPicker.jsx @@ -2,8 +2,9 @@ import { ColorPicker as SemiColorPicker } from "@douyinfe/semi-ui"; import { useState } from "react"; export default function ColorPicker({ - children, value, + readOnly, + children, onChange, onColorPick, ...props @@ -25,6 +26,7 @@ export default function ColorPicker({ {...props} value={SemiColorPicker.colorStringToValue(value)} onChange={({ hex: color }) => { + if (readOnly) return; setPickedColor(color); onChange(color); }} diff --git a/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx b/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx index c84e18e04..4500275d3 100644 --- a/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx +++ b/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx @@ -1,12 +1,13 @@ import { useState } from "react"; import { Button, Input, TagInput } from "@douyinfe/semi-ui"; import { IconDeleteStroked } from "@douyinfe/semi-icons"; -import { useDiagram, useEnums, useUndoRedo } from "../../../hooks"; +import { useDiagram, useEnums, useLayout, useUndoRedo } from "../../../hooks"; import { Action, ObjectType } from "../../../data/constants"; import { useTranslation } from "react-i18next"; export default function EnumDetails({ data, i }) { const { t } = useTranslation(); + const { layout } = useLayout(); const { deleteEnum, updateEnum } = useEnums(); const { tables, updateField } = useDiagram(); const { setUndoStack, setRedoStack } = useUndoRedo(); @@ -18,6 +19,7 @@ export default function EnumDetails({ data, i }) {
{t("Name")}:
{ @@ -71,7 +73,11 @@ export default function EnumDetails({ data, i }) { className="my-2" placeholder={t("values")} validateStatus={data.values.length === 0 ? "error" : "default"} - onChange={(v) => updateEnum(i, { values: v })} + onChange={(v) => { + if (layout.readOnly) return; + + updateEnum(i, { values: v }); + }} onFocus={() => setEditField({ values: data.values })} onBlur={() => { if (JSON.stringify(editField.values) === JSON.stringify(data.values)) @@ -95,8 +101,9 @@ export default function EnumDetails({ data, i }) { />
diff --git a/src/components/EditorSidePanel/NotesTab/NoteInfo.jsx b/src/components/EditorSidePanel/NotesTab/NoteInfo.jsx index d03289aa9..8a52e2da6 100644 --- a/src/components/EditorSidePanel/NotesTab/NoteInfo.jsx +++ b/src/components/EditorSidePanel/NotesTab/NoteInfo.jsx @@ -3,10 +3,11 @@ import { Button, Collapse, TextArea, Input } from "@douyinfe/semi-ui"; import ColorPicker from "../ColorPicker"; import { IconDeleteStroked } from "@douyinfe/semi-icons"; import { Action, ObjectType } from "../../../data/constants"; -import { useNotes, useUndoRedo } from "../../../hooks"; +import { useLayout, useNotes, useUndoRedo } from "../../../hooks"; import { useTranslation } from "react-i18next"; export default function NoteInfo({ data, nid }) { + const { layout } = useLayout(); const { updateNote, deleteNote } = useNotes(); const { setUndoStack, setRedoStack } = useUndoRedo(); const [editField, setEditField] = useState({}); @@ -62,6 +63,7 @@ export default function NoteInfo({ data, nid }) {
{t("title")}:
updateNote(data.id, { title: value })} onFocus={(e) => setEditField({ title: e.target.value })} @@ -90,6 +92,7 @@ export default function NoteInfo({ data, nid }) { placeholder={t("content")} value={data.content} autosize + readonly={layout.readOnly} onChange={(value) => { const textarea = document.getElementById(`note_${data.id}`); textarea.style.height = "0"; @@ -127,13 +130,15 @@ export default function NoteInfo({ data, nid }) {
updateNote(data.id, { color })} onColorPick={(color) => handleColorPick(color)} />
diff --git a/src/components/EditorSidePanel/NotesTab/NotesTab.jsx b/src/components/EditorSidePanel/NotesTab/NotesTab.jsx index 07b68600a..5b6b0338a 100644 --- a/src/components/EditorSidePanel/NotesTab/NotesTab.jsx +++ b/src/components/EditorSidePanel/NotesTab/NotesTab.jsx @@ -1,6 +1,6 @@ import { Button, Collapse } from "@douyinfe/semi-ui"; import { IconPlus } from "@douyinfe/semi-icons"; -import { useNotes, useSelect } from "../../../hooks"; +import { useLayout, useNotes, useSelect } from "../../../hooks"; import Empty from "../Empty"; import SearchBar from "./SearchBar"; import NoteInfo from "./NoteInfo"; @@ -10,6 +10,7 @@ export default function NotesTab() { const { notes, addNote } = useNotes(); const { selectedElement, setSelectedElement } = useSelect(); const { t } = useTranslation(); + const { layout } = useLayout(); return ( <> @@ -23,7 +24,12 @@ export default function NotesTab() { } />
-
diff --git a/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx b/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx index 2d7f74d8b..ae111a4fa 100644 --- a/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx +++ b/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx @@ -18,7 +18,7 @@ import { Action, ObjectType, } from "../../../data/constants"; -import { useDiagram, useUndoRedo } from "../../../hooks"; +import { useDiagram, useLayout, useUndoRedo } from "../../../hooks"; import i18n from "../../../i18n/i18n"; import { useTranslation } from "react-i18next"; import { useMemo, useState } from "react"; @@ -38,6 +38,7 @@ export default function RelationshipInfo({ data }) { const { setUndoStack, setRedoStack } = useUndoRedo(); const { tables, deleteRelationship, updateRelationship } = useDiagram(); const { t } = useTranslation(); + const { layout } = useLayout(); const [editField, setEditField] = useState({}); const relValues = useMemo(() => { @@ -98,6 +99,8 @@ export default function RelationshipInfo({ data }) { }; const changeCardinality = (value) => { + if (layout.readOnly) return; + setUndoStack((prev) => [ ...prev, { @@ -117,6 +120,8 @@ export default function RelationshipInfo({ data }) { }; const changeConstraint = (key, value) => { + if (layout.readOnly) return; + const undoKey = `${key}Constraint`; setUndoStack((prev) => [ ...prev, @@ -145,6 +150,7 @@ export default function RelationshipInfo({ data }) { validateStatus={data.name.trim() === "" ? "error" : "default"} placeholder={t("name")} className="ms-2" + readonly={layout.readOnly} onChange={(value) => updateRelationship(data.id, { name: value })} onFocus={(e) => setEditField({ name: e.target.value })} onBlur={(e) => { @@ -196,9 +202,10 @@ export default function RelationshipInfo({ data }) { />
@@ -285,9 +292,10 @@ export default function RelationshipInfo({ data }) {