From 8082d9ef5c739b8085228d56fc2e71abdc1f145d Mon Sep 17 00:00:00 2001 From: lftobs Date: Sat, 3 Jan 2026 12:53:37 +0100 Subject: [PATCH 1/6] fix: use commit's tree SHA as base for new tree creation --- src/lib/server/repo/service.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/lib/server/repo/service.ts b/src/lib/server/repo/service.ts index d1d14aa..51126e6 100644 --- a/src/lib/server/repo/service.ts +++ b/src/lib/server/repo/service.ts @@ -175,6 +175,13 @@ export class RepoService { }); const latestCommitSha = refData.object.sha; + const { data: commitData } = await octokit.rest.git.getCommit({ + owner, + repo, + commit_sha: latestCommitSha, + }); + const baseTreeSha = commitData.tree.sha; + const blobs = await Promise.all( files.map(async (file) => { const { data } = await octokit.rest.git.createBlob({ @@ -195,11 +202,11 @@ export class RepoService { const { data: treeData } = await octokit.rest.git.createTree({ owner, repo, - base_tree: latestCommitSha, + base_tree: baseTreeSha, tree: blobs as any, }); - const { data: commitData } = await octokit.rest.git.createCommit({ + const { data: newCommitData } = await octokit.rest.git.createCommit({ owner, repo, message, @@ -211,9 +218,9 @@ export class RepoService { owner, repo, ref: `heads/${TARGET_BRANCH}`, - sha: commitData.sha, + sha: newCommitData.sha, }); - return { success: true, commitSha: commitData.sha }; + return { success: true, commitSha: newCommitData.sha }; } } From 8ef06046220d5c2356898228c7cec1cfe724fafa Mon Sep 17 00:00:00 2001 From: lftobs Date: Sun, 18 Jan 2026 06:49:40 +0100 Subject: [PATCH 2/6] feat: add repository file management with configurable naming conventions and file creation. --- package.json | 12 +++ src/components/dashboard/FileExplorer.tsx | 97 ++++++++++++++----- .../dashboard/ProjectSettingsModal.tsx | 22 ++--- src/lib/server/auth/blacklist.ts | 5 +- src/lib/server/email/client.ts | 74 ++++++++------ src/lib/server/email/service.ts | 17 +++- src/lib/server/repo/handlers.ts | 57 +++++++++++ src/lib/server/repo/index.ts | 15 +++ src/lib/server/repo/service.ts | 49 ++++++++-- 9 files changed, 268 insertions(+), 80 deletions(-) diff --git a/package.json b/package.json index 64659c4..bd4a291 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "@auth/core": "^0.37.4", "@fontsource/inter": "^5.2.5", "@fontsource/space-grotesk": "^5.2.6", + "@hocuspocus/provider": "^3.4.3", + "@hocuspocus/server": "^3.4.3", "@hono/node-server": "^1.13.8", "@hono/zod-validator": "^0.4.3", "@libsql/client": "^0.15.4", @@ -28,6 +30,14 @@ "@tabler/icons": "^3.35.0", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/vite": "^4.1.17", + "@tiptap/extension-collaboration": "^3.15.3", + "@tiptap/extension-collaboration-cursor": "^2.26.2", + "@tiptap/extension-table": "^3.15.3", + "@tiptap/extension-table-cell": "^3.15.3", + "@tiptap/extension-table-header": "^3.15.3", + "@tiptap/extension-table-row": "^3.15.3", + "@tiptap/react": "^3.15.3", + "@tiptap/starter-kit": "^3.15.3", "@toast-ui/editor": "^3.2.2", "@toast-ui/react-editor": "^3.2.3", "@types/alpinejs": "^3.13.11", @@ -47,10 +57,12 @@ "tailwind-merge": "^3.3.1", "tailwind-variants": "^3.1.1", "tailwindcss": "^4.1.17", + "tiptap": "^1.32.2", "tw-animate-css": "^1.4.0", "typescript": "^5.8.3", "uuid": "^13.0.0", "yaml": "^2.8.1", + "yjs": "^13.6.29", "zod": "^3.24.2" }, "devDependencies": { diff --git a/src/components/dashboard/FileExplorer.tsx b/src/components/dashboard/FileExplorer.tsx index ed747c4..be1423d 100644 --- a/src/components/dashboard/FileExplorer.tsx +++ b/src/components/dashboard/FileExplorer.tsx @@ -38,6 +38,12 @@ interface DirectoryNode { isPending?: boolean; } +interface DirectoryConfig { + path: string; + schema?: Record; + naming_convention?: string; +} + const FileExplorer: React.FC = ({ projectId, repoOwner, @@ -52,9 +58,7 @@ const FileExplorer: React.FC = ({ const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [expandedDirs, setExpandedDirs] = useState>(new Set()); - const [allowedDirectories, setAllowedDirectories] = useState( - null, - ); + const [repoConfig, setRepoConfig] = useState([]); const [settingsLoaded, setSettingsLoaded] = useState(false); const [showCreateModal, setShowCreateModal] = useState(false); const [createType, setCreateType] = useState<"file" | "folder">("file"); @@ -92,32 +96,31 @@ const FileExplorer: React.FC = ({ const fetchSettings = useCallback(async () => { try { - // console.log("[FileExplorer] Fetching settings for project:", projectId); - const response = await (api.projects as any)[projectId].settings.$get(); + // Fetch config from .mini-cms.yml + const response = await (api.projects as any)[projectId].repo[repoOwner][repoName].config.$get(); - // console.log("[FileExplorer] Settings response status:", response.status); if (!response.ok) { - const errorText = await response.text(); - console.error("[FileExplorer] Settings fetch failed:", errorText); - throw new Error("Failed to fetch project settings"); + console.warn("[FileExplorer] Config fetch failed, falling back to empty"); + setRepoConfig([]); + setSettingsLoaded(true); + return []; } const data = await response.json(); - // console.log("[FileExplorer] Settings data:", data); - const settings = data.data; - const dirs = JSON.parse(settings.public_directories || "[]"); - // console.log("[FileExplorer] Allowed directories:", dirs); - setAllowedDirectories(dirs); + const configs: DirectoryConfig[] = data.data; + + setRepoConfig(configs); setSettingsLoaded(true); - return dirs; + + // Return just paths for the UI tree + return configs.map(c => c.path); } catch (err) { console.error("[FileExplorer] Error fetching settings:", err); - // Fallback to empty if error - setAllowedDirectories([]); + setRepoConfig([]); setSettingsLoaded(true); return []; } - }, [projectId]); + }, [projectId, repoOwner, repoName]); // build tree structure from flat file list const buildTree = useCallback( @@ -175,7 +178,6 @@ const FileExplorer: React.FC = ({ const dirs = await fetchSettings(); if (dirs && dirs.length > 0) { - const nodes: DirectoryNode[] = dirs.map((dir: string) => ({ name: dir, path: dir, @@ -339,6 +341,19 @@ const FileExplorer: React.FC = ({ const [isCreating, setIsCreating] = useState(false); + const validateFileName = (name: string, convention: string) => { + switch (convention) { + case "kebab-case": + return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name); + case "snake_case": + return /^[a-z0-9]+(_[a-z0-9]+)*$/.test(name); + case "camelCase": + return /^[a-z][a-zA-Z0-9]*$/.test(name); + default: + return true; + } + }; + const handleCreate = async () => { if (!newItemName.trim() || isCreating) return; @@ -346,20 +361,54 @@ const FileExplorer: React.FC = ({ const fullPath = createPath ? `${createPath}/${newItemName}` : newItemName; try { + // Find applicable config + const config = repoConfig.find(c => fullPath.startsWith(c.path + "/") || fullPath === c.path || createPath === c.path); + + if (createType === "file" && config?.naming_convention) { + // Remove extension + const nameWithoutExt = newItemName.includes(".") + ? newItemName.split(".").slice(0, -1).join(".") + : newItemName; + + if (!validateFileName(nameWithoutExt, config.naming_convention)) { + throw new Error(`File name must follow ${config.naming_convention} convention`); + } + } + if (onFileCreate) { onFileCreate(fullPath, createType); } else { if (createType === "file") { + let initialContent = ""; + if (config?.schema) { + try { + const yaml = await import("yaml"); + const frontmatter: Record = {}; + + Object.entries(config.schema).forEach(([key, value]: [string, any]) => { + // Default placeholders + frontmatter[key] = ""; + }); + + initialContent = `---\n${yaml.stringify(frontmatter)}---\n`; + } catch (e) { + console.warn("Failed to generate frontmatter", e); + } + } + const response = await (api.projects as any)[projectId].repo[ repoOwner ][repoName]["create-file"].$post({ json: { path: fullPath, - content: btoa(""), + content: btoa(initialContent), message: `Create ${fullPath}`, }, }); - if (!response.ok) throw new Error(response.statusText); + if (!response.ok) { + const errData = await response.json(); + throw new Error(errData.message || response.statusText); + } } else { alert( "Cannot create empty folder on server. Please create a file inside it.", @@ -367,6 +416,10 @@ const FileExplorer: React.FC = ({ return; } const contents = await loadDirectoryContents(); + // Refresh to show new file (simplified, usually we'd reload the specific dir) + if (createPath) { + await toggleDirectory(createPath); + } } setShowCreateModal(false); @@ -556,7 +609,7 @@ const FileExplorer: React.FC = ({ if ( settingsLoaded && - (!allowedDirectories || allowedDirectories.length === 0) + (!repoConfig || repoConfig.length === 0) ) { return (
diff --git a/src/components/dashboard/ProjectSettingsModal.tsx b/src/components/dashboard/ProjectSettingsModal.tsx index 7cf3a33..ca5e201 100644 --- a/src/components/dashboard/ProjectSettingsModal.tsx +++ b/src/components/dashboard/ProjectSettingsModal.tsx @@ -47,18 +47,18 @@ export default function ProjectSettingsModal({ .map((d) => d.trim()) .filter((d) => d); - const payload = { + const payload = settings ? { + public_directories: JSON.stringify(dirs), + allow_file_creation: settings.allow_file_creation, + allow_file_editing: settings.allow_file_editing, + allow_file_deletion: settings.allow_file_deletion, + require_approval: settings.require_approval, + auto_merge: settings.auto_merge, + max_file_size: settings.max_file_size, + allowed_extensions: settings.allowed_extensions, + collaborator_message: settings.collaborator_message, + } : { public_directories: JSON.stringify(dirs), - allow_file_creation: settings?.allow_file_creation ?? false, - allow_file_editing: settings?.allow_file_editing ?? true, - allow_file_deletion: settings?.allow_file_deletion ?? false, - require_approval: settings?.require_approval ?? true, - auto_merge: settings?.auto_merge ?? false, - max_file_size: settings?.max_file_size ?? 1048576, - allowed_extensions: - settings?.allowed_extensions ?? - JSON.stringify([".md"]), - collaborator_message: settings?.collaborator_message ?? "", }; const res = await (api.projects as any)[projectId].settings.$put({ diff --git a/src/lib/server/auth/blacklist.ts b/src/lib/server/auth/blacklist.ts index d02638b..6f3163c 100644 --- a/src/lib/server/auth/blacklist.ts +++ b/src/lib/server/auth/blacklist.ts @@ -3,7 +3,6 @@ import { createHash } from "crypto"; const { UPSTASH_URL, UPSTASH_TOKEN } = import.meta.env; -// Initialize Redis client const redis = new Redis({ url: UPSTASH_URL!, token: UPSTASH_TOKEN!, @@ -99,9 +98,7 @@ export async function isBlacklisted(token: string): Promise { return exists === 1; } catch (error) { console.error("[Blacklist] Error checking token blacklist:", error); - // On error, fail closed (assume token is valid to avoid blocking legitimate users) - // In production, you might want to fail open or have more sophisticated error handling - return false; + throw new Error("Token validation unavailable"); } } diff --git a/src/lib/server/email/client.ts b/src/lib/server/email/client.ts index 7b052fa..9cfc5ac 100644 --- a/src/lib/server/email/client.ts +++ b/src/lib/server/email/client.ts @@ -1,36 +1,50 @@ import nodemailer from "nodemailer"; -const gmailUser = import.meta.env.GMAIL_USER; -const gmailAppPassword = import.meta.env.GMAIL_APP_PASSWORD; +// Lazy initialization helper +function getTransporter() { + const gmailUser = process.env.GMAIL_USER; + const gmailAppPassword = process.env.GMAIL_APP_PASSWORD; -if (!gmailUser || !gmailAppPassword) { - console.warn( - "[Email] Gmail credentials not found. Set GMAIL_USER and GMAIL_APP_PASSWORD environment variables. Email sending will be disabled.", - ); + if (!gmailUser || !gmailAppPassword) { + return null; + } + + return nodemailer.createTransport({ + service: "gmail", + auth: { + user: gmailUser, + pass: gmailAppPassword, + }, + }); +} + +let cachedTransporter: nodemailer.Transporter | null | undefined; + +// Exported getter that handles caching and connection verification +export function getEmailTransporter() { + if (cachedTransporter === undefined) { + const transporter = getTransporter(); + cachedTransporter = transporter; + + if (transporter) { + transporter + .verify() + .then(() => { + console.log("[Email] Gmail SMTP connection verified successfully"); + }) + .catch((error) => { + console.error("[Email] Gmail SMTP connection failed:", error); + }); + } else { + console.warn( + "[Email] Gmail credentials not found. Set GMAIL_USER and GMAIL_APP_PASSWORD environment variables. Email sending will be disabled.", + ); + } + } + return cachedTransporter; } -// Create Gmail transporter -export const transporter = - gmailUser && gmailAppPassword - ? nodemailer.createTransport({ - service: "gmail", - auth: { - user: gmailUser, - pass: gmailAppPassword, - }, - }) - : null; - -export const isEmailEnabled = !!transporter; - -// Verify connection on startup (optional but recommended) -if (transporter) { - transporter - .verify() - .then(() => { - console.log("[Email] Gmail SMTP connection verified successfully"); - }) - .catch((error) => { - console.error("[Email] Gmail SMTP connection failed:", error); - }); +export function isEmailEnabled() { + return getEmailTransporter() !== null; } + diff --git a/src/lib/server/email/service.ts b/src/lib/server/email/service.ts index 53eb975..a977783 100644 --- a/src/lib/server/email/service.ts +++ b/src/lib/server/email/service.ts @@ -1,4 +1,4 @@ -import { transporter, isEmailEnabled } from "./client"; +import { getEmailTransporter, isEmailEnabled } from "./client"; import { generateInviteEmailHTML, generateInviteEmailText, @@ -25,7 +25,8 @@ export const sendInviteEmail = async ({ messageId?: string; error?: string; }> => { - if (!isEmailEnabled || !transporter) { + // Check if email is enabled using the function call + if (!isEmailEnabled()) { console.warn( "[Email] Email service is not configured. Skipping email send.", ); @@ -35,9 +36,17 @@ export const sendInviteEmail = async ({ }; } + const transporter = getEmailTransporter(); + if (!transporter) { + return { + success: false, + error: "Email transporter initialization failed", + }; + } + try { - const gmailUser = import.meta.env.GMAIL_USER; - const fromName = import.meta.env.EMAIL_FROM_NAME || "Mini CMS"; + const gmailUser = process.env.GMAIL_USER; + const fromName = process.env.EMAIL_FROM_NAME || "Mini CMS"; const htmlContent = generateInviteEmailHTML({ recipientEmail: to, diff --git a/src/lib/server/repo/handlers.ts b/src/lib/server/repo/handlers.ts index cebc46b..e1c43d4 100644 --- a/src/lib/server/repo/handlers.ts +++ b/src/lib/server/repo/handlers.ts @@ -109,3 +109,60 @@ export const bulkUpdateFilesHandler = async (c: Context) => { return c.json(error(err.message), err.statusCode || 500); } }; + +export const getRepoConfigHandler = async (c: Context) => { + try { + const { owner, repo } = c.req.param(); + const projectId = c.req.param("projectId"); + const user = c.get("user"); + + if (!projectId) { + return c.json(error("Project ID is required"), 400); + } + + await projectService.checkProjectAccess(projectId, user.id); + + const config = await repoService.getRepoConfig(projectId, owner, repo); + return c.json(success(config)); + } catch (err: any) { + return c.json(error(err.message), err.statusCode || 500); + } +}; + +export const createFileHandler = async (c: Context) => { + try { + const { owner, repo } = c.req.param(); + const projectId = c.req.param("projectId"); + const { path, content, message } = await c.req.json(); + const user = c.get("user"); + + if (!projectId) { + return c.json(error("Project ID is required"), 400); + } + + await projectService.checkProjectAccess(projectId, user.id); + + const { allowed, config } = await repoService.validateAllowedDirectory(projectId, owner, repo, path); + if (!allowed) { + return c.json(error("Access to this directory is not allowed"), 403); + } + + if (config?.naming_convention) { + const filename = path.split("/").pop() || ""; + // Remove extension + const nameWithoutExt = filename.includes(".") + ? filename.split(".").slice(0, -1).join(".") + : filename; + + if (!repoService.validateFileName(nameWithoutExt, config.naming_convention)) { + return c.json(error(`File name must follow ${config.naming_convention} convention`), 400); + } + } + + // We use bulkUpdateFiles for single file creation too as it handles git flow + const result = await repoService.bulkUpdateFiles(projectId, owner, repo, [{ path, content }], message); + return c.json(success(result), 201); + } catch (err: any) { + return c.json(error(err.message), err.statusCode || 500); + } +}; diff --git a/src/lib/server/repo/index.ts b/src/lib/server/repo/index.ts index c4ce834..71b86cb 100644 --- a/src/lib/server/repo/index.ts +++ b/src/lib/server/repo/index.ts @@ -3,8 +3,10 @@ import { Hono } from "hono"; import { z } from "zod"; import { bulkUpdateFilesHandler, + createFileHandler, getDirectoryContentsHandler, getFileContentHandler, + getRepoConfigHandler, listReposHandler, } from "./handlers"; @@ -36,7 +38,20 @@ export const projectRepoRoutes = new Hono() ), getDirectoryContentsHandler, ) + .get("/:owner/:repo/config", getRepoConfigHandler) .get("/:owner/:repo/file", getFileContentHandler) + .post( + "/:owner/:repo/create-file", + zValidator( + "json", + z.object({ + path: z.string(), + content: z.string(), + message: z.string(), + }) + ), + createFileHandler + ) .post("/:owner/:repo/bulk-update", bulkUpdateFilesHandler); export type repoRoutesType = typeof repoRoutes; diff --git a/src/lib/server/repo/service.ts b/src/lib/server/repo/service.ts index 51126e6..3e304fd 100644 --- a/src/lib/server/repo/service.ts +++ b/src/lib/server/repo/service.ts @@ -65,11 +65,11 @@ export class RepoService { return await this.getApp().getInstallationOctokit(parseInt(installationId)); } - async getAllowedDirectories( + async getRepoConfig( projectId: string, owner: string, repo: string - ): Promise { + ): Promise<{ path: string; schema?: any; naming_convention?: string }[]> { try { const octokit = await this.getProjectOctokit(projectId); const { data: configData } = await octokit.rest.repos.getContent({ @@ -86,7 +86,14 @@ export class RepoService { ) { const configContent = Buffer.from(configData.content, "base64").toString("utf8"); const parsedConfig = YAML.parse(configContent); - return parsedConfig.allowed_directories || []; + const rawDirs = parsedConfig.allowed_directories || []; + + return rawDirs.map((item: any) => { + if (typeof item === "string") { + return { path: item }; + } + return item; + }); } return []; @@ -96,24 +103,48 @@ export class RepoService { } } + async getAllowedDirectories( + projectId: string, + owner: string, + repo: string + ): Promise { + const config = await this.getRepoConfig(projectId, owner, repo); + return config.map(c => c.path); + } + async validateAllowedDirectory( projectId: string, owner: string, repo: string, path: string - ): Promise<{ allowed: boolean; allowedDirs?: string[] }> { - const allowedDirs = await this.getAllowedDirectories(projectId, owner, repo); + ): Promise<{ allowed: boolean; config?: { path: string; schema?: any; naming_convention?: string } }> { + const configs = await this.getRepoConfig(projectId, owner, repo); - if (allowedDirs.length > 0) { - const isAllowed = allowedDirs.some( - (dir: string) => path.startsWith(dir + "/") || path === dir + if (configs.length > 0) { + const matchedConfig = configs.find( + (c) => path.startsWith(c.path + "/") || path === c.path ); - return { allowed: isAllowed, allowedDirs }; + return { allowed: !!matchedConfig, config: matchedConfig }; } return { allowed: false }; } + validateFileName(name: string, convention?: string): boolean { + if (!convention) return true; + + switch (convention) { + case "kebab-case": + return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name); + case "snake_case": + return /^[a-z0-9]+(_[a-z0-9]+)*$/.test(name); + case "camelCase": + return /^[a-z][a-zA-Z0-9]*$/.test(name); + default: + return true; + } + } + async listRepos(installationId: string) { const octokit = await this.getInstallationOctokit(installationId); const { data } = await octokit.rest.apps.listReposAccessibleToInstallation({ From b96250234ca5e253f431e2174b9fbe9645d8e7f4 Mon Sep 17 00:00:00 2001 From: lftobs Date: Fri, 23 Jan 2026 01:22:55 +0100 Subject: [PATCH 3/6] feat: add collapsible dashboard sidebar Also bump package version to 0.1.0 and update pnpm-lock.yaml to include tiptap, hocuspocus, yjs and related dependency changes --- package.json | 144 ++--- pnpm-lock.yaml | 841 +++++++++++++++++++++++++ src/components/dashboard/Sidebar.astro | 76 ++- 3 files changed, 950 insertions(+), 111 deletions(-) diff --git a/package.json b/package.json index 6086aa5..fd4b1ea 100644 --- a/package.json +++ b/package.json @@ -1,74 +1,74 @@ { - "name": "mini-cms", - "type": "module", - "version": "0.0.1", - "scripts": { - "dev:astro": "astro dev --port 4321 --remote", - "dev": "npm run dev:astro", - "build": "astro build --remote", - "preview": "astro preview", - "astro": "astro" - }, - "dependencies": { - "@astrojs/alpinejs": "^0.4.9", - "@astrojs/check": "^0.9.6", - "@astrojs/db": "^0.18.3", - "@astrojs/node": "^9.5.1", - "@astrojs/react": "^4.4.2", - "@astrojs/sitemap": "^3.6.0", - "@astrojs/vercel": "^9.0.2", - "@auth/core": "^0.37.4", - "@fontsource/inter": "^5.2.5", - "@fontsource/space-grotesk": "^5.2.6", - "@hocuspocus/provider": "^3.4.3", - "@hocuspocus/server": "^3.4.3", - "@hono/node-server": "^1.13.8", - "@hono/zod-validator": "^0.4.3", - "@libsql/client": "^0.15.4", - "@nanostores/persistent": "^1.0.0", - "@octokit/rest": "^21.1.1", - "@tabler/icons": "^3.35.0", - "@tailwindcss/forms": "^0.5.10", - "@tailwindcss/vite": "^4.1.17", - "@tiptap/extension-collaboration": "^3.15.3", - "@tiptap/extension-collaboration-cursor": "^2.26.2", - "@tiptap/extension-table": "^3.15.3", - "@tiptap/extension-table-cell": "^3.15.3", - "@tiptap/extension-table-header": "^3.15.3", - "@tiptap/extension-table-row": "^3.15.3", - "@tiptap/react": "^3.15.3", - "@tiptap/starter-kit": "^3.15.3", - "@toast-ui/editor": "^3.2.2", - "@toast-ui/react-editor": "^3.2.3", - "@types/alpinejs": "^3.13.11", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@upstash/redis": "^1.35.6", - "@vercel/analytics": "^1.6.1", - "alpinejs": "^3.15.1", - "astro": "^5.16.4", - "axios": "^1.12.0", - "hono": "^4.10.3", - "jsonwebtoken": "^9.0.2", - "nanostores": "^0.11.3", - "nodemailer": "^7.0.11", - "octokit": "^4.1.3", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "tailwind-merge": "^3.3.1", - "tailwind-variants": "^3.1.1", - "tailwindcss": "^4.1.17", - "tiptap": "^1.32.2", - "tw-animate-css": "^1.4.0", - "typescript": "^5.8.3", - "uuid": "^13.0.0", - "yaml": "^2.8.1", - "yjs": "^13.6.29", - "zod": "^3.24.2" - }, - "devDependencies": { - "@biomejs/biome": "2.3.4", - "@types/jsonwebtoken": "^9.0.10", - "@types/nodemailer": "^7.0.4" - } + "name": "mini-cms", + "type": "module", + "version": "0.1.0", + "scripts": { + "dev:astro": "astro dev --port 4321 --remote", + "dev": "npm run dev:astro", + "build": "astro build --remote", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/alpinejs": "^0.4.9", + "@astrojs/check": "^0.9.6", + "@astrojs/db": "^0.18.3", + "@astrojs/node": "^9.5.1", + "@astrojs/react": "^4.4.2", + "@astrojs/sitemap": "^3.6.0", + "@astrojs/vercel": "^9.0.2", + "@auth/core": "^0.37.4", + "@fontsource/inter": "^5.2.5", + "@fontsource/space-grotesk": "^5.2.6", + "@hocuspocus/provider": "^3.4.3", + "@hocuspocus/server": "^3.4.3", + "@hono/node-server": "^1.13.8", + "@hono/zod-validator": "^0.4.3", + "@libsql/client": "^0.15.4", + "@nanostores/persistent": "^1.0.0", + "@octokit/rest": "^21.1.1", + "@tabler/icons": "^3.35.0", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/vite": "^4.1.17", + "@tiptap/extension-collaboration": "^3.15.3", + "@tiptap/extension-collaboration-cursor": "^2.26.2", + "@tiptap/extension-table": "^3.15.3", + "@tiptap/extension-table-cell": "^3.15.3", + "@tiptap/extension-table-header": "^3.15.3", + "@tiptap/extension-table-row": "^3.15.3", + "@tiptap/react": "^3.15.3", + "@tiptap/starter-kit": "^3.15.3", + "@toast-ui/editor": "^3.2.2", + "@toast-ui/react-editor": "^3.2.3", + "@types/alpinejs": "^3.13.11", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@upstash/redis": "^1.35.6", + "@vercel/analytics": "^1.6.1", + "alpinejs": "^3.15.1", + "astro": "^5.16.4", + "axios": "^1.12.0", + "hono": "^4.10.3", + "jsonwebtoken": "^9.0.2", + "nanostores": "^0.11.3", + "nodemailer": "^7.0.11", + "octokit": "^4.1.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwind-merge": "^3.3.1", + "tailwind-variants": "^3.1.1", + "tailwindcss": "^4.1.17", + "tiptap": "^1.32.2", + "tw-animate-css": "^1.4.0", + "typescript": "^5.8.3", + "uuid": "^13.0.0", + "yaml": "^2.8.1", + "yjs": "^13.6.29", + "zod": "^3.24.2" + }, + "devDependencies": { + "@biomejs/biome": "2.3.4", + "@types/jsonwebtoken": "^9.0.10", + "@types/nodemailer": "^7.0.4" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4157146..8792ea0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,12 @@ importers: '@fontsource/space-grotesk': specifier: ^5.2.6 version: 5.2.6 + '@hocuspocus/provider': + specifier: ^3.4.3 + version: 3.4.3(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) + '@hocuspocus/server': + specifier: ^3.4.3 + version: 3.4.3(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) '@hono/node-server': specifier: ^1.13.8 version: 1.14.1(hono@4.10.3) @@ -62,6 +68,30 @@ importers: '@tailwindcss/vite': specifier: ^4.1.17 version: 4.1.17(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1)) + '@tiptap/extension-collaboration': + specifier: ^3.15.3 + version: 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29) + '@tiptap/extension-collaboration-cursor': + specifier: ^2.26.2 + version: 2.26.2(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)) + '@tiptap/extension-table': + specifier: ^3.15.3 + version: 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + '@tiptap/extension-table-cell': + specifier: ^3.15.3 + version: 3.16.0(@tiptap/extension-table@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-table-header': + specifier: ^3.15.3 + version: 3.16.0(@tiptap/extension-table@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-table-row': + specifier: ^3.15.3 + version: 3.16.0(@tiptap/extension-table@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/react': + specifier: ^3.15.3 + version: 3.16.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tiptap/starter-kit': + specifier: ^3.15.3 + version: 3.16.0 '@toast-ui/editor': specifier: ^3.2.2 version: 3.2.2 @@ -122,6 +152,9 @@ importers: tailwindcss: specifier: ^4.1.17 version: 4.1.17 + tiptap: + specifier: ^1.32.2 + version: 1.32.2(vue-template-compiler@2.7.16) tw-animate-css: specifier: ^1.4.0 version: 1.4.0 @@ -134,6 +167,9 @@ importers: yaml: specifier: ^2.8.1 version: 2.8.1 + yjs: + specifier: ^13.6.29 + version: 13.6.29 zod: specifier: ^3.24.2 version: 3.24.2 @@ -832,12 +868,36 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@fontsource/inter@5.2.5': resolution: {integrity: sha512-kbsPKj0S4p44JdYRFiW78Td8Ge2sBVxi/PIBwmih+RpSXUdvS9nbs1HIiuUSPtRMi14CqLEZ/fbk7dj7vni1Sg==} '@fontsource/space-grotesk@5.2.6': resolution: {integrity: sha512-Ejf50hUdoWYFkVdqckXxXuIY3tPgQZ/095EHa21uLBOuk7CQAlxqSdkPu5y47Xv+xa8A4TSrdAJlS9YdF5DqGg==} + '@hocuspocus/common@3.4.3': + resolution: {integrity: sha512-wnBBO9sWcVAoUPEXN1qO+zk3HaEF9VTemxB6kjuuH6e1dHnD0v12m4P4X1wiZVhmMIX/PMl/fu3MGtYWQJz8gA==} + + '@hocuspocus/provider@3.4.3': + resolution: {integrity: sha512-zt+UgVXGsEQrqnDZgavc2PT9yKJjmVjV+5YxvhlmFVFLVORqawT4l601aKmLPhvyK97un4ZApZ5rso8iO6crWg==} + peerDependencies: + y-protocols: ^1.0.6 + yjs: ^13.6.8 + + '@hocuspocus/server@3.4.3': + resolution: {integrity: sha512-a9bqAXUMBo9YBeuzqNf9C3eVbu1RIWUrtmFMGq+ZssQr3Jugt/5PCkZskgqhJNvPkyTARHcUtN80j/SDLylZmg==} + peerDependencies: + y-protocols: ^1.0.6 + yjs: ^13.6.8 + '@hono/node-server@1.14.1': resolution: {integrity: sha512-vmbuM+HPinjWzPe7FFPWMMQMsbKE9gDPhaH0FFdqbGpkT5lp++tcWDTxwBl5EgS5y6JVgIaCdjeHRfQ4XRBRjQ==} engines: {node: '>=18.14.1'} @@ -1124,6 +1184,9 @@ packages: cpu: [x64] os: [win32] + '@lifeomic/attempt@3.1.0': + resolution: {integrity: sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==} + '@mapbox/node-pre-gyp@2.0.3': resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} engines: {node: '>=18'} @@ -1295,6 +1358,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -1711,6 +1777,200 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 + '@tiptap/core@3.16.0': + resolution: {integrity: sha512-XegRaNuoQ/guzBQU2xHxOwFXXrtoXW9tiyXDhssSqylvZmBVSlRIPNHA6ArkHBKm6ehLf6+6Y9fF3uky1yCXYQ==} + peerDependencies: + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-blockquote@3.16.0': + resolution: {integrity: sha512-c1bhJ3KDFXyNcMweiBzu0LouBXfUC/sUMtaEafQePR98BVu+d0tmWXcGlfVarGVoRyCYFa1mHpkgtxp4SS3lag==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-bold@3.16.0': + resolution: {integrity: sha512-S61wtChbOigk2bklCJ2uEa8jbAnI9ChbW4d1z/Uv/Hr6eWo42vVBtjNZKFOsiBPDajFZbOfnvekGs731jNrHKg==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-bubble-menu@3.16.0': + resolution: {integrity: sha512-nFL7FMu1LjZ5ZGf4U3tw56JLj/SpLysZvHQ1EneGB+90TEI/WReOvTY9VwH1egGWwrl7/OvQuGKclbuLIsy+BA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-bullet-list@3.16.0': + resolution: {integrity: sha512-GjKssVf9241GLdshdYRzPPApWQIB+7GJy0TZgx7bWmFUVgypYxDoE/rQRmvb3Fhup836bgfpfUzStevJ6eIClw==} + peerDependencies: + '@tiptap/extension-list': ^3.16.0 + + '@tiptap/extension-code-block@3.16.0': + resolution: {integrity: sha512-hAsXe6fIBsvIMWlVEXKLEzFQ8h6VUEBWqEEFIQgq+SpZCkGX+KzVmFXd5V2aDqb+BoOyqYiA2w1d/frBBxVEpw==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-code@3.16.0': + resolution: {integrity: sha512-U8/bz/1BhQ39LJgUqJ8u1HzLcYdtubUWVAVC8seteLz1vIhXkTyfAC8478KQ+YdIDkMzAs+0vxk5BsWcWG16zQ==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-collaboration-cursor@2.26.2': + resolution: {integrity: sha512-FdRb27mZ5Kr18hN6cbfBj1e9F0DOoHB1Gv3IYeic+g4h1C9BjDVMN0+JRBQc+4lamNA8TsHO0oKWRwaPe4sSlA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + y-prosemirror: ^1.2.11 + + '@tiptap/extension-collaboration@3.16.0': + resolution: {integrity: sha512-5hoAZ3Ooi0ESvwMPLHV46Np0U3xMIZJ2uvITY7JWgIe7O1vkqo9mhr+/PI1V1S7JN6mqX5XJBbe9D1F9YvNJVw==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + '@tiptap/y-tiptap': ^3.0.0 + yjs: ^13 + + '@tiptap/extension-document@3.16.0': + resolution: {integrity: sha512-vOwBnJIonYmmFVMEnnE1jwoUMq0P/9BcaUocIG9o5iFRTV38I8YGn8n6DiE1pjSeLXRpLrXl6LLwdOMBJewhBg==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-dropcursor@3.16.0': + resolution: {integrity: sha512-n9Gbt99K9oBChjp8puF0ffAJtBF6ZVjydG5u5QO2Z8sHNE+Hn6ARfgZqLjr11ZF4b+mLShqsmyROmITNf73W+A==} + peerDependencies: + '@tiptap/extensions': ^3.16.0 + + '@tiptap/extension-floating-menu@3.16.0': + resolution: {integrity: sha512-cokYXL8EkW+CFIlke70GLL7iKetUtYEp87muMG9oflczyj0BjmGAbO7Mskm+bcQBhxZ0dIYILTqKn2bNBvCDFw==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-gapcursor@3.16.0': + resolution: {integrity: sha512-8dxE4bkfn6Jog/JHDxN/kzcRbyJB7HyFqCKdiTq0f4atzysmnEUuMswwlwMPaErkzlETD6B8NEEtMknEUqowGA==} + peerDependencies: + '@tiptap/extensions': ^3.16.0 + + '@tiptap/extension-hard-break@3.16.0': + resolution: {integrity: sha512-nwUTixlHYo9V1lfOYsRi2JiAYCRC7pObB3Kt7rEeMxB3XmcRcSpHtxYs6r+TvifsLFys8RG5wOFXIV/YXZHcDg==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-heading@3.16.0': + resolution: {integrity: sha512-du4d1Ukvhr1zvPWlU/HS3NMlRswzGRSNDNfCFUhdYgQoHOSnUXshnlKD3E5H0EHfL9UwT4JFyqAT3+1ZnahkdA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-horizontal-rule@3.16.0': + resolution: {integrity: sha512-yyKl45UCH55pIf8G4bHiUNFxggipRVT276c3t9vrkXU6BkJhzfxxcIc5svWkiThDjdYmJs1FfVCYAtGSuKiSyA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-italic@3.16.0': + resolution: {integrity: sha512-SVNnkRUK6G+dQse5Ms8Q/wudSTh37O94p02RDc3KneEtBk6wkokqCLuwKnWLPhlEqsuOku+wTD9DSJdvoRlq9w==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-link@3.16.0': + resolution: {integrity: sha512-WPPJLtGXQadBVVwH6gcMpaXIgfvFF9NGpE2IVqleVKR3Epv2Rd4aWd4oyAdrT8KU9G6dzMXZfkrB8aArTDKxYQ==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-list-item@3.16.0': + resolution: {integrity: sha512-kshssUZEPoosPWbJNQEFJnVV3iPwsDU9l/RCdHJB5SE+aNWJyUk5hQ/YwngEHjV7rS+RnAuhbrcB5swgyzROuA==} + peerDependencies: + '@tiptap/extension-list': ^3.16.0 + + '@tiptap/extension-list-keymap@3.16.0': + resolution: {integrity: sha512-AU3J9W6uo835ZdxiGmrYx1KUymzvfkU4d278X0OBAfujORXkbDNlo9er8pOrOpgXNxgtnlH32lWR4bWyKdUgwA==} + peerDependencies: + '@tiptap/extension-list': ^3.16.0 + + '@tiptap/extension-list@3.16.0': + resolution: {integrity: sha512-tpjWGugfI0XYR9iG/QlYYtCY35TFWHNwGKc94wN4s7NmAjB4xlwdTkTZQ6PdZ39x1SeHkRjxAka+6GcBIoOHGQ==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-ordered-list@3.16.0': + resolution: {integrity: sha512-mNKqwEgiXSMi5afGtnodsptveukpr3GqcGsw2fqJFyNq9SITznjiiuQfULtzVnayC8qHsk0Zzbpzf0zvdHlypg==} + peerDependencies: + '@tiptap/extension-list': ^3.16.0 + + '@tiptap/extension-paragraph@3.16.0': + resolution: {integrity: sha512-JHn3ev7US5FxtQFyEOeQ8XfvKcR5NiHkwDH2Gcwe+0ttpA/Qrrr5XN3tJIgI3rXfR5DjxArq/QO0OTVBm3xlJA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-strike@3.16.0': + resolution: {integrity: sha512-l5/4+gii53kET7ETyYpbTumoQdZ6HwJLUcDlGHutLZlBCaZPxFTi5qgHQBhNq5KAzRH3LVJeb0fEeMi+yCZBQA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-table-cell@3.16.0': + resolution: {integrity: sha512-SMYrXI78ujRiuLN1AGHYSbH8w8dLvXbXtNMyLa194E6UQ+Q3ljd07CJ8af5fiPEqYPG5GA+r4Ka6+MVmAq5AKQ==} + peerDependencies: + '@tiptap/extension-table': ^3.16.0 + + '@tiptap/extension-table-header@3.16.0': + resolution: {integrity: sha512-MxwfzV1TufdYdQHG+W6OtTPMEuhRLPt6rlBuZU5ASGl5XATyG9ltbuDu1/NwqITpixvKvebVd0200afvNBgmgg==} + peerDependencies: + '@tiptap/extension-table': ^3.16.0 + + '@tiptap/extension-table-row@3.16.0': + resolution: {integrity: sha512-bM7UuXdMQwVf+6qk9X6gnIbhI16gLxyElSyQvecFozDaYl3NI+UYwztyHm01cvuNbWLPDqkKwrCE+25Q9P3W/A==} + peerDependencies: + '@tiptap/extension-table': ^3.16.0 + + '@tiptap/extension-table@3.16.0': + resolution: {integrity: sha512-m7h7YdffWxI0lglKUfR+39UD9psOprn/E4qYzjxOSXl1rg8DnP6zi8LF+5X+v32my9WBbizXxVBIdy8AuDWxAw==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/extension-text@3.16.0': + resolution: {integrity: sha512-KTewoX4wZq95cKnjBbogRwBFoGgM6qUg1yjCQ/M6Ajkp4Mtp8Iki9EiAxtfk76b/wtXFf3DsDhFOeVqgKyYbYg==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extension-underline@3.16.0': + resolution: {integrity: sha512-obXAPgHVZocMaW6HtKyCYsN4CxHogWr23gioyEQcpIX0LeegHDqxkoPrjIPX6Tn1isDyvXchcSKWHEfiHO3ZOA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + + '@tiptap/extensions@3.16.0': + resolution: {integrity: sha512-0iVrn0FHcHIRMdsQLQbf16NgYrKz+Sup/8dDMVBy1QoHn5Hb51QZABqXJTZ6u7My34b4fNZrSggzBAE7l7N/pA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + + '@tiptap/pm@3.16.0': + resolution: {integrity: sha512-FMxZ6Tc5ONKa/EByDV8lswct6YW2lF/wn11zqXmrfBZhdG7UQPTijpSwb6TCqaO5GOHmixaIaDPj+zimUREHQA==} + + '@tiptap/react@3.16.0': + resolution: {integrity: sha512-r1R19Ma4zxGt8ImiNOqSArAnWO239KUI9tTVeelgTyekPj7643lO8GbtuXJfAeWGPduDIpcAgR/Dd4NKieetiA==} + peerDependencies: + '@tiptap/core': ^3.16.0 + '@tiptap/pm': ^3.16.0 + '@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.16.0': + resolution: {integrity: sha512-eWi+77SgKyhSx91Hmn32ER+gPN6FfInGtod4A+XxSG+LqS/sn6kpUEdowYrnqiZzhUXZCSTSJvC+UcMUZHOkxQ==} + + '@tiptap/y-tiptap@3.0.1': + resolution: {integrity: sha512-F3hj5X77ckmyIywbCQpKgyX3xKra2/acJPWaV5R9wqp0cUPBmm62FYbkQ6HaqxH1VhCkUhhAZcDSQjbjj7tnWw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + '@toast-ui/editor@3.2.2': resolution: {integrity: sha512-ASX7LFjN2ZYQJrwmkUajPs7DRr9FsM1+RQ82CfTO0Y5ZXorBk1VZS4C2Dpxinx9kl55V4F8/A2h2QF4QMDtRbA==} @@ -1752,9 +2012,18 @@ packages: '@types/jsonwebtoken@9.0.10': resolution: {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/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -1791,6 +2060,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -1961,6 +2233,12 @@ packages: engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -2117,6 +2395,9 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2155,6 +2436,9 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -2405,6 +2689,10 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} @@ -2431,6 +2719,10 @@ packages: fast-deep-equal@3.1.3: resolution: {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: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2594,6 +2886,10 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hono@4.10.3: resolution: {integrity: sha512-2LOYWUbnhdxdL8MNbNg9XZig6k+cZXm5IjHn2Aviv7honhBMOHb+jxrKIeJRZJRmn+htUCKhaicxwXuUDlchRA==} engines: {node: '>=16.9.0'} @@ -2661,6 +2957,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2721,6 +3020,11 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + lib0@0.2.117: + resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} + engines: {node: '>=16'} + hasBin: true + libsql@0.5.22: resolution: {integrity: sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA==} cpu: [x64, arm64, wasm32, arm] @@ -2801,6 +3105,12 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2844,6 +3154,10 @@ packages: magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -2896,6 +3210,9 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -3216,9 +3533,21 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + + 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.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + prosemirror-history@1.5.0: resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} @@ -3228,21 +3557,50 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + prosemirror-markdown@1.13.3: + resolution: {integrity: sha512-3E+Et6cdXIH0EgN2tGYQ+EBT7N4kMiZFsW+hzx+aPtOmADDHWCdd2uUQb7yklJrfUYUOjEEu22BiN6UFgPe4cQ==} + + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + 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.10.5: resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} prosemirror-view@1.41.3: resolution: {integrity: sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==} + prosemirror-view@1.41.5: + resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3503,6 +3861,18 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tiptap-commands@1.17.1: + resolution: {integrity: sha512-CyGvMD/c6fNer5LThWGtrVMXHAqHn93ivGQpqJ58x3HNZFuoIiF9QTWXAiWbY/4QrG0ANYHKCSe9n5afickTqw==} + + tiptap-utils@1.13.1: + resolution: {integrity: sha512-RoCvMfkdu7fp9u7nsRr1OgsYU8RFjoHKHEKpx075rJ9X0t+j5Vxah9n6QzTTr4yjvcavq22WO2flFacm36zYtA==} + + tiptap@1.32.2: + resolution: {integrity: sha512-5IwVj8nGo8y5V3jbdtoEd7xNUsi8Q0N6WV2Nfs70olqz3fldXkiImBrDhZJ4Anx8vhyP6PIBttrg0prFVmwIvw==} + peerDependencies: + vue: ^2.5.17 + vue-template-compiler: ^2.5.17 + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3555,6 +3925,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -3686,6 +4059,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + uuid@13.0.0: resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true @@ -3839,6 +4217,9 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -3895,6 +4276,22 @@ packages: xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y-prosemirror@1.3.7: + resolution: {integrity: sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + + y-protocols@1.0.7: + resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3928,6 +4325,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yjs@13.6.29: + resolution: {integrity: sha512-kHqDPdltoXH+X4w1lVmMtddE3Oeqq48nM40FD5ojTd8xYhQpzIDcfE2keMSU5bAgRPJBe225WTUdyUgj1DtbiQ==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} @@ -4895,10 +5296,54 @@ snapshots: '@esbuild/win32-x64@0.25.2': optional: true + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + optional: true + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + optional: true + + '@floating-ui/utils@0.2.10': + optional: true + '@fontsource/inter@5.2.5': {} '@fontsource/space-grotesk@5.2.6': {} + '@hocuspocus/common@3.4.3': + dependencies: + lib0: 0.2.117 + + '@hocuspocus/provider@3.4.3(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)': + dependencies: + '@hocuspocus/common': 3.4.3 + '@lifeomic/attempt': 3.1.0 + lib0: 0.2.117 + ws: 8.18.1 + y-protocols: 1.0.7(yjs@13.6.29) + yjs: 13.6.29 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@hocuspocus/server@3.4.3(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)': + dependencies: + '@hocuspocus/common': 3.4.3 + async-lock: 1.4.1 + async-mutex: 0.5.0 + kleur: 4.1.5 + lib0: 0.2.117 + ws: 8.18.1 + y-protocols: 1.0.7(yjs@13.6.29) + yjs: 13.6.29 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@hono/node-server@1.14.1(hono@4.10.3)': dependencies: hono: 4.10.3 @@ -5148,6 +5593,8 @@ snapshots: '@libsql/win32-x64-msvc@0.5.7': optional: true + '@lifeomic/attempt@3.1.0': {} + '@mapbox/node-pre-gyp@2.0.3': dependencies: consola: 3.4.2 @@ -5360,6 +5807,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@remirror/core-constants@3.0.0': {} + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/pluginutils@5.3.0(rollup@4.53.3)': @@ -5822,6 +6271,221 @@ snapshots: tailwindcss: 4.1.17 vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1) + '@tiptap/core@3.16.0(@tiptap/pm@3.16.0)': + dependencies: + '@tiptap/pm': 3.16.0 + + '@tiptap/extension-blockquote@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-bold@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-bubble-menu@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + optional: true + + '@tiptap/extension-bullet-list@3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extension-list': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-code-block@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + + '@tiptap/extension-code@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-collaboration-cursor@2.26.2(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) + + '@tiptap/extension-collaboration@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) + yjs: 13.6.29 + + '@tiptap/extension-document@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-dropcursor@3.16.0(@tiptap/extensions@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extensions': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-floating-menu@3.16.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + optional: true + + '@tiptap/extension-gapcursor@3.16.0(@tiptap/extensions@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extensions': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-hard-break@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-heading@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-horizontal-rule@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + + '@tiptap/extension-italic@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-link@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extension-list': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-list-keymap@3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extension-list': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + + '@tiptap/extension-ordered-list@3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extension-list': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-paragraph@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-strike@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-table-cell@3.16.0(@tiptap/extension-table@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extension-table': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-table-header@3.16.0(@tiptap/extension-table@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extension-table': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-table-row@3.16.0(@tiptap/extension-table@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/extension-table': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + + '@tiptap/extension-table@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + + '@tiptap/extension-text@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extension-underline@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + + '@tiptap/extensions@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + + '@tiptap/pm@3.16.0': + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.3 + prosemirror-menu: 1.2.5 + 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.3) + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.3 + + '@tiptap/react@3.16.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@types/use-sync-external-store': 0.0.6 + fast-equals: 5.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + '@tiptap/extension-floating-menu': 3.16.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + transitivePeerDependencies: + - '@floating-ui/dom' + + '@tiptap/starter-kit@3.16.0': + dependencies: + '@tiptap/core': 3.16.0(@tiptap/pm@3.16.0) + '@tiptap/extension-blockquote': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-bold': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-bullet-list': 3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-code': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-code-block': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + '@tiptap/extension-document': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-dropcursor': 3.16.0(@tiptap/extensions@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-gapcursor': 3.16.0(@tiptap/extensions@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-hard-break': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-heading': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-horizontal-rule': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + '@tiptap/extension-italic': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-link': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + '@tiptap/extension-list': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + '@tiptap/extension-list-item': 3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-list-keymap': 3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-ordered-list': 3.16.0(@tiptap/extension-list@3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0)) + '@tiptap/extension-paragraph': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-strike': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-text': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extension-underline': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0)) + '@tiptap/extensions': 3.16.0(@tiptap/core@3.16.0(@tiptap/pm@3.16.0))(@tiptap/pm@3.16.0) + '@tiptap/pm': 3.16.0 + + '@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)': + dependencies: + lib0: 0.2.117 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.3 + y-protocols: 1.0.7(yjs@13.6.29) + yjs: 13.6.29 + '@toast-ui/editor@3.2.2': dependencies: dompurify: 2.5.8 @@ -5882,10 +6546,19 @@ snapshots: '@types/ms': 2.1.0 '@types/node': 22.14.0 + '@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/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': @@ -5930,6 +6603,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/use-sync-external-store@0.0.6': {} + '@types/ws@8.18.1': dependencies: '@types/node': 24.10.1 @@ -6211,6 +6886,12 @@ snapshots: - uploadthing - yaml + async-lock@1.4.1: {} + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + async-sema@3.1.1: {} asynckit@0.4.0: {} @@ -6343,6 +7024,8 @@ snapshots: cookie@1.1.1: {} + crelt@1.0.6: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -6383,6 +7066,8 @@ snapshots: data-uri-to-buffer@4.0.1: {} + de-indent@1.0.2: {} + debug@4.4.3: dependencies: ms: 2.1.3 @@ -6565,6 +7250,8 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} estree-walker@2.0.2: {} @@ -6583,6 +7270,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 @@ -6816,6 +7505,8 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + hono@4.10.3: {} html-escaper@3.0.3: {} @@ -6869,6 +7560,8 @@ snapshots: isexe@2.0.0: {} + isomorphic.js@0.2.5: {} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -6928,6 +7621,10 @@ snapshots: kleur@4.1.5: {} + lib0@0.2.117: + dependencies: + isomorphic.js: 0.2.5 + libsql@0.5.22: dependencies: '@neon-rs/load': 0.0.4 @@ -7005,6 +7702,12 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -7043,6 +7746,15 @@ snapshots: '@babel/types': 7.28.5 source-map-js: 1.2.1 + markdown-it@14.1.0: + 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 + markdown-table@3.0.4: {} math-intrinsics@1.1.0: {} @@ -7171,6 +7883,8 @@ snapshots: mdn-data@2.12.2: {} + mdurl@2.0.0: {} + merge2@1.4.1: {} micromark-core-commonmark@2.0.3: @@ -7558,12 +8272,33 @@ snapshots: property-information@7.1.0: {} + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.10.5 + + 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.10.5 + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.3 + + prosemirror-gapcursor@1.4.0: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.3 + prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 @@ -7581,16 +8316,55 @@ snapshots: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 + prosemirror-markdown@1.13.3: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.2.5: + 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.10.5 + prosemirror-state@1.4.4: dependencies: prosemirror-model: 1.25.4 prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 + prosemirror-tables@1.8.5: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.5 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3): + 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.3 + prosemirror-transform@1.10.5: dependencies: prosemirror-model: 1.25.4 @@ -7601,8 +8375,16 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-transform: 1.10.5 + prosemirror-view@1.41.5: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + proxy-from-env@1.1.0: {} + punycode.js@2.3.1: {} + punycode@2.3.1: optional: true @@ -7951,6 +8733,36 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tiptap-commands@1.17.1: + dependencies: + prosemirror-commands: 1.7.1 + prosemirror-inputrules: 1.5.1 + prosemirror-model: 1.25.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + tiptap-utils: 1.13.1 + + tiptap-utils@1.13.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + + tiptap@1.32.2(vue-template-compiler@2.7.16): + dependencies: + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.3 + tiptap-commands: 1.17.1 + tiptap-utils: 1.13.1 + vue-template-compiler: 2.7.16 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7983,6 +8795,8 @@ snapshots: typescript@5.8.3: {} + uc.micro@2.1.0: {} + ufo@1.6.1: {} ultrahtml@1.6.0: {} @@ -8090,6 +8904,10 @@ snapshots: punycode: 2.3.1 optional: true + use-sync-external-store@1.6.0(react@18.3.1): + dependencies: + react: 18.3.1 + uuid@13.0.0: {} vfile-location@5.0.3: @@ -8223,6 +9041,11 @@ snapshots: vscode-uri@3.1.0: {} + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + w3c-keyname@2.2.8: {} web-namespaces@2.0.1: {} @@ -8268,6 +9091,20 @@ snapshots: xxhash-wasm@1.1.0: {} + y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29): + dependencies: + lib0: 0.2.117 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.3 + y-protocols: 1.0.7(yjs@13.6.29) + yjs: 13.6.29 + + y-protocols@1.0.7(yjs@13.6.29): + dependencies: + lib0: 0.2.117 + yjs: 13.6.29 + y18n@5.0.8: {} yallist@3.1.1: {} @@ -8305,6 +9142,10 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yjs@13.6.29: + dependencies: + lib0: 0.2.117 + yocto-queue@1.2.2: {} yocto-spinner@0.2.3: diff --git a/src/components/dashboard/Sidebar.astro b/src/components/dashboard/Sidebar.astro index 6ee586a..c7275da 100644 --- a/src/components/dashboard/Sidebar.astro +++ b/src/components/dashboard/Sidebar.astro @@ -69,37 +69,52 @@ const { organizations = [], currentOrg = null } = Astro.props; class="h-full bg-white border-r border-earth-100 flex flex-col transition-all duration-300 md:relative fixed top-0 left-0 bottom-0 z-40 md:z-auto shadow-lg md:shadow-none overflow-hidden" :class="{ 'md:w-64': !isCollapsed, 'md:w-16': isCollapsed, 'translate-x-0': isMobileMenuOpen, '-translate-x-full md:translate-x-0': !isMobileMenuOpen }" > -
-

Dashboard

- + + + +
-