diff --git a/apps/web/package.json b/apps/web/package.json
index 45d4755..68aa1db 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -12,6 +12,11 @@
"dependencies": {
"@base-ui/react": "^1.3.0",
"@fontsource-variable/geist": "^5.2.8",
+ "@tiptap/extension-image": "^3.22.2",
+ "@tiptap/extension-link": "^3.22.2",
+ "@tiptap/extension-youtube": "^3.22.2",
+ "@tiptap/react": "^3.22.2",
+ "@tiptap/starter-kit": "^3.22.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"dexie": "^4.4.2",
diff --git a/apps/web/src/components/task-rich-editor.tsx b/apps/web/src/components/task-rich-editor.tsx
new file mode 100644
index 0000000..53ca2b2
--- /dev/null
+++ b/apps/web/src/components/task-rich-editor.tsx
@@ -0,0 +1,182 @@
+import { useEffect, useMemo } from "react";
+import type { JSONContent } from "@tiptap/react";
+import { EditorContent, useEditor } from "@tiptap/react";
+import Image from "@tiptap/extension-image";
+import Link from "@tiptap/extension-link";
+import StarterKit from "@tiptap/starter-kit";
+import Youtube from "@tiptap/extension-youtube";
+import { cn } from "@/lib/utils";
+
+type TaskRichEditorProps = {
+ valueJson: string | null;
+ textFallback: string;
+ onChange: (payload: { json: string | null; text: string }) => void;
+};
+
+type ToolbarButtonProps = {
+ label: string;
+ disabled?: boolean;
+ active?: boolean;
+ onClick: () => void;
+};
+
+function ToolbarButton({ label, disabled = false, active = false, onClick }: ToolbarButtonProps) {
+ return (
+
+ );
+}
+
+function resolveEditorContent(
+ valueJson: string | null,
+ textFallback: string
+): JSONContent | string {
+ if (valueJson) {
+ try {
+ return JSON.parse(valueJson) as JSONContent;
+ } catch {
+ return textFallback;
+ }
+ }
+
+ return textFallback;
+}
+
+export function TaskRichEditor({ valueJson, textFallback, onChange }: TaskRichEditorProps) {
+ const content = useMemo(
+ () => resolveEditorContent(valueJson, textFallback),
+ [valueJson, textFallback]
+ );
+
+ const editor = useEditor({
+ extensions: [
+ StarterKit,
+ Link.configure({
+ openOnClick: true,
+ autolink: true,
+ linkOnPaste: true,
+ HTMLAttributes: {
+ rel: "noopener noreferrer",
+ target: "_blank"
+ }
+ }),
+ Image,
+ Youtube.configure({
+ controls: true
+ })
+ ],
+ content,
+ editorProps: {
+ attributes: {
+ class:
+ "min-h-40 rounded-b-lg border border-t-0 border-input bg-background px-3 py-2 text-sm text-foreground outline-none"
+ }
+ },
+ onUpdate({ editor: currentEditor }) {
+ const nextJson = JSON.stringify(currentEditor.getJSON());
+ const nextText = currentEditor.getText();
+ onChange({ json: nextJson, text: nextText });
+ }
+ });
+
+ useEffect(() => {
+ if (!editor) {
+ return;
+ }
+
+ editor.commands.setContent(content, { emitUpdate: false });
+ }, [content, editor]);
+
+ return (
+
+
+ editor?.chain().focus().toggleBold().run()}
+ />
+ editor?.chain().focus().toggleItalic().run()}
+ />
+ editor?.chain().focus().toggleHeading({ level: 2 }).run()}
+ />
+ editor?.chain().focus().toggleBulletList().run()}
+ />
+ {
+ if (!editor) {
+ return;
+ }
+
+ const url = window.prompt("请输入链接地址");
+ if (!url) {
+ return;
+ }
+
+ editor.chain().focus().setLink({ href: url }).run();
+ }}
+ />
+ {
+ if (!editor) {
+ return;
+ }
+
+ const url = window.prompt("请输入图片 URL");
+ if (!url) {
+ return;
+ }
+
+ editor.chain().focus().setImage({ src: url }).run();
+ }}
+ />
+ {
+ if (!editor) {
+ return;
+ }
+
+ const url = window.prompt("请输入视频 URL(当前支持 YouTube)");
+ if (!url) {
+ return;
+ }
+
+ editor.chain().focus().setYoutubeVideo({ src: url }).run();
+ }}
+ />
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/todo-shell-page.tsx b/apps/web/src/pages/todo-shell-page.tsx
index 74e19c7..64d9034 100644
--- a/apps/web/src/pages/todo-shell-page.tsx
+++ b/apps/web/src/pages/todo-shell-page.tsx
@@ -1,7 +1,9 @@
import { useEffect, useState } from "react";
import { useLiveQuery } from "dexie-react-hooks";
+import { TaskRichEditor } from "@/components/task-rich-editor";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
+import type { LocalTaskPriority, LocalTaskStatus } from "@/services/local-db";
import {
createLocalTask,
deleteLocalTask,
@@ -9,7 +11,6 @@ import {
listLocalTasksByUser,
updateLocalTask
} from "@/services/local-task-repo";
-import type { LocalTaskPriority, LocalTaskStatus } from "@/services/local-db";
import type { WebSession } from "@/services/session-storage";
type TodoShellPageProps = {
@@ -18,6 +19,7 @@ type TodoShellPageProps = {
type TaskFormState = {
title: string;
+ contentJson: string | null;
contentText: string;
priority: LocalTaskPriority;
status: LocalTaskStatus;
@@ -26,6 +28,7 @@ type TaskFormState = {
const DEFAULT_FORM_STATE: TaskFormState = {
title: "",
+ contentJson: null,
contentText: "",
priority: "MEDIUM",
status: "TODO",
@@ -129,6 +132,7 @@ export function TodoShellPage({ session }: TodoShellPageProps) {
setFormState({
title: selectedTask.title,
+ contentJson: selectedTask.contentJson,
contentText: selectedTask.contentText ?? "",
priority: selectedTask.priority,
status: selectedTask.status,
@@ -170,7 +174,7 @@ export function TodoShellPage({ session }: TodoShellPageProps) {
id: selectedTaskId,
title: formState.title,
contentText: formState.contentText || null,
- contentJson: null,
+ contentJson: formState.contentJson,
priority: formState.priority,
status: formState.status,
ddlAt: parseDatetimeLocalValue(formState.ddlInput)
@@ -359,17 +363,19 @@ export function TodoShellPage({ session }: TodoShellPageProps) {
)}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5dc8b55..cd0b5ba 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -149,6 +149,21 @@ importers:
"@fontsource-variable/geist":
specifier: ^5.2.8
version: 5.2.8
+ "@tiptap/extension-image":
+ specifier: ^3.22.2
+ version: 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-link":
+ specifier: ^3.22.2
+ version: 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ "@tiptap/extension-youtube":
+ specifier: ^3.22.2
+ version: 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/react":
+ specifier: ^3.22.2
+ version: 3.22.2(@floating-ui/dom@1.7.6)(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ "@tiptap/starter-kit":
+ specifier: ^3.22.2
+ version: 3.22.2
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -1928,6 +1943,12 @@ packages:
"@types/react":
optional: true
+ "@remirror/core-constants@3.0.0":
+ resolution:
+ {
+ integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==
+ }
+
"@rolldown/binding-android-arm64@1.0.0-rc.12":
resolution:
{
@@ -2488,6 +2509,255 @@ packages:
integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==
}
+ "@tiptap/core@3.22.2":
+ resolution:
+ {
+ integrity: sha512-atq35NkpeEphH6vNYJ0pTLLBA73FAbvTV9Ovd3AaTC5s99/KF5Q86zVJXvml8xPRcMGM6dLp+eSSd06oTscMSA==
+ }
+ peerDependencies:
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/extension-blockquote@3.22.2":
+ resolution:
+ {
+ integrity: sha512-iTdlmGFcgxi4LKaOW2Rc9/yD83qTXgRm5BN3vCHWy5+TbEnReYxYqU5qKsbtTbKy30sO8TJTdAXTZ29uomShQQ==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-bold@3.22.2":
+ resolution:
+ {
+ integrity: sha512-bqsPJyKcT/RWse4e16U2EKhraR8a2+98TUuk1amG3yCyFJZStoO/j+pN0IqZdZZjr3WtxFyvwWp7Kc59UN+jUA==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-bubble-menu@3.22.2":
+ resolution:
+ {
+ integrity: sha512-5hbyDOSkJwA2uh0v9Mm0Dd9bb9inx6tHBEDSH2tCB9Rm23poz3yOreB7SNX8xDMe5L0/PQesfWC14RitcmhKPg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/extension-bullet-list@3.22.2":
+ resolution:
+ {
+ integrity: sha512-llrTJnA72RGcWLLO+ro0QN4sjHynhaCerhpV+GZE/ATd8BqV/ekQFdBLJrvC/09My2XQfCwLsyCh92NPXUdELA==
+ }
+ peerDependencies:
+ "@tiptap/extension-list": ^3.22.2
+
+ "@tiptap/extension-code-block@3.22.2":
+ resolution:
+ {
+ integrity: sha512-PEwFlDyvtKF19WCrOFg77qJV9WqhvjCY4ZoXlHP9Hx0KTcOA8W39mtw8d4NWU5pLRK94yHKF1DVVL8UUkEOnww==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/extension-code@3.22.2":
+ resolution:
+ {
+ integrity: sha512-iYFY+yzfYA9MKt7nupyW/PzqL9XC2D0mC8l1z2Y10i0/fGL8NbqIYjhNUAyXGqH3QWcI+DirI66842y2OadPOg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-document@3.22.2":
+ resolution:
+ {
+ integrity: sha512-yPw9pQeVC4QDh86TuyKCZxxM4g0NAw7mEtGnAo6EpxaBQr1wyBr9yFpys+QTsQpRTmyTf1VHp4iTTLuWHMljIw==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-dropcursor@3.22.2":
+ resolution:
+ {
+ integrity: sha512-sDv3fv4LtX0X4nqwh9Gn3C/aZXT+C2JlK7tJovPOpaYP/a6hr03Sn35X5moAfgMCSiWFygEvlTriqwmCsJuxog==
+ }
+ peerDependencies:
+ "@tiptap/extensions": ^3.22.2
+
+ "@tiptap/extension-floating-menu@3.22.2":
+ resolution:
+ {
+ integrity: sha512-r0ZTeh9rNtj9Api+G0YyaB+tAKPDn7aYWg+qSrmAC5EyUPee6Zjn3zlw0q4renCeQflvNRK20xHM8zokC41jOA==
+ }
+ peerDependencies:
+ "@floating-ui/dom": ^1.0.0
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/extension-gapcursor@3.22.2":
+ resolution:
+ {
+ integrity: sha512-rR2OLrl/k2kj7xehaZHq0Y7T+1wy2DOTabir9LsTrktTFEcklrh9qY1KC6rEBkwMKaWrmignR1l39kS6RlKFNw==
+ }
+ peerDependencies:
+ "@tiptap/extensions": ^3.22.2
+
+ "@tiptap/extension-hard-break@3.22.2":
+ resolution:
+ {
+ integrity: sha512-ChsoqF4XRp6EWatTRlXL4LMFh/ggwRVCyt09brSfjJV5knFaXlECSa5/+rKLMLMULaj6dVlJqoAD15exgu2HHA==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-heading@3.22.2":
+ resolution:
+ {
+ integrity: sha512-QPHLef+ikAyf7RVc4EdGeKxH4OEGb3ueCEwJ41RcYPtZ1BX9ueei7FC936guTdL1U7w3vQ65qfy86HznzkYgvw==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-horizontal-rule@3.22.2":
+ resolution:
+ {
+ integrity: sha512-Oz8KN5KJAWV1mFNE9UIWXdMD6xa5zPf/0yLsT8V4sgaRm+VsdFKllN58BY9qCZf/kIZbaOez5KkaoeAcm0MAZg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/extension-image@3.22.2":
+ resolution:
+ {
+ integrity: sha512-xFCgwreF6sn5mQ/hFDQKn41NIbbfks/Ou9j763Djf3pWsastgzdgwifQOpXVI3aSsqlKUO3o8/8R/yQczvZcwg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-italic@3.22.2":
+ resolution:
+ {
+ integrity: sha512-fmtQu2HDnV3sOZPdz0+1lOLI7UtrIhusohJj2UwOLQxG8qqhLwbvWx2OQTlfblgY0z+CjLRr6ANbNDxOTIblfg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-link@3.22.2":
+ resolution:
+ {
+ integrity: sha512-TXfSoKmng5pecvQUZqdsx6ICeob5V5hhYOj2vCEtjfcjWsyCndqFIl1w+Nt/yI5ehrFNOVPyj3ZvcELuuAW6pw==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/extension-list-item@3.22.2":
+ resolution:
+ {
+ integrity: sha512-Mk+iiLIFh8Pfuarr6mWfTO7QJbd2ZQd0nGNhNWXlGAO7DJCb4BP9nj4bEIJ17SbcykGRjsi4WMqY50z4MHXqKQ==
+ }
+ peerDependencies:
+ "@tiptap/extension-list": ^3.22.2
+
+ "@tiptap/extension-list-keymap@3.22.2":
+ resolution:
+ {
+ integrity: sha512-TozU9V2vldMUPpTXnfLCO33EO06jLxn7uEJTMBnN4iX/dLV3cBVCbE4kHyDKS0sLd7joUeekS06vYP9uQb1hFw==
+ }
+ peerDependencies:
+ "@tiptap/extension-list": ^3.22.2
+
+ "@tiptap/extension-list@3.22.2":
+ resolution:
+ {
+ integrity: sha512-Vq9xScgkA2A3Zj9dQ4WUBKK7u7UCzeSFRz9FcKTQVZHRPbZoqFGnlRUVngqsE7JXrCOthXQ1dXxgk40nAsBFRw==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/extension-ordered-list@3.22.2":
+ resolution:
+ {
+ integrity: sha512-K7qxoBKmsVkAd3kW64ZRCUPFrDcNGpXRDUBx9YgAO/bTfsfxtH2oil+igsUWGXPczpP4yoHPKjTfhpBpLjGl6Q==
+ }
+ peerDependencies:
+ "@tiptap/extension-list": ^3.22.2
+
+ "@tiptap/extension-paragraph@3.22.2":
+ resolution:
+ {
+ integrity: sha512-EHZZzxVhvzEPDPWtRBF1YKhB+WCUjd1C2NhjHfL3Dl71PBqM3ZWA6qN7NDGPyNyGGWauui/NR/4X+5AfPqlHyA==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-strike@3.22.2":
+ resolution:
+ {
+ integrity: sha512-YFC3elKU1L8PiGbcB6tqd/7vWPF5IbydJz0POJpHzSjstX+VfT8VsvS7ubxVuSIWQ11kGkH3mzX6LX8JHsHZxg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-text@3.22.2":
+ resolution:
+ {
+ integrity: sha512-J1w7JwijfSD7ah0WfiwZ/DVWCIGT9x369RM4RJc57i44mIBElj7tl1dh+N5KPGOXKUup4gr7sSJAE38lgeaDMg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-underline@3.22.2":
+ resolution:
+ {
+ integrity: sha512-BaV6WOowxdkGTLWiU7DdZ3Twh633O4RGqwUM5dDas5LvaqL8AMWGTO8Wg9yAaaKXzd9MtKI1ZCqS/+MtzusgkQ==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extension-youtube@3.22.2":
+ resolution:
+ {
+ integrity: sha512-wSLswwaLW+LWxe1/PtKzALeeAUS+LGLJfwFJHYTyc+EkqqpQSi2PhDwFx8m9+ADmb8UvjF2Hsg3cha1KrFAJEg==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+
+ "@tiptap/extensions@3.22.2":
+ resolution:
+ {
+ integrity: sha512-s7MZmm2Xdq+8feIXgY3v7gVpQ5ClqBZi20KheouS7KSbBlrY4fu2irYR1EGc6r1UUVaHMxEa+cx5knhx+mIPUw==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+
+ "@tiptap/pm@3.22.2":
+ resolution:
+ {
+ integrity: sha512-G2ENwIazoSKkAnN5MN5yN91TIZNFm6TxB74kPf3Empr2k9W51Hkcier70jHGpArhgcEaL4BVreuU1PRDRwCeGw==
+ }
+
+ "@tiptap/react@3.22.2":
+ resolution:
+ {
+ integrity: sha512-tyGKG69e/MkpoD/JTpVPz0XydEHxh1MSAYnLb3gRvyvBDv2r/veLea+cApkmjQaCfkKC/CWwTFXBYlOB0caSBA==
+ }
+ peerDependencies:
+ "@tiptap/core": ^3.22.2
+ "@tiptap/pm": ^3.22.2
+ "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0
+ "@types/react-dom": ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ "@tiptap/starter-kit@3.22.2":
+ resolution:
+ {
+ integrity: sha512-+CCKX8tOQ/ZPb2k/z6em4AQCFYAcdd8+0TOzPWiuLxRyCHRPBBVhnPsXOKgKwE4OO3E8BsezquuYRYRwsyzCqg==
+ }
+
"@tokenizer/inflate@0.4.1":
resolution:
{
@@ -2693,6 +2963,24 @@ packages:
integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==
}
+ "@types/linkify-it@5.0.0":
+ resolution:
+ {
+ integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==
+ }
+
+ "@types/markdown-it@14.1.2":
+ resolution:
+ {
+ integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==
+ }
+
+ "@types/mdurl@2.0.0":
+ resolution:
+ {
+ integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==
+ }
+
"@types/methods@1.1.4":
resolution:
{
@@ -2827,6 +3115,12 @@ packages:
integrity: sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==
}
+ "@types/use-sync-external-store@0.0.6":
+ resolution:
+ {
+ integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==
+ }
+
"@types/validate-npm-package-name@4.0.2":
resolution:
{
@@ -3833,6 +4127,12 @@ packages:
integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
}
+ crelt@1.0.6:
+ resolution:
+ {
+ integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==
+ }
+
cross-spawn@7.0.6:
resolution:
{
@@ -4129,6 +4429,13 @@ packages:
}
engines: { node: ">= 0.8" }
+ entities@4.5.0:
+ resolution:
+ {
+ integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+ }
+ engines: { node: ">=0.12" }
+
env-paths@2.2.1:
resolution:
{
@@ -4429,6 +4736,13 @@ packages:
integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
}
+ fast-equals@5.4.0:
+ resolution:
+ {
+ integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==
+ }
+ engines: { node: ">=6.0.0" }
+
fast-glob@3.3.3:
resolution:
{
@@ -5695,6 +6009,18 @@ packages:
integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
}
+ linkify-it@5.0.0:
+ resolution:
+ {
+ integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==
+ }
+
+ linkifyjs@4.3.2:
+ resolution:
+ {
+ integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==
+ }
+
lint-staged@16.4.0:
resolution:
{
@@ -5857,6 +6183,13 @@ packages:
integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
}
+ markdown-it@14.1.1:
+ resolution:
+ {
+ integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==
+ }
+ hasBin: true
+
math-intrinsics@1.1.0:
resolution:
{
@@ -5864,6 +6197,12 @@ packages:
}
engines: { node: ">= 0.4" }
+ mdurl@2.0.0:
+ resolution:
+ {
+ integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==
+ }
+
media-typer@0.3.0:
resolution:
{
@@ -6248,6 +6587,12 @@ packages:
}
engines: { node: ">=18" }
+ orderedmap@2.1.1:
+ resolution:
+ {
+ integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==
+ }
+
otplib@13.4.0:
resolution:
{
@@ -6729,6 +7074,118 @@ packages:
integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
}
+ prosemirror-changeset@2.4.0:
+ resolution:
+ {
+ integrity: sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==
+ }
+
+ prosemirror-collab@1.3.1:
+ resolution:
+ {
+ integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==
+ }
+
+ prosemirror-commands@1.7.1:
+ resolution:
+ {
+ integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==
+ }
+
+ prosemirror-dropcursor@1.8.2:
+ resolution:
+ {
+ integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==
+ }
+
+ prosemirror-gapcursor@1.4.1:
+ resolution:
+ {
+ integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==
+ }
+
+ prosemirror-history@1.5.0:
+ resolution:
+ {
+ integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==
+ }
+
+ prosemirror-inputrules@1.5.1:
+ resolution:
+ {
+ integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==
+ }
+
+ prosemirror-keymap@1.2.3:
+ resolution:
+ {
+ integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==
+ }
+
+ prosemirror-markdown@1.13.4:
+ resolution:
+ {
+ integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==
+ }
+
+ prosemirror-menu@1.3.0:
+ resolution:
+ {
+ integrity: sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==
+ }
+
+ prosemirror-model@1.25.4:
+ resolution:
+ {
+ integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==
+ }
+
+ prosemirror-schema-basic@1.2.4:
+ resolution:
+ {
+ integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==
+ }
+
+ prosemirror-schema-list@1.5.1:
+ resolution:
+ {
+ integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==
+ }
+
+ prosemirror-state@1.4.4:
+ resolution:
+ {
+ integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==
+ }
+
+ prosemirror-tables@1.8.5:
+ resolution:
+ {
+ integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==
+ }
+
+ prosemirror-trailing-node@3.0.0:
+ resolution:
+ {
+ integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==
+ }
+ peerDependencies:
+ prosemirror-model: ^1.22.1
+ prosemirror-state: ^1.4.2
+ prosemirror-view: ^1.33.8
+
+ prosemirror-transform@1.12.0:
+ resolution:
+ {
+ integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==
+ }
+
+ prosemirror-view@1.41.8:
+ resolution:
+ {
+ integrity: sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==
+ }
+
proxy-addr@2.0.7:
resolution:
{
@@ -6736,6 +7193,13 @@ packages:
}
engines: { node: ">= 0.10" }
+ punycode.js@2.3.1:
+ resolution:
+ {
+ integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==
+ }
+ engines: { node: ">=6" }
+
punycode@2.3.1:
resolution:
{
@@ -6976,6 +7440,12 @@ packages:
engines: { node: ^20.19.0 || >=22.12.0 }
hasBin: true
+ rope-sequence@1.3.4:
+ resolution:
+ {
+ integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==
+ }
+
router@2.2.0:
resolution:
{
@@ -7731,6 +8201,12 @@ packages:
engines: { node: ">=14.17" }
hasBin: true
+ uc.micro@2.1.0:
+ resolution:
+ {
+ integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==
+ }
+
uglify-js@3.19.3:
resolution:
{
@@ -7931,6 +8407,12 @@ packages:
yaml:
optional: true
+ w3c-keyname@2.2.8:
+ resolution:
+ {
+ integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==
+ }
+
walker@1.0.8:
resolution:
{
@@ -9661,6 +10143,8 @@ snapshots:
optionalDependencies:
"@types/react": 19.2.14
+ "@remirror/core-constants@3.0.0": {}
+
"@rolldown/binding-android-arm64@1.0.0-rc.12":
optional: true
@@ -10065,6 +10549,191 @@ snapshots:
"@standard-schema/spec@1.1.0": {}
+ "@tiptap/core@3.22.2(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@tiptap/pm": 3.22.2
+
+ "@tiptap/extension-blockquote@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-bold@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-bubble-menu@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@floating-ui/dom": 1.7.6
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+ optional: true
+
+ "@tiptap/extension-bullet-list@3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/extension-list": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-code-block@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+
+ "@tiptap/extension-code@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-document@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-dropcursor@3.22.2(@tiptap/extensions@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/extensions": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-floating-menu@3.22.2(@floating-ui/dom@1.7.6)(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@floating-ui/dom": 1.7.6
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+ optional: true
+
+ "@tiptap/extension-gapcursor@3.22.2(@tiptap/extensions@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/extensions": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-hard-break@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-heading@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-horizontal-rule@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+
+ "@tiptap/extension-image@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-italic@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-link@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+ linkifyjs: 4.3.2
+
+ "@tiptap/extension-list-item@3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/extension-list": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-list-keymap@3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/extension-list": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+
+ "@tiptap/extension-ordered-list@3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/extension-list": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-paragraph@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-strike@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-text@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-underline@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extension-youtube@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+
+ "@tiptap/extensions@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+
+ "@tiptap/pm@3.22.2":
+ dependencies:
+ prosemirror-changeset: 2.4.0
+ prosemirror-collab: 1.3.1
+ prosemirror-commands: 1.7.1
+ prosemirror-dropcursor: 1.8.2
+ prosemirror-gapcursor: 1.4.1
+ prosemirror-history: 1.5.0
+ prosemirror-inputrules: 1.5.1
+ prosemirror-keymap: 1.2.3
+ prosemirror-markdown: 1.13.4
+ prosemirror-menu: 1.3.0
+ prosemirror-model: 1.25.4
+ prosemirror-schema-basic: 1.2.4
+ prosemirror-schema-list: 1.5.1
+ prosemirror-state: 1.4.4
+ prosemirror-tables: 1.8.5
+ prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)
+ prosemirror-transform: 1.12.0
+ prosemirror-view: 1.41.8
+
+ "@tiptap/react@3.22.2(@floating-ui/dom@1.7.6)(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+ "@types/react": 19.2.14
+ "@types/react-dom": 19.2.3(@types/react@19.2.14)
+ "@types/use-sync-external-store": 0.0.6
+ fast-equals: 5.4.0
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ use-sync-external-store: 1.6.0(react@19.2.4)
+ optionalDependencies:
+ "@tiptap/extension-bubble-menu": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ "@tiptap/extension-floating-menu": 3.22.2(@floating-ui/dom@1.7.6)(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ transitivePeerDependencies:
+ - "@floating-ui/dom"
+
+ "@tiptap/starter-kit@3.22.2":
+ dependencies:
+ "@tiptap/core": 3.22.2(@tiptap/pm@3.22.2)
+ "@tiptap/extension-blockquote": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-bold": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-bullet-list": 3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))
+ "@tiptap/extension-code": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-code-block": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ "@tiptap/extension-document": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-dropcursor": 3.22.2(@tiptap/extensions@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))
+ "@tiptap/extension-gapcursor": 3.22.2(@tiptap/extensions@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))
+ "@tiptap/extension-hard-break": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-heading": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-horizontal-rule": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ "@tiptap/extension-italic": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-link": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ "@tiptap/extension-list": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ "@tiptap/extension-list-item": 3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))
+ "@tiptap/extension-list-keymap": 3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))
+ "@tiptap/extension-ordered-list": 3.22.2(@tiptap/extension-list@3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2))
+ "@tiptap/extension-paragraph": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-strike": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-text": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extension-underline": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))
+ "@tiptap/extensions": 3.22.2(@tiptap/core@3.22.2(@tiptap/pm@3.22.2))(@tiptap/pm@3.22.2)
+ "@tiptap/pm": 3.22.2
+
"@tokenizer/inflate@0.4.1":
dependencies:
debug: 4.4.3
@@ -10184,6 +10853,15 @@ snapshots:
"@types/ms": 2.1.0
"@types/node": 25.5.2
+ "@types/linkify-it@5.0.0": {}
+
+ "@types/markdown-it@14.1.2":
+ dependencies:
+ "@types/linkify-it": 5.0.0
+ "@types/mdurl": 2.0.0
+
+ "@types/mdurl@2.0.0": {}
+
"@types/methods@1.1.4": {}
"@types/ms@2.1.0": {}
@@ -10267,6 +10945,8 @@ snapshots:
"@types/methods": 1.1.4
"@types/superagent": 8.1.9
+ "@types/use-sync-external-store@0.0.6": {}
+
"@types/validate-npm-package-name@4.0.2": {}
"@types/validator@13.15.10": {}
@@ -10832,6 +11512,8 @@ snapshots:
create-require@1.1.1: {}
+ crelt@1.0.6: {}
+
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -10951,6 +11633,8 @@ snapshots:
encodeurl@2.0.0: {}
+ entities@4.5.0: {}
+
env-paths@2.2.1: {}
env-paths@3.0.0: {}
@@ -11215,6 +11899,8 @@ snapshots:
fast-deep-equal@3.1.3: {}
+ fast-equals@5.4.0: {}
+
fast-glob@3.3.3:
dependencies:
"@nodelib/fs.stat": 2.0.5
@@ -12077,6 +12763,12 @@ snapshots:
lines-and-columns@1.2.4: {}
+ linkify-it@5.0.0:
+ dependencies:
+ uc.micro: 2.1.0
+
+ linkifyjs@4.3.2: {}
+
lint-staged@16.4.0:
dependencies:
commander: 14.0.3
@@ -12162,8 +12854,19 @@ snapshots:
dependencies:
tmpl: 1.0.5
+ markdown-it@14.1.1:
+ dependencies:
+ argparse: 2.0.1
+ entities: 4.5.0
+ linkify-it: 5.0.0
+ mdurl: 2.0.0
+ punycode.js: 2.3.1
+ uc.micro: 2.1.0
+
math-intrinsics@1.1.0: {}
+ mdurl@2.0.0: {}
+
media-typer@0.3.0: {}
media-typer@1.1.0: {}
@@ -12376,6 +13079,8 @@ snapshots:
string-width: 7.2.0
strip-ansi: 7.2.0
+ orderedmap@2.1.1: {}
+
otplib@13.4.0:
dependencies:
"@otplib/core": 13.4.0
@@ -12629,11 +13334,116 @@ snapshots:
retry: 0.12.0
signal-exit: 3.0.7
+ prosemirror-changeset@2.4.0:
+ dependencies:
+ prosemirror-transform: 1.12.0
+
+ prosemirror-collab@1.3.1:
+ dependencies:
+ prosemirror-state: 1.4.4
+
+ prosemirror-commands@1.7.1:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.12.0
+
+ prosemirror-dropcursor@1.8.2:
+ dependencies:
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.12.0
+ prosemirror-view: 1.41.8
+
+ prosemirror-gapcursor@1.4.1:
+ dependencies:
+ prosemirror-keymap: 1.2.3
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-view: 1.41.8
+
+ prosemirror-history@1.5.0:
+ dependencies:
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.12.0
+ prosemirror-view: 1.41.8
+ rope-sequence: 1.3.4
+
+ prosemirror-inputrules@1.5.1:
+ dependencies:
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.12.0
+
+ prosemirror-keymap@1.2.3:
+ dependencies:
+ prosemirror-state: 1.4.4
+ w3c-keyname: 2.2.8
+
+ prosemirror-markdown@1.13.4:
+ dependencies:
+ "@types/markdown-it": 14.1.2
+ markdown-it: 14.1.1
+ prosemirror-model: 1.25.4
+
+ prosemirror-menu@1.3.0:
+ dependencies:
+ crelt: 1.0.6
+ prosemirror-commands: 1.7.1
+ prosemirror-history: 1.5.0
+ prosemirror-state: 1.4.4
+
+ prosemirror-model@1.25.4:
+ dependencies:
+ orderedmap: 2.1.1
+
+ prosemirror-schema-basic@1.2.4:
+ dependencies:
+ prosemirror-model: 1.25.4
+
+ prosemirror-schema-list@1.5.1:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.12.0
+
+ prosemirror-state@1.4.4:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-transform: 1.12.0
+ prosemirror-view: 1.41.8
+
+ prosemirror-tables@1.8.5:
+ dependencies:
+ prosemirror-keymap: 1.2.3
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.12.0
+ prosemirror-view: 1.41.8
+
+ prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8):
+ dependencies:
+ "@remirror/core-constants": 3.0.0
+ escape-string-regexp: 4.0.0
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-view: 1.41.8
+
+ prosemirror-transform@1.12.0:
+ dependencies:
+ prosemirror-model: 1.25.4
+
+ prosemirror-view@1.41.8:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.12.0
+
proxy-addr@2.0.7:
dependencies:
forwarded: 0.2.0
ipaddr.js: 1.9.1
+ punycode.js@2.3.1: {}
+
punycode@2.3.1: {}
pure-rand@6.1.0: {}
@@ -12772,6 +13582,8 @@ snapshots:
- "@emnapi/core"
- "@emnapi/runtime"
+ rope-sequence@1.3.4: {}
+
router@2.2.0:
dependencies:
debug: 4.4.3
@@ -13310,6 +14122,8 @@ snapshots:
typescript@5.9.3: {}
+ uc.micro@2.1.0: {}
+
uglify-js@3.19.3:
optional: true
@@ -13409,6 +14223,8 @@ snapshots:
- "@emnapi/core"
- "@emnapi/runtime"
+ w3c-keyname@2.2.8: {}
+
walker@1.0.8:
dependencies:
makeerror: 1.0.12