diff --git a/app/(chat)/flow-board/layout.tsx b/app/(chat)/flow-board/layout.tsx new file mode 100644 index 000000000..2e0557122 --- /dev/null +++ b/app/(chat)/flow-board/layout.tsx @@ -0,0 +1,12 @@ +export default function FlowBoardLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + <> + + {children} + > + ); +} diff --git a/app/(chat)/flow-board/page.tsx b/app/(chat)/flow-board/page.tsx new file mode 100644 index 000000000..42d9f2d2c --- /dev/null +++ b/app/(chat)/flow-board/page.tsx @@ -0,0 +1,19 @@ +import type { Metadata } from "next"; +import { FlowBoardClient } from "@/components/flow-board/flow-board-client"; +import { getSiteSettings } from "@/lib/db/queries"; + +export const metadata: Metadata = { + title: "流程白板", +}; + +export default async function FlowBoardPage() { + const siteSettings = await getSiteSettings(); + + return ( + + ); +} diff --git a/app/api/flow-board/draft/route.ts b/app/api/flow-board/draft/route.ts new file mode 100644 index 000000000..19ef9b066 --- /dev/null +++ b/app/api/flow-board/draft/route.ts @@ -0,0 +1,90 @@ +import { NextResponse } from "next/server"; +import { auth } from "@/app/(auth)/auth"; +import { + getFlowBoardDraftByUserId, + upsertFlowBoardDraftByUserId, +} from "@/lib/db/queries"; +import type { FlowBoardSnapshotData } from "@/lib/db/schema"; + +export const runtime = "nodejs"; + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function normalizeRecord(value: unknown): Record | null { + return isRecord(value) ? value : null; +} + +function normalizeFlowBoardSnapshot(value: unknown): FlowBoardSnapshotData { + const raw = isRecord(value) ? value : {}; + const updatedAt = + typeof raw.updatedAt === "string" && raw.updatedAt.trim() + ? raw.updatedAt + : new Date().toISOString(); + + return { + children: Array.isArray(raw.children) + ? raw.children.filter(isRecord) + : [], + viewport: normalizeRecord(raw.viewport), + theme: normalizeRecord(raw.theme), + updatedAt, + }; +} + +export async function GET() { + const session = await auth(); + if (!session?.user?.id) { + return NextResponse.json( + { success: false, error: "未登录" }, + { status: 401 } + ); + } + + const draft = await getFlowBoardDraftByUserId({ + userId: session.user.id, + }); + + return NextResponse.json({ + success: true, + data: { + snapshot: draft?.snapshot ?? { children: [] }, + updatedAt: draft?.updatedAt?.toISOString() ?? null, + }, + }); +} + +export async function PUT(request: Request) { + const session = await auth(); + if (!session?.user?.id) { + return NextResponse.json( + { success: false, error: "未登录" }, + { status: 401 } + ); + } + + const body = (await request.json().catch(() => ({}))) as { + snapshot?: unknown; + }; + const snapshot = normalizeFlowBoardSnapshot(body.snapshot ?? body); + const savedDraft = await upsertFlowBoardDraftByUserId({ + userId: session.user.id, + snapshot, + }); + + if (!savedDraft) { + return NextResponse.json( + { success: false, error: "保存流程白板失败" }, + { status: 500 } + ); + } + + return NextResponse.json({ + success: true, + data: { + snapshot: savedDraft.snapshot, + updatedAt: savedDraft.updatedAt?.toISOString() ?? snapshot.updatedAt, + }, + }); +} diff --git a/components/chat-shell.tsx b/components/chat-shell.tsx index 803313f88..5b3c6c845 100644 --- a/components/chat-shell.tsx +++ b/components/chat-shell.tsx @@ -69,12 +69,13 @@ export function ChatShell({ const pathname = usePathname(); const isLovartHome = pathname === "/" && homeVariant === "lovart"; const isAiCadWorkspace = pathname === "/ai-cad"; + const isFlowBoardWorkspace = pathname === "/flow-board"; if (isLovartHome) { return {children}; } - if (isAiCadWorkspace) { + if (isAiCadWorkspace || isFlowBoardWorkspace) { return {children}; } diff --git a/components/flow-board/drawnix-workspace.tsx b/components/flow-board/drawnix-workspace.tsx new file mode 100644 index 000000000..4e09f52f1 --- /dev/null +++ b/components/flow-board/drawnix-workspace.tsx @@ -0,0 +1,268 @@ +"use client"; + +import { Drawnix, type DrawnixProps } from "@drawnix/drawnix"; +import type { BoardChangeData } from "@plait-board/react-board"; +import type { + PlaitElement, + PlaitTheme, + ThemeColorMode, + Viewport, +} from "@plait/core"; +import { ChevronLeft, Save } from "lucide-react"; +import { useTheme } from "next-themes"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { toast } from "sonner"; + +type FlowBoardWorkspaceProps = { + siteName: string; + siteLogo: string | null; + siteLogoDark: string | null; +}; + +type FlowBoardSnapshot = { + children: PlaitElement[]; + viewport?: Viewport; + theme?: PlaitTheme; + updatedAt?: string; +}; + +const FLOW_BOARD_DRAFT_API = "/api/flow-board/draft"; + +function normalizeSnapshot(value: unknown): FlowBoardSnapshot { + const raw = + value && typeof value === "object" && !Array.isArray(value) + ? (value as Partial) + : {}; + + return { + children: Array.isArray(raw.children) ? raw.children : [], + viewport: raw.viewport, + theme: raw.theme, + updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : undefined, + }; +} + +function formatSavedAt(value: Date | null) { + if (!value) return "数据库自动保存"; + return `已保存 ${value.toLocaleTimeString("zh-CN", { + hour: "2-digit", + minute: "2-digit", + })}`; +} + +export function DrawnixWorkspace({ + siteName, + siteLogo, + siteLogoDark, +}: FlowBoardWorkspaceProps) { + const { resolvedTheme } = useTheme(); + const [snapshot, setSnapshot] = useState({ + children: [], + }); + const [isReady, setIsReady] = useState(false); + const [lastSavedAt, setLastSavedAt] = useState(null); + const snapshotRef = useRef({ children: [] }); + const saveTimerRef = useRef | null>(null); + + const displayLogo = useMemo(() => { + if (resolvedTheme === "dark" && siteLogoDark) { + return siteLogoDark; + } + return siteLogo || siteLogoDark; + }, [resolvedTheme, siteLogo, siteLogoDark]); + + useEffect(() => { + let cancelled = false; + + const loadDraft = async () => { + try { + const response = await fetch(FLOW_BOARD_DRAFT_API, { + cache: "no-store", + credentials: "include", + }); + if (!response.ok) { + throw new Error(`Failed to load flow board draft: ${response.status}`); + } + const result = (await response.json()) as { + data?: { snapshot?: unknown; updatedAt?: string | null }; + }; + if (!cancelled) { + const nextSnapshot = normalizeSnapshot(result.data?.snapshot); + snapshotRef.current = nextSnapshot; + setSnapshot(nextSnapshot); + setLastSavedAt( + result.data?.updatedAt + ? new Date(result.data.updatedAt) + : nextSnapshot.updatedAt + ? new Date(nextSnapshot.updatedAt) + : null + ); + } + } catch (error) { + console.error("[FlowBoard] Failed to load draft:", error); + toast.error("流程白板草稿加载失败"); + } finally { + if (!cancelled) { + setIsReady(true); + } + } + }; + + void loadDraft(); + + return () => { + cancelled = true; + if (saveTimerRef.current) { + clearTimeout(saveTimerRef.current); + } + }; + }, []); + + const scheduleSave = useCallback((nextSnapshot: FlowBoardSnapshot) => { + if (saveTimerRef.current) { + clearTimeout(saveTimerRef.current); + } + + saveTimerRef.current = setTimeout(async () => { + try { + const response = await fetch(FLOW_BOARD_DRAFT_API, { + body: JSON.stringify({ snapshot: nextSnapshot }), + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + method: "PUT", + }); + if (!response.ok) { + throw new Error(`Failed to save flow board draft: ${response.status}`); + } + const result = (await response.json()) as { + data?: { updatedAt?: string | null }; + }; + setLastSavedAt( + result.data?.updatedAt + ? new Date(result.data.updatedAt) + : new Date(nextSnapshot.updatedAt || Date.now()) + ); + } catch (error) { + console.error("[FlowBoard] Failed to save draft:", error); + toast.error("流程白板草稿保存到数据库失败"); + } + }, 350); + }, []); + + const updateSnapshot = useCallback( + (partialSnapshot: Partial) => { + const nextSnapshot = normalizeSnapshot({ + ...snapshotRef.current, + ...partialSnapshot, + updatedAt: new Date().toISOString(), + }); + snapshotRef.current = nextSnapshot; + setSnapshot(nextSnapshot); + scheduleSave(nextSnapshot); + }, + [scheduleSave] + ); + + const handleDrawnixChange = useCallback( + (value: BoardChangeData) => { + const shouldPersist = value.operations.some( + (operation) => operation.type !== "set_selection" + ); + if (!shouldPersist) return; + + updateSnapshot({ + children: value.children, + theme: value.theme, + viewport: value.viewport, + }); + }, + [updateSnapshot] + ); + + const handleValueChange = useCallback( + (children: PlaitElement[]) => { + updateSnapshot({ children }); + }, + [updateSnapshot] + ); + + const handleViewportChange = useCallback( + (viewport: Viewport) => { + updateSnapshot({ viewport }); + }, + [updateSnapshot] + ); + + const handleThemeChange = useCallback( + (themeColorMode: ThemeColorMode) => { + updateSnapshot({ theme: { themeColorMode } }); + }, + [updateSnapshot] + ); + + if (!isReady) { + return ( + + + 正在恢复流程白板... + + + ); + } + + return ( + + + { + window.location.href = "/"; + }} + type="button" + > + + 返回 + + + + {displayLogo ? ( + + ) : ( + + {siteName.slice(0, 1).toUpperCase()} + + )} + + 流程白板 + + + {siteName} + + + + + {formatSavedAt(lastSavedAt)} + + + + + } + onThemeChange={handleThemeChange} + onValueChange={handleValueChange} + onViewportChange={handleViewportChange} + theme={snapshot.theme} + tutorial={false} + value={snapshot.children} + viewport={snapshot.viewport} + /> + + ); +} diff --git a/components/flow-board/flow-board-client.tsx b/components/flow-board/flow-board-client.tsx new file mode 100644 index 000000000..a0d07b016 --- /dev/null +++ b/components/flow-board/flow-board-client.tsx @@ -0,0 +1,32 @@ +"use client"; + +import dynamic from "next/dynamic"; +import { Loader2 } from "lucide-react"; + +type FlowBoardClientProps = { + siteName: string; + siteLogo: string | null; + siteLogoDark: string | null; +}; + +const DrawnixWorkspace = dynamic( + () => + import("@/components/flow-board/drawnix-workspace").then( + (mod) => mod.DrawnixWorkspace + ), + { + ssr: false, + loading: () => ( + + + + 正在加载流程白板... + + + ), + } +); + +export function FlowBoardClient(props: FlowBoardClientProps) { + return ; +} diff --git a/components/home/lovart-home.tsx b/components/home/lovart-home.tsx index 391b8aa6d..687f6458e 100644 --- a/components/home/lovart-home.tsx +++ b/components/home/lovart-home.tsx @@ -35,6 +35,7 @@ import { User, Users, Wand2, + Workflow, X, Zap, } from "lucide-react"; @@ -1595,6 +1596,19 @@ export function LovartHome({ 视频画布 + + + router.push("/flow-board")} + title="流程白板" + > + + + + 流程白板 + {siteSettingsData?.productPlanningEnabled !== false ? ( diff --git a/components/top-navbar.tsx b/components/top-navbar.tsx index a1547d6d3..7016ef3d9 100644 --- a/components/top-navbar.tsx +++ b/components/top-navbar.tsx @@ -18,6 +18,7 @@ import { Sparkles, Trophy, Wand2, + Workflow, X, } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -615,6 +616,18 @@ export function TopNavbar({ {getShortLabel("视频画布")} + { + window.location.href = "/flow-board"; + }} + title="流程白板" + type="button" + > + + {getShortLabel("流程白板")} + + {/* 无限画布 */} { + try { + const [result] = await db + .select() + .from(flowBoardDraft) + .where(eq(flowBoardDraft.userId, userId)) + .limit(1); + + return result ?? null; + } catch (_error) { + throw new ChatSDKError( + "bad_request:database", + "Failed to get flow board draft" + ); + } +} + +export async function upsertFlowBoardDraftByUserId(params: { + userId: string; + snapshot: FlowBoardSnapshotData; +}): Promise { + try { + const now = new Date(); + const [result] = await db + .insert(flowBoardDraft) + .values({ + userId: params.userId, + snapshot: params.snapshot, + createdAt: now, + updatedAt: now, + }) + .onConflictDoUpdate({ + target: flowBoardDraft.userId, + set: { + snapshot: params.snapshot, + updatedAt: now, + }, + }) + .returning(); + + return result ?? null; + } catch (_error) { + throw new ChatSDKError( + "bad_request:database", + "Failed to save flow board draft" + ); + } +} + export async function upsertConversationWorkingState(params: { userId: string; chatId: string; diff --git a/lib/db/schema.ts b/lib/db/schema.ts index 313ca4a04..8f7e8093b 100644 --- a/lib/db/schema.ts +++ b/lib/db/schema.ts @@ -953,6 +953,29 @@ export const aiCadWorkspace = pgTable("AiCadWorkspace", { export type AiCadWorkspace = InferSelectModel; +export type FlowBoardSnapshotData = { + children: Record[]; + viewport?: Record | null; + theme?: Record | null; + updatedAt?: string | null; +}; + +export const flowBoardDraft = pgTable("FlowBoardDraft", { + id: uuid("id").primaryKey().notNull().defaultRandom(), + userId: uuid("userId") + .notNull() + .references(() => user.id, { onDelete: "cascade" }) + .unique(), + snapshot: jsonb("snapshot") + .$type() + .notNull() + .default({ children: [] }), + createdAt: timestamp("createdAt").notNull().defaultNow(), + updatedAt: timestamp("updatedAt").notNull().defaultNow(), +}); + +export type FlowBoardDraft = InferSelectModel; + // 每轮消息的目标资产/图片定位审计表 export const messageTargetResolution = pgTable("MessageTargetResolution", { id: uuid("id").primaryKey().notNull().defaultRandom(), diff --git a/package.json b/package.json index b0f955069..5498cab02 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,21 @@ "@codemirror/state": "^6.5.0", "@codemirror/theme-one-dark": "^6.1.2", "@codemirror/view": "^6.35.3", + "@drawnix/drawnix": "0.4.0-2", "@fal-ai/serverless-client": "^0.15.0", "@icons-pack/react-simple-icons": "^13.7.0", "@langchain/core": "^1.1.19", "@langchain/langgraph": "^1.1.3", "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.200.0", + "@plait-board/react-board": "0.4.0-2", + "@plait-board/react-text": "0.4.0-2", + "@plait/common": "^0.92.1", + "@plait/core": "^0.92.1", + "@plait/draw": "^0.92.1", + "@plait/layouts": "^0.92.1", + "@plait/mind": "^0.92.1", + "@plait/text-plugins": "^0.92.1", "@radix-ui/react-dialog": "^1.1.4", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-popover": "^1.1.15", @@ -75,6 +84,7 @@ "framer-motion": "^11.18.2", "geist": "^1.3.1", "immer": "^11.1.3", + "is-hotkey": "^0.2.0", "jszip": "^3.10.1", "katex": "^0.16.25", "lucide-react": "^0.446.0", @@ -107,6 +117,10 @@ "server-only": "^0.0.1", "sharp": "^0.34.5", "shiki": "^3.12.2", + "slate": "^0.124.0", + "slate-dom": "^0.124.0", + "slate-history": "^0.115.0", + "slate-react": "^0.124.0", "sonner": "^1.5.0", "streamdown": "^1.3.0", "swr": "^2.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff0bd1e39..8b36a0ffa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ importers: '@codemirror/view': specifier: ^6.35.3 version: 6.36.4 + '@drawnix/drawnix': + specifier: 0.4.0-2 + version: 0.4.0-2(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) '@fal-ai/serverless-client': specifier: ^0.15.0 version: 0.15.0 @@ -62,6 +65,30 @@ importers: '@opentelemetry/api-logs': specifier: ^0.200.0 version: 0.200.0 + '@plait-board/react-board': + specifier: 0.4.0-2 + version: 0.4.0-2(immer@11.1.3)(is-hotkey@0.2.0)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) + '@plait-board/react-text': + specifier: 0.4.0-2 + version: 0.4.0-2(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) + '@plait/common': + specifier: ^0.92.1 + version: 0.92.3 + '@plait/core': + specifier: ^0.92.1 + version: 0.92.3(immer@11.1.3)(is-hotkey@0.2.0) + '@plait/draw': + specifier: ^0.92.1 + version: 0.92.3 + '@plait/layouts': + specifier: ^0.92.1 + version: 0.92.3 + '@plait/mind': + specifier: ^0.92.1 + version: 0.92.3 + '@plait/text-plugins': + specifier: ^0.92.1 + version: 0.92.3 '@radix-ui/react-dialog': specifier: ^1.1.4 version: 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) @@ -173,6 +200,9 @@ importers: immer: specifier: ^11.1.3 version: 11.1.3 + is-hotkey: + specifier: ^0.2.0 + version: 0.2.0 jszip: specifier: ^3.10.1 version: 3.10.1 @@ -269,6 +299,18 @@ importers: shiki: specifier: ^3.12.2 version: 3.14.0 + slate: + specifier: ^0.124.0 + version: 0.124.0 + slate-dom: + specifier: ^0.124.0 + version: 0.124.0(slate@0.124.0) + slate-history: + specifier: ^0.115.0 + version: 0.115.0(slate@0.124.0) + slate-react: + specifier: ^0.124.0 + version: 0.124.0(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)(slate-dom@0.124.0(slate@0.124.0))(slate@0.124.0) sonner: specifier: ^1.5.0 version: 1.7.4(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) @@ -775,6 +817,9 @@ packages: cpu: [x64] os: [win32] + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + '@braintree/sanitize-url@7.1.1': resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} @@ -835,6 +880,9 @@ packages: '@dimforge/rapier3d-compat@0.12.0': resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} + '@drawnix/drawnix@0.4.0-2': + resolution: {integrity: sha512-15o5lTcb8kAidIp022wegIxn/5IGlkmUBnqj0QMbHxYLLzylbEw9iG3pUD31bbuTmrb9iku+g8BqebFkH0Heaw==} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -1296,6 +1344,12 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} @@ -1494,6 +1548,9 @@ packages: '@js-joda/core@5.7.0': resolution: {integrity: sha512-WBu4ULVVxySLLzK1Ppq+OdfP+adRS4ntmDQT915rzDJ++i95gc2jZkM5B6LWEAwN3lGXpfie3yPABozdD3K3Vg==} + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + '@langchain/core@1.1.19': resolution: {integrity: sha512-hmNAcgeLLqNLnu8UK+HVTfB8170eCmAfsy4gFLBYeE+kdsnyO0Hd/Kd42pZi8Cgfux4OMX3yxl+g+/a1ktGe0A==} engines: {node: '>=20'} @@ -1675,6 +1732,39 @@ packages: '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + '@plait-board/markdown-to-drawnix@0.0.7': + resolution: {integrity: sha512-Q7LMEUYNRU3wnvTHIelo8oDFwkRL7JJ6JDpIQyNV492BNMSKrGrokdx6CIKmMM/kyZ3bBWB59Rn9mVcfPimluA==} + + '@plait-board/mermaid-to-drawnix@0.0.7': + resolution: {integrity: sha512-Z3ETJA34o5G/rjaR2kl9ifirFUp1yDq9shxFcgXNTuI6aOmgLafnNtB4m9IsNQDsfsjlzt44oIXeUQdOCj2Bqw==} + + '@plait-board/react-board@0.4.0-2': + resolution: {integrity: sha512-yXiMumj6Ie4mUezLwdMjjT5R53xGw6YviP8BOdc1YX9mZzHB4JvcmbvCgpM8mZT5kdaEFppJ8STP26V8jwtI9A==} + + '@plait-board/react-text@0.4.0-2': + resolution: {integrity: sha512-cPumV6q7Xz4bRjf6EKZ1cYWTbKQKjH0u2vi+8X8PsbTLhLONRQ3iYmVXXBFo7HEPWI2899sP6N0TgKg+iDKJgw==} + + '@plait/common@0.92.3': + resolution: {integrity: sha512-rNQXpjpJNHP9/93+M25Gy2yw8mRNfF7RdOZuSsS0aBrG3rWp0jWFr23M0OhbM8+bFS2pkzkxqNRbDmKkm89zZQ==} + + '@plait/core@0.92.3': + resolution: {integrity: sha512-TRk1XNkePLGvGTQqe7scDu/C9millFnTFrM+tjZmDWscE9y+4IaMp+RcRZ/e6LGzGyRaTYMPD69twLzRQc8J3g==} + peerDependencies: + immer: ^10.0.3 + is-hotkey: ^0.2.0 + + '@plait/draw@0.92.3': + resolution: {integrity: sha512-SlKvJvB3VvusiBV7cVB64Tz8krD8EFYKtlASnva/H21MZciS8dx//4jbGQk5R9O3RGvY79TpZwBlYEzw4ypxDw==} + + '@plait/layouts@0.92.3': + resolution: {integrity: sha512-RSTDBoTNuRmQ5t6xdPuH11gkQTo29bO1SRjwfM0PtZfAN6FODUDMtGlt5pXfSaGUjXzjFPNGYs1vnWQMznGoTw==} + + '@plait/mind@0.92.3': + resolution: {integrity: sha512-0i1ewmz7WZEQyon9YBIJcPVn2vsku0orXxeRIjKNNgET4I4Ee25GJ+yS31WsHC4O+JEt4jGph/OozhFrcl5G6g==} + + '@plait/text-plugins@0.92.3': + resolution: {integrity: sha512-Zci+vj3wA+yjjil+7BnWOPdxEB8gvjy3iyZDXoZDd3tATuRSZgK5dtBSNd4OIl/g7dq2Y8aFhoeCGDSYplzOdQ==} + '@playwright/test@1.57.0': resolution: {integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==} engines: {node: '>=18'} @@ -3130,6 +3220,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/js-cookie@3.0.6': + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + '@types/katex@0.16.7': resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} @@ -3142,6 +3235,9 @@ packages: '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -3370,6 +3466,12 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ahooks@3.9.7: + resolution: {integrity: sha512-S0lvzhbdlhK36RFBkGv+RbOM/dbbweym+BIHM/bwwuWVSVN5TuVErHPMWo4w0t1NDYg5KPp2iEf7Y7E5LASYiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + ai@5.0.117: resolution: {integrity: sha512-uE6HNkdSwxbeHGKP/YbvapwD8fMOpj87wyfT9Z00pbzOh2fpnw5acak/4kzU00SX2vtI9K0uuy+9Tf9ytw5RwA==} engines: {node: '>=18'} @@ -3649,6 +3751,9 @@ packages: resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} engines: {node: '>= 10'} + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -3856,6 +3961,9 @@ packages: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dagre-d3-es@7.0.13: resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} @@ -3941,6 +4049,17 @@ packages: diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + + dompurify@3.1.6: + resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} + dompurify@3.3.0: resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==} @@ -4054,6 +4173,9 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + elkjs@0.9.3: + resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} peerDependencies: @@ -4391,6 +4513,9 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} + immer@11.1.3: resolution: {integrity: sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==} @@ -4414,6 +4539,10 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + deprecated: The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019. + is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -4451,6 +4580,9 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -4464,6 +4596,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} @@ -4489,6 +4625,10 @@ packages: jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-md4@0.3.2: resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} @@ -4527,6 +4667,10 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -4551,6 +4695,9 @@ packages: openai: optional: true + laser-pen@1.0.1: + resolution: {integrity: sha512-+K3CQK5ryLDDjX0pEdSIRXh89F6KSpm225DEymWMheg2/umhUO+na/4l8MGs2gee7VO2Mx3kyG288WGrofasoA==} + layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -4715,6 +4862,9 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} @@ -4772,6 +4922,9 @@ packages: mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} @@ -4814,12 +4967,18 @@ packages: mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + mermaid@10.9.3: + resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} + mermaid@11.12.1: resolution: {integrity: sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==} @@ -4831,6 +4990,9 @@ packages: meshoptimizer@0.22.0: resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==} + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -4858,63 +5020,123 @@ packages: micromark-extension-math@3.1.0: resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@2.0.1: resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@2.0.1: resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@2.0.1: resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@2.0.1: resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@2.0.1: resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@2.0.2: resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@2.0.1: resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@2.0.1: resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@2.0.1: resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@2.1.0: resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@2.0.2: resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} @@ -4943,6 +5165,9 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mobile-detect@1.4.5: + resolution: {integrity: sha512-yc0LhH6tItlvfLBugVUEtgawwFU2sIe+cSdmRJJCTMZ5GEJyLxNyC/NIOAOGk67Fa8GNpOttO3Xz/1bHpXFD/g==} + module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} @@ -4952,6 +5177,10 @@ packages: motion-utils@11.18.1: resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5029,6 +5258,9 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -5070,6 +5302,9 @@ packages: onnxruntime-web@1.14.0: resolution: {integrity: sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==} + open-color@1.9.1: + resolution: {integrity: sha512-vCseG/EQ6/RcvxhUcGJiHViOgrtz4x0XbZepXvKik66TMGkvbmjeJrKFyBEx6daG5rNyyd14zYXhz0hZVwQFOw==} + open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} @@ -5188,6 +5423,9 @@ packages: points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + points-on-curve@1.0.1: + resolution: {integrity: sha512-3nmX4/LIiyuwGLwuUrfhTlDeQFlAhi7lyK/zcRNGhalwapDWgAGR82bUpmn2mA03vII3fvNCG8jAONzKXwpxAg==} + points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} @@ -5363,6 +5601,9 @@ packages: react: '>= 16.3.0' react-dom: '>= 16.3.0' + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -5494,6 +5735,9 @@ packages: resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} engines: {node: '>=8.6.0'} + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -5538,6 +5782,10 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -5557,6 +5805,13 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -5595,6 +5850,43 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slate-dom@0.116.0: + resolution: {integrity: sha512-ZyyPdT4zY4d/P/gfqMWBaAWWqV3N2BbAiDqEfOtZwPLcy7vvC02PsVvSZLaGun7DvaM2EIqdN7tTq3REbQkYgA==} + peerDependencies: + slate: '>=0.99.0' + + slate-dom@0.124.0: + resolution: {integrity: sha512-dPabNlzo67xWRNFT5HtSc0M/F9mfiQSnjJAEx0Uzk7oC++WaRuBy897F+rNzfvM+zH9exMc3hsTMtM7jGDhIiQ==} + peerDependencies: + slate: '>=0.121.0' + + slate-history@0.115.0: + resolution: {integrity: sha512-QdUm9aVyQFz6JG4a84Z6Um+tJpZJmsh9bjXwTVTvYiN4rdKbqL6+/4HT94on1WYxe10Q4vY6mA6BCpoYxgF3tQ==} + peerDependencies: + slate: '>=0.114.3' + + slate-react@0.116.0: + resolution: {integrity: sha512-wyM41C/qnzfovqOWnjReM5aojLlGxogL/yzMg+ZaZIdEERSJTKjpgt0iIxy4pdIu5GQkF3mwFNNc1/Zy+C/Uwg==} + peerDependencies: + react: '>=18.2.0' + react-dom: '>=18.2.0' + slate: '>=0.114.0' + slate-dom: '>=0.116.0' + + slate-react@0.124.0: + resolution: {integrity: sha512-NLN6ME64ChOgJtiVTKwISS1sI/Y8/qN1cwmDTZM9AQJCl+jR3XNCvDsKNrW0kJU+1G3NgIGaYoVWhgIVEIL+Aw==} + peerDependencies: + react: '>=18.2.0' + react-dom: '>=18.2.0' + slate: '>=0.121.0' + slate-dom: '>=0.119.1' + + slate@0.116.0: + resolution: {integrity: sha512-CpI6S0PTFDjFsYKah3geR7X5O/38tjxVlwkYGpfQ583yYkSbt/pyEldTB1CJE3MK4htfn2D/wPkwWtDV06ZqWA==} + + slate@0.124.0: + resolution: {integrity: sha512-yhtJ0MSV+Z63UTaZtGZDp1goO9XZb5VGER9bmwX+38yJUb7nijPkYEcxD5mpezsSLqL6NedUb4wyvoZa+HDWuQ==} + sonner@1.7.4: resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: @@ -5703,6 +5995,9 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} @@ -5750,6 +6045,12 @@ packages: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} + tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -5872,6 +6173,9 @@ packages: unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -5948,6 +6252,15 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -6056,6 +6369,9 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + webgl-constants@1.1.1: resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} @@ -6938,6 +7254,8 @@ snapshots: '@biomejs/cli-win32-x64@2.2.2': optional: true + '@braintree/sanitize-url@6.0.4': {} + '@braintree/sanitize-url@7.1.1': {} '@cfworker/json-schema@4.1.1': {} @@ -7042,6 +7360,19 @@ snapshots: '@dimforge/rapier3d-compat@0.12.0': {} + '@drawnix/drawnix@0.4.0-2(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) + '@plait-board/markdown-to-drawnix': 0.0.7 + '@plait-board/mermaid-to-drawnix': 0.0.7 + laser-pen: 1.0.1 + mobile-detect: 1.4.5 + open-color: 1.9.1 + transitivePeerDependencies: + - react + - react-dom + - supports-color + '@drizzle-team/brocli@0.10.2': {} '@emnapi/runtime@1.7.1': @@ -7311,6 +7642,14 @@ snapshots: react: 19.0.0-rc-45804af1-20241021 react-dom: 19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021) + '@floating-ui/react@0.26.28(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) + '@floating-ui/utils': 0.2.9 + react: 19.0.0-rc-45804af1-20241021 + react-dom: 19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021) + tabbable: 6.4.0 + '@floating-ui/utils@0.2.9': {} '@huggingface/jinja@0.2.2': {} @@ -7456,6 +7795,8 @@ snapshots: '@js-joda/core@5.7.0': {} + '@juggle/resize-observer@3.4.0': {} + '@langchain/core@1.1.19(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))': dependencies: '@cfworker/json-schema': 4.1.1 @@ -7628,6 +7969,76 @@ snapshots: '@panva/hkdf@1.2.1': {} + '@plait-board/markdown-to-drawnix@0.0.7': + dependencies: + remark-parse: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + '@plait-board/mermaid-to-drawnix@0.0.7': + dependencies: + mermaid: 10.9.3 + transitivePeerDependencies: + - supports-color + + '@plait-board/react-board@0.4.0-2(immer@11.1.3)(is-hotkey@0.2.0)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)': + dependencies: + '@plait/common': 0.92.3 + '@plait/core': 0.92.3(immer@11.1.3)(is-hotkey@0.2.0) + '@plait/draw': 0.92.3 + '@plait/layouts': 0.92.3 + '@plait/mind': 0.92.3 + '@plait/text-plugins': 0.92.3 + ahooks: 3.9.7(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) + classnames: 2.5.1 + transitivePeerDependencies: + - immer + - is-hotkey + - react + - react-dom + + '@plait-board/react-text@0.4.0-2(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)': + dependencies: + '@plait/common': 0.92.3 + '@plait/text-plugins': 0.92.3 + is-hotkey: 0.2.0 + slate: 0.116.0 + slate-dom: 0.116.0(slate@0.116.0) + slate-history: 0.115.0(slate@0.116.0) + slate-react: 0.116.0(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)(slate-dom@0.116.0(slate@0.116.0))(slate@0.116.0) + transitivePeerDependencies: + - react + - react-dom + + '@plait/common@0.92.3': + dependencies: + tslib: 2.8.1 + + '@plait/core@0.92.3(immer@11.1.3)(is-hotkey@0.2.0)': + dependencies: + immer: 11.1.3 + is-hotkey: 0.2.0 + points-on-curve: 1.0.1 + roughjs: 4.6.6 + tslib: 2.8.1 + + '@plait/draw@0.92.3': + dependencies: + tslib: 2.8.1 + + '@plait/layouts@0.92.3': + dependencies: + tslib: 2.8.1 + + '@plait/mind@0.92.3': + dependencies: + tslib: 2.8.1 + + '@plait/text-plugins@0.92.3': + dependencies: + tslib: 2.8.1 + '@playwright/test@1.57.0': dependencies: playwright: 1.57.0 @@ -9211,6 +9622,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/js-cookie@3.0.6': {} + '@types/katex@0.16.7': {} '@types/linkify-it@5.0.0': {} @@ -9222,6 +9635,10 @@ snapshots: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -9449,6 +9866,21 @@ snapshots: agent-base@7.1.4: {} + ahooks@3.9.7(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021): + dependencies: + '@babel/runtime': 7.28.4 + '@types/js-cookie': 3.0.6 + dayjs: 1.11.19 + intersection-observer: 0.12.2 + js-cookie: 3.0.5 + lodash: 4.18.1 + react: 19.0.0-rc-45804af1-20241021 + react-dom: 19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021) + react-fast-compare: 3.2.2 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.8.1 + ai@5.0.117(zod@3.25.76): dependencies: '@ai-sdk/gateway': 2.0.24(zod@3.25.76) @@ -9733,6 +10165,8 @@ snapshots: normalize-path: 3.0.0 readable-stream: 3.6.2 + compute-scroll-into-view@3.1.1: {} + concat-map@0.0.1: {} confbox@0.1.8: {} @@ -9957,6 +10391,11 @@ snapshots: d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 + dagre-d3-es@7.0.10: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + dagre-d3-es@7.0.13: dependencies: d3: 7.9.0 @@ -10017,6 +10456,12 @@ snapshots: diff-match-patch@1.0.5: {} + diff@5.2.2: {} + + direction@1.0.4: {} + + dompurify@3.1.6: {} + dompurify@3.3.0: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -10058,6 +10503,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + elkjs@0.9.3: {} + embla-carousel-react@8.6.0(react@19.0.0-rc-45804af1-20241021): dependencies: embla-carousel: 8.6.0 @@ -10516,6 +10963,8 @@ snapshots: immediate@3.0.6: {} + immer@10.2.0: {} + immer@11.1.3: {} import-in-the-middle@1.15.0: @@ -10538,6 +10987,8 @@ snapshots: internmap@2.0.3: {} + intersection-observer@0.12.2: {} + is-alphabetical@1.0.4: {} is-alphabetical@2.0.1: {} @@ -10568,6 +11019,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-hotkey@0.2.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -10576,6 +11029,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-plain-object@5.0.0: {} + is-promise@2.2.2: {} is-wsl@3.1.1: @@ -10597,6 +11052,8 @@ snapshots: jose@6.1.3: {} + js-cookie@3.0.5: {} + js-md4@0.3.2: {} js-tiktoken@1.0.21: @@ -10648,6 +11105,8 @@ snapshots: khroma@2.1.0: {} + kleur@4.1.5: {} + kolorist@1.8.0: {} langium@3.3.1: @@ -10670,6 +11129,8 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + laser-pen@1.0.1: {} + layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -10787,6 +11248,8 @@ snapshots: lodash.uniq@4.5.0: {} + lodash@4.18.1: {} + long@4.0.0: {} longest-streak@3.1.0: {} @@ -10843,6 +11306,23 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + decode-named-character-reference: 1.1.0 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -10997,12 +11477,41 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 mdurl@2.0.0: {} + mermaid@10.9.3: + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.19 + dompurify: 3.1.6 + elkjs: 0.9.3 + katex: 0.16.25 + khroma: 2.1.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 9.0.1 + web-worker: 1.5.0 + transitivePeerDependencies: + - supports-color + mermaid@11.12.1: dependencies: '@braintree/sanitize-url': 7.1.1 @@ -11034,6 +11543,25 @@ snapshots: meshoptimizer@0.22.0: {} + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.1.0 @@ -11121,12 +11649,25 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 @@ -11134,11 +11675,23 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-types: 2.0.2 + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -11146,6 +11699,13 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -11153,30 +11713,61 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-chunked@2.0.1: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-classify-character@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 micromark-util-types: 2.0.2 + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.1.0 @@ -11184,24 +11775,49 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 + micromark-util-encode@1.1.0: {} + micromark-util-encode@2.0.1: {} + micromark-util-html-tag-name@1.2.0: {} + micromark-util-html-tag-name@2.0.1: {} + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-normalize-identifier@2.0.1: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + micromark-util-resolve-all@2.0.1: dependencies: micromark-util-types: 2.0.2 + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-sanitize-uri@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 @@ -11209,10 +11825,36 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-util-symbol@1.1.0: {} + micromark-util-symbol@2.0.1: {} + micromark-util-types@1.1.0: {} + micromark-util-types@2.0.2: {} + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.1.0 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 @@ -11262,6 +11904,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mobile-detect@1.4.5: {} + module-details-from-path@1.0.4: {} motion-dom@11.18.1: @@ -11270,6 +11914,8 @@ snapshots: motion-utils@11.18.1: {} + mri@1.2.0: {} + ms@2.1.3: {} mssql@12.2.1(@azure/core-client@1.10.1): @@ -11333,6 +11979,8 @@ snapshots: node-gyp-build@4.8.4: optional: true + non-layered-tidy-tree-layout@2.0.2: {} + normalize-path@3.0.0: {} nypm@0.6.2: @@ -11382,6 +12030,8 @@ snapshots: onnxruntime-common: 1.14.0 platform: 1.3.6 + open-color@1.9.1: {} + open@10.2.0: dependencies: default-browser: 5.5.0 @@ -11504,6 +12154,8 @@ snapshots: points-on-curve@0.2.0: {} + points-on-curve@1.0.1: {} + points-on-path@0.2.1: dependencies: path-data-parser: 0.1.0 @@ -11783,6 +12435,8 @@ snapshots: react: 19.0.0-rc-45804af1-20241021 react-dom: 19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021) + react-fast-compare@3.2.2: {} + react-is@16.13.1: {} react-markdown@10.1.0(@types/react@18.3.18)(react@19.0.0-rc-45804af1-20241021): @@ -11984,6 +12638,8 @@ snapshots: transitivePeerDependencies: - supports-color + resize-observer-polyfill@1.5.1: {} + resolve-pkg-maps@1.0.0: {} resolve@1.22.10: @@ -12045,6 +12701,10 @@ snapshots: rw@1.3.3: {} + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -12059,6 +12719,12 @@ snapshots: scheduler@0.27.0: {} + screenfull@5.2.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + semver@7.7.3: {} server-only@0.0.1: {} @@ -12121,6 +12787,69 @@ snapshots: sisteransi@1.0.5: {} + slate-dom@0.116.0(slate@0.116.0): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + is-plain-object: 5.0.0 + lodash: 4.18.1 + scroll-into-view-if-needed: 3.1.0 + slate: 0.116.0 + tiny-invariant: 1.3.1 + + slate-dom@0.124.0(slate@0.124.0): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + is-plain-object: 5.0.0 + lodash: 4.18.1 + scroll-into-view-if-needed: 3.1.0 + slate: 0.124.0 + tiny-invariant: 1.3.1 + + slate-history@0.115.0(slate@0.116.0): + dependencies: + slate: 0.116.0 + + slate-history@0.115.0(slate@0.124.0): + dependencies: + slate: 0.124.0 + + slate-react@0.116.0(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)(slate-dom@0.116.0(slate@0.116.0))(slate@0.116.0): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + lodash: 4.18.1 + react: 19.0.0-rc-45804af1-20241021 + react-dom: 19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021) + scroll-into-view-if-needed: 3.1.0 + slate: 0.116.0 + slate-dom: 0.116.0(slate@0.116.0) + tiny-invariant: 1.3.1 + + slate-react@0.124.0(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)(slate-dom@0.124.0(slate@0.124.0))(slate@0.124.0): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + lodash: 4.18.1 + react: 19.0.0-rc-45804af1-20241021 + react-dom: 19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021) + scroll-into-view-if-needed: 3.1.0 + slate: 0.124.0 + slate-dom: 0.124.0(slate@0.124.0) + tiny-invariant: 1.3.1 + + slate@0.116.0: + dependencies: + immer: 10.2.0 + tiny-warning: 1.0.3 + + slate@0.124.0: {} + sonner@1.7.4(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021): dependencies: react: 19.0.0-rc-45804af1-20241021 @@ -12228,6 +12957,8 @@ snapshots: react: 19.0.0-rc-45804af1-20241021 use-sync-external-store: 1.4.0(react@19.0.0-rc-45804af1-20241021) + tabbable@6.4.0: {} + tailwind-merge@2.6.0: {} tailwind-merge@3.3.1: {} @@ -12284,6 +13015,10 @@ snapshots: throttleit@2.1.0: {} + tiny-invariant@1.3.1: {} + + tiny-warning@1.0.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -12435,6 +13170,10 @@ snapshots: '@types/unist': 3.0.3 unist-util-visit: 5.0.0 + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -12507,6 +13246,15 @@ snapshots: uuid@8.3.2: {} + uuid@9.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.2 + kleur: 4.1.5 + sade: 1.8.1 + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -12622,6 +13370,8 @@ snapshots: web-namespaces@2.0.1: {} + web-worker@1.5.0: {} + webgl-constants@1.1.1: {} webgl-sdf-generator@1.1.1: {} diff --git a/public/vendor/drawnix.css b/public/vendor/drawnix.css new file mode 100644 index 000000000..9ce5dab1c --- /dev/null +++ b/public/vendor/drawnix.css @@ -0,0 +1,4 @@ +/* Vendored from @plait-board/react-board/index.css and @drawnix/drawnix/index.css. Sanitized for Turbopack/static serving. */ +.plait-board-container{display:block;width:100%;height:100%;position:relative;overflow:hidden}.plait-board-container foreignObject{outline:none}.plait-board-container.firefox{-webkit-user-select:none;user-select:none}.plait-board-container .viewport-container{width:100%;height:100%;overflow:auto}.plait-board-container.disabled-scroll .viewport-container{overflow:hidden}.plait-board-container svg{transform:scale(1)}.plait-board-container .plait-text-container{position:initial!important}.plait-board-container .text foreignObject{outline:none}.plait-board-container .text .slate-editable-container{outline:none}.plait-board-container .plait-toolbar{position:absolute;display:flex;height:30px;z-index:100}.plait-board-container.element-moving .element-active-host>g:not(.active-with-moving){display:none}.plait-board-container.element-rotating .element-active-host g.resize-handle,.plait-board-container.element-rotating .element-active-host g[class^=line-auto-complete-]{display:none}.plait-board-container.pointer-selection{cursor:default}.plait-board-container.ns-resize{cursor:ns-resize}.plait-board-container.ew-resize{cursor:ew-resize}.plait-board-container.nwse-resize{cursor:nwse-resize}.plait-board-container.nesw-resize{cursor:nesw-resize}.plait-board-container.crosshair{cursor:crosshair}.plait-board-container foreignObject[class^=foreign-object-]{-webkit-user-select:none;user-select:none}.plait-board-container .board-active-svg{position:absolute;left:0;top:0;pointer-events:none}.plait-board-container.theme-colorful .board-host-svg,.plait-board-container.theme-default .board-host-svg{background-color:#fff}.plait-board-container.theme-soft .board-host-svg{background-color:#f5f5f5}.plait-board-container.theme-retro .board-host-svg{background-color:#f9f8ed}.plait-board-container.theme-dark .board-host-svg{background-color:#141414}.plait-board-container.theme-starry .board-host-svg{background-color:#0d2537} + +.drawnix .island{--padding: 0;box-sizing:border-box;background-color:var(--island-bg-color);box-shadow:var(--shadow-island);border-radius:var(--border-radius-md);padding:calc(var(--padding) * var(--space-factor));position:relative;transition:box-shadow .5s ease-in-out;border:1px solid var(--island-border-color)}.drawnix .island.zen-mode{box-shadow:none}.drawnix .stack{--gap: 0;display:grid;gap:calc(var(--space-factor) * var(--gap))}.drawnix .stack_vertical{grid-template-columns:auto;grid-auto-flow:row;grid-auto-rows:min-content}.drawnix .stack_horizontal{grid-template-rows:auto;grid-auto-flow:column;grid-auto-columns:min-content}.drawnix .tool-icon{border-radius:var(--border-radius-md);display:inline-flex;align-items:center;justify-content:center;position:relative;cursor:pointer;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none}.drawnix .tool-icon__hidden{display:none!important}.drawnix .tool-icon.fillable .tool-icon_type_radio:checked+.tool-icon__icon,.drawnix .tool-icon.fillable .tool-icon_type_checkbox:checked+.tool-icon__icon{--icon-fill-color: var(--color-on-primary-container)}.drawnix .tool-icon.fillable .tool-icon_type_radio:checked+.tool-icon__icon svg,.drawnix .tool-icon.fillable .tool-icon_type_checkbox:checked+.tool-icon__icon svg{fill:var(--icon-fill-color)}.drawnix .tool-icon .tool-icon_type_radio:checked+.tool-icon__icon,.drawnix .tool-icon .tool-icon_type_checkbox:checked+.tool-icon__icon{background:var(--color-surface-primary-container);--keybinding-color: var(--color-on-primary-container)}.drawnix .tool-icon .tool-icon_type_radio:checked+.tool-icon__icon svg,.drawnix .tool-icon .tool-icon_type_checkbox:checked+.tool-icon__icon svg{color:var(--color-on-primary-container)}.drawnix .tool-icon .tool-icon__keybinding{bottom:4px;right:4px}.drawnix .tool-icon .tool-icon__icon:hover{background-color:var(--color-surface-primary-container);color:var(--color-primary)}.drawnix .tool-icon .tool-icon__icon:active{background-color:var(--color-surface-primary-container);border:1px solid var(--button-active-border)}.drawnix .tool-icon .tool-icon__icon:active svg{color:var(--color-on-primary-container)}.drawnix .tool-icon .tool-icon__icon[aria-disabled=true]{background:initial;border:none}.drawnix .tool-icon .tool-icon__icon[aria-disabled=true] svg{color:var(--color-disabled)}.drawnix .tool-icon--plain{background-color:transparent}.drawnix .tool-icon--plain .tool-icon__icon{width:2rem;height:2rem}.drawnix .tool-icon_type_radio,.drawnix .tool-icon_type_checkbox{position:absolute;opacity:0;pointer-events:none}.drawnix .tool-icon__icon{box-sizing:border-box;width:var(--lg-button-size);height:var(--lg-button-size);color:var(--icon-fill-color);display:flex;justify-content:center;align-items:center;border-radius:var(--border-radius-md)}.drawnix .tool-icon__icon+.tool-icon__label{margin-inline-start:0}.drawnix .tool-icon__icon svg{stroke:currentColor;position:relative;width:var(--lg-icon-size);height:var(--lg-icon-size);outline:none}.drawnix .tool-icon_type_button{padding:0;border:none;margin:0;font-size:inherit;background-color:initial}.drawnix .tool-icon_type_button:focus-visible{box-shadow:0 0 0 2px var(--color-primary);outline:none}.drawnix .tool-icon_type_button.tool-icon--selected{background:var(--color-surface-primary-container)}.drawnix .tool-icon_type_button.tool-icon--selected svg{color:var(--color-on-primary-container)}.drawnix .tool-icon_type_button:active{background-color:var(--button-gray-3)}.drawnix .tool-icon_type_button:disabled{cursor:default}.drawnix .tool-icon_type_button:disabled:active,.drawnix .tool-icon_type_button:disabled:focus-visible,.drawnix .tool-icon_type_button:disabled:hover{background-color:initial;border:none;box-shadow:none}.drawnix .tool-icon_type_button:disabled svg{color:var(--color-disabled)}.drawnix .tool-icon_type_button--show{visibility:visible}.drawnix .tool-icon_type_button--hide{display:none!important}.drawnix .tool-icon__label{display:flex;align-items:center;color:var(--icon-fill-color);font-family:var(--ui-font);margin:0 .8em;text-overflow:ellipsis}.drawnix .tool-icon_size_small .tool-icon__icon{width:2rem;height:2rem;font-size:.8em}.drawnix .tool-icon_size_small .tool-icon__icon svg{width:var(--default-icon-size);height:var(--default-icon-size)}.drawnix .tool-icon__keybinding{position:absolute;bottom:2px;right:3px;font-size:.625rem;color:var(--keybinding-color);font-family:var(--ui-font);-webkit-user-select:none;user-select:none}.drawnix .menu--mobile{left:0;width:100%;row-gap:.75rem}.drawnix .menu--mobile .menu-container{padding:8px;box-sizing:border-box;box-shadow:var(--shadow-island);border-radius:var(--border-radius-lg);position:relative;transition:box-shadow .5s ease-in-out}.drawnix .menu--mobile .menu-container.zen-mode{box-shadow:none}.drawnix .menu .menu-container{background-color:var(--island-bg-color);max-height:calc(100vh - 150px);overflow-y:auto;--gap: 2}.drawnix .menu .menu-item-base{display:flex;padding:0 .625rem;column-gap:.625rem;font-size:.875rem;color:var(--color-gray-90);width:100%;box-sizing:border-box;font-weight:400;font-family:inherit}.drawnix .menu .menu-item{background-color:transparent;border:1px solid transparent;align-items:center;height:2rem;margin-top:4px;cursor:pointer;border-radius:var(--border-radius-md)}@media screen and (min-width: 1921px){.drawnix .menu .menu-item{height:2.25rem}}.drawnix .menu .menu-item--active{background-color:var(--color-surface-primary-container);text-decoration:none}.drawnix .menu .menu-item__text{display:flex;align-items:center;width:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;gap:.75rem}.drawnix .menu .menu-item__shortcut{margin-inline-start:auto;opacity:.5}.drawnix .menu .menu-item__shortcut--orphaned{text-align:right;font-size:.875rem;padding:0 .625rem}.drawnix .menu .menu-item:hover{background-color:var(--color-surface-primary-container);text-decoration:none}.drawnix .menu .menu-item:active{background-color:var(--color-surface-primary-container);border-color:var(--color-brand-active)}.drawnix .menu .menu-item svg{width:1rem;height:1rem;display:block}.drawnix .menu .menu-item-bare{align-items:center;height:2rem;justify-content:space-between}@media screen and (min-width: 1921px){.drawnix .menu .menu-item-bare{height:2.25rem}}.drawnix .menu .menu-item-bare svg{width:1rem;height:1rem;display:block}.drawnix .menu .menu-item-custom{margin-top:.5rem}.drawnix .menu .menu-group-title{font-size:14px;text-align:left;margin:10px 0;font-weight:500}.drawnix .menu-button{display:flex;justify-content:center;align-items:center;padding:.625rem;width:var(--button-width, var(--default-button-size));height:var(--button-height, var(--default-button-size));box-sizing:border-box;border:none;border-style:none;border-color:var(--button-border, var(--default-border-color));border-radius:var(--border-radius-lg);cursor:pointer;background-color:var(--button-bg, var(--island-bg-color));color:var(--icon-fill-color);font-family:var(--ui-font);width:var(--lg-button-size);height:var(--lg-button-size)}.drawnix .menu-button svg{width:var(--button-width, var(--lg-icon-size));height:var(--button-height, var(--lg-icon-size))}.drawnix .menu-button:hover{background-color:var(--button-hover-bg, var(--island-bg-color));border-color:var(--button-hover-border, var(--button-border, var(--default-border-color)))}.drawnix .menu-button:active{background-color:var(--button-active-bg, var(--island-bg-color));border-color:var(--button-active-border, var(--color-primary-darkest))}.drawnix .menu-button.active{background-color:var(--button-selected-bg, var(--color-surface-primary-container));border-color:var(--button-selected-border, var(--color-surface-primary-container))}.drawnix .menu-button.active:hover{background-color:var(--button-selected-hover-bg, var(--color-surface-primary-container))}.drawnix .menu-button.active svg{color:var(--button-color, var(--color-on-primary-container))}.drawnix.theme--dark.drawnix .menu-button{--background: var(--color-surface-high)}.drawnix.theme--dark.drawnix .menu-button:hover{--background: #363541}.drawnix .menu-button svg{width:var(--lg-icon-size);height:var(--lg-icon-size)}.drawnix .menu-button--mobile{border:none;margin:0;padding:0;width:var(--default-button-size);height:var(--default-button-size)}.popup-toolbar .property-button{height:var(--lg-button-size);width:var(--lg-button-size)}.popup-toolbar .property-button .color-label{cursor:pointer}.popup-toolbar .property-button .fill-label{display:inline-block;width:var(--popup-label-size);height:var(--popup-label-size);border-radius:50%}.popup-toolbar .property-button .fill-label.color-white{border:1px solid var(--color-gray-30)}.popup-toolbar .property-button .stroke-label{border-radius:50%;width:calc(var(--popup-label-size) - var(--border-radius-lg));height:calc(var(--popup-label-size) - var(--border-radius-lg));border-width:var(--border-radius-sm);border-style:solid}.popup-toolbar .property-button .tool-icon__icon svg{width:var(--xlg-icon-size);height:var(--xlg-icon-size)}.stroke-setting.has-stroke-style{padding-top:8px!important}.stroke-setting .stroke-style-picker{justify-content:space-between;padding:0 8px}.source-arrow-island .property-button,.source-arrow-button{transform:rotateY(180deg)}.color-select-item{width:var(--default-button-size);height:var(--default-button-size);border-radius:50%;display:inline-flex;justify-content:center;align-items:center;border:1px solid var(--color-gray-30);cursor:pointer;padding:0}.color-select-item.active{border-color:var(--color-primary)}.color-select-item.active.no-color .selected-icon{background-color:#fff}.color-select-item .selected-icon{stroke:currentColor;outline:none;position:absolute;width:var(--default-icon-size);height:var(--default-icon-size)}.color-select-item.no-color{border:none}.color-select-item.no-color .no-color-icon{display:block;width:var(--default-button-size);height:var(--default-button-size);color:#0006}.slider-container{padding:10px 0}.slider-container.disabled{opacity:50%;cursor:not-allowed}.slider-container.disabled .slider-track,.slider-container.disabled .slider-thumb{cursor:not-allowed}.slider-container .slider-track{position:relative;height:4px;background-color:var(--color-gray-20);border-radius:2px;cursor:pointer}.slider-container .slider-range{position:absolute;height:100%;background-color:var(--color-primary);border-radius:3px}.slider-container .slider-thumb{position:absolute;width:12px;height:12px;background-color:#fff;border:2px solid var(--color-primary);border-radius:50%;top:50%;transform:translate(-50%,-50%);cursor:grab;box-shadow:0 2px 4px #0000001a}.plait-board-container.pointer-text .board-host-svg{cursor:default}.plait-board-container:not(.pointer-text):not(.pointer-selection):not(.pointer-hand):not(.pointer-vectorLine) .board-host-svg{cursor:crosshair}.plait-board-container.draw-line-resizing .element-active-host .selection-rectangle{display:none}.plait-board-container.line-text-resizing,.plait-board-container.line-text-resizing .slate-editable-container{cursor:move}.plait-board-container g[plait-mind=true] .slate-editable-container,.plait-board-container g[plait-mind-temporary=true] .slate-editable-container{min-width:5px}.plait-board-container g[plait-mind=true] .collapse-button,.plait-board-container g[plait-mind=true] .add-button,.plait-board-container g[plait-mind-temporary=true] .collapse-button,.plait-board-container g[plait-mind-temporary=true] .add-button{transform-origin:center center;transform-box:fill-box;cursor:pointer}.plait-board-container g[plait-mind=true] .collapse-button.animated,.plait-board-container g[plait-mind=true] .add-button.animated,.plait-board-container g[plait-mind-temporary=true] .collapse-button.animated,.plait-board-container g[plait-mind-temporary=true] .add-button.animated{animation:scale-in .15s ease-out forwards}.plait-board-container g[plait-mind=true] .expanded-button,.plait-board-container g[plait-mind-temporary=true] .expanded-button{cursor:pointer}@keyframes scale-in{0%{transform:scale(0)}to{transform:scale(1)}}.plait-board-container g[plait-mind=true] .dragging-node,.plait-board-container g[plait-mind-temporary=true] .dragging-node{opacity:.6}.plait-board-container.pointer-hand .board-host-svg{cursor:grab}.plait-board-container.pointer-mind .board-host-svg{cursor:default!important}.plait-board-container.readonly .mind-node-image{cursor:zoom-in}.plait-board-container.viewport-moving svg{cursor:grabbing}.plait-board-container.abstract-resizing-horizontal{cursor:ns-resize}.plait-board-container.abstract-resizing-vertical{cursor:ew-resize}.plait-board-container .node-emojis-container{display:flex;position:initial;align-items:center;height:100%}.plait-board-container .fake-node.dragging{cursor:pointer;opacity:.6}.plait-board-container .root .plait-text-container{font-size:18px;min-height:25px;line-height:25px}.plait-board-container .mind-node-image{display:block}.plait-board-container.theme-default .plait-text-container,.plait-board-container.theme-soft .plait-text-container{color:#333}.plait-board-container.theme-colorful .root .plait-text-container,.plait-board-container.theme-retro .root .plait-text-container,.plait-board-container.theme-dark .plait-text-container,.plait-board-container.theme-starry .plait-text-container{color:#fff}.plait-board-container.theme-dark .root .plait-text-container,.plait-board-container.theme-starry .root .plait-text-container{color:#333}.drawnix{--focus-highlight-color: #a5d8ff;--icon-fill-color: var(--color-on-surface);--island-bg-color: #ffffff;--island-border-color: #eeeeee;--keybinding-color: var(--color-gray-40);--shadow-island: 0 0 16px #00000014;--dialog-border-color: var(--color-gray-20);--link-color: var(--color-primary);--default-button-size: 2rem;--default-icon-size: 1rem;--lg-button-size: 2.25rem;--lg-icon-size: 1.125rem;--xlg-icon-size: 1.25rem;--popup-label-size: 1.25rem;--editor-container-padding: 1rem;--space-factor: .25rem;--text-primary-color: var(--color-on-surface);--color-icon-white: #ffffff;--color-primary: #6698ff;--color-primary-darker: #4a7ee6;--color-primary-darkest: #3366cc;--color-primary-light: #e6f0ff;--color-primary-light-darker: #cce0ff;--color-primary-hover: #80acff;--button-hover-bg: var(--color-surface-high);--button-active-bg: var(--color-surface-high);--button-active-border: var(--color-brand-active);--color-gray-10: #f5f5f5;--color-gray-20: #ebebeb;--color-gray-30: #d6d6d6;--color-gray-40: #b8b8b8;--color-gray-50: #999999;--color-gray-60: #7a7a7a;--color-gray-70: #5c5c5c;--color-gray-80: #3d3d3d;--color-gray-85: #242424;--color-gray-90: #1e1e1e;--color-gray-100: #121212;--color-disabled: var(--color-gray-40);--color-promo: var(--color-primary);--color-success: #268029;--color-success-lighter: #cafccc;--border-radius-sm: .25rem;--border-radius-md: .375rem;--border-radius-lg: .5rem;--color-surface-high: hsl(220, 100%, 97%);--color-surface-mid: hsl(220 25% 96%);--color-surface-low: hsl(220 25% 94%);--color-surface-lowest: #ffffff;--color-on-surface: #666666;--color-brand-hover: #6698ff;--color-on-primary-container: #6698ff;--color-surface-primary-container: rgba(102, 152, 255, .1);--color-brand-active: #6698ff;--color-border-outline: #767680;--color-border-outline-variant: #c5c5d0;--default-border-color: var(--color-surface-high)}@media screen and (min-device-width: 1921px){.drawnix{--lg-button-size: 2.5rem;--lg-icon-size: 1.25rem;--default-button-size: 2.25rem;--default-icon-size: 1.25rem}}.drawnix{height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Noto Sans,Noto Sans CJK SC,Microsoft Yahei,Hiragino Sans GB,Arial,sans-serif}.drawnix .pencil-mode-toolbar{position:absolute;top:82px;left:0}.drawnix .pencil-mode-toolbar .tool-icon__icon{width:auto;padding:0 8px;background-color:var(--color-surface-mid)}.drawnix .draw-toolbar{cursor:default;position:absolute;top:36px;left:50%;transform:translate(-50%)}.drawnix--mobile.drawnix .draw-toolbar{top:20px}.drawnix .zoom-toolbar{cursor:default;position:absolute;top:36px;right:36px}.drawnix--mobile.drawnix .zoom-toolbar{display:none}.drawnix .zoom-toolbar .zoom-out-button{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.drawnix .zoom-toolbar .zoom-menu-trigger{width:56px;display:flex;align-items:center;justify-content:center;color:var(--color-on-surface);border-radius:var(--border-radius-sm);cursor:pointer}.drawnix .zoom-toolbar .zoom-menu-trigger:hover,.drawnix .zoom-toolbar .zoom-menu-trigger.active{--background: var(--color-surface-primary-container);background-color:var(--background)}.drawnix .zoom-toolbar .zoom-in-button{color:var(--color-on-surface);border-top-left-radius:0!important;border-bottom-left-radius:0!important}.drawnix .app-toolbar{position:absolute;top:36px;left:36px}.drawnix--mobile.drawnix .app-toolbar{bottom:20px;top:auto;width:86%;left:50%;transform:translate(-50%)}.drawnix--mobile.drawnix .app-toolbar .stack{display:flex;align-items:center;justify-content:space-between}.drawnix .theme-toolbar{position:absolute;bottom:36px;right:36px}.drawnix--mobile.drawnix .theme-toolbar{display:none}.drawnix .theme-toolbar select{width:100px;background-color:var(--color-surface-secondary-container);color:var(--color-on-surface);border-radius:var(--border-radius-sm);padding:4px 8px;cursor:pointer;border:none;outline:none;font-size:14px}.drawnix .theme-toolbar select:hover{background-color:var(--color-surface-primary-container)}.drawnix .drawnix-link,.drawnix a{text-decoration:none;color:var(--link-color);-webkit-user-select:none;user-select:none;cursor:pointer}.drawnix .drawnix-link:hover,.drawnix a:hover{text-decoration:underline}.drawnix .drawnix-link:active,.drawnix a:active{text-decoration:none}.drawnix .a{font-weight:500;text-decoration:none;color:var(--link-color);-webkit-user-select:none;user-select:none;cursor:pointer}.drawnix textarea{outline:none}.drawnix textarea:hover,.drawnix textarea:focus{border:1px solid var(--color-primary)}.drawnix .drawnix-button{display:flex;justify-content:center;align-items:center;padding:.625rem;width:var(--button-width, var(--default-button-size));height:var(--button-height, var(--default-button-size));box-sizing:border-box;border:none;border-style:none;border-color:var(--button-border, var(--default-border-color));border-radius:var(--border-radius-lg);cursor:pointer;background-color:var(--button-bg, var(--island-bg-color));color:var(--icon-fill-color);font-family:var(--ui-font)}.drawnix .drawnix-button svg{width:var(--button-width, var(--lg-icon-size));height:var(--button-height, var(--lg-icon-size))}.drawnix .drawnix-button:hover{background-color:var(--button-hover-bg, var(--island-bg-color));border-color:var(--button-hover-border, var(--button-border, var(--default-border-color)))}.drawnix .drawnix-button:active{background-color:var(--button-active-bg, var(--island-bg-color));border-color:var(--button-active-border, var(--color-primary-darkest))}.drawnix .drawnix-button.active{background-color:var(--button-selected-bg, var(--color-surface-primary-container));border-color:var(--button-selected-border, var(--color-surface-primary-container))}.drawnix .drawnix-button.active:hover{background-color:var(--button-selected-hover-bg, var(--color-surface-primary-container))}.drawnix .drawnix-button.active svg{color:var(--button-color, var(--color-on-primary-container))}.drawnix [plait-mindmap=true] img.image-origin--focus:hover{cursor:zoom-in}.drawnix .laser-pointer{background:transparent;position:fixed;left:0;top:0;z-index:2022;width:100vw;height:100vh}.drawnix .laser-pointer.mouse-course-hidden{pointer-events:none}.plait-board-container.pointer-eraser .board-host-svg{cursor:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTAiIGN5PSIxMCIgcj0iNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8L3N2Zz4=) 10 10,crosshair!important}.plait-board-container .slate-editable-container{cursor:inherit!important}.Dialog-overlay{background:#12121233;display:grid;place-items:center}.Dialog{margin:15px;background-color:#fff;padding:15px;border-radius:4px}.drawnix .dialog-mermaid-title{margin-block:.25rem;font-size:1.25rem;font-weight:700;padding-inline:2.5rem}.drawnix .Dialog.ttd-dialog{padding:1.25rem;display:flex;flex-direction:column;width:100%;max-width:1024px;height:100%;max-height:540px}.drawnix .Dialog.ttd-dialog.Dialog--fullscreen{margin-top:0}.drawnix .Dialog.ttd-dialog .Island{padding-inline:0!important;height:100%;display:flex;flex-direction:column;flex:1 1 auto;box-shadow:none}.drawnix .Dialog.ttd-dialog .Modal__content{height:auto;max-height:100%}@media screen and (min-width: 861px){.drawnix .Dialog.ttd-dialog .Modal__content{max-height:750px;height:100%}}.drawnix .Dialog.ttd-dialog .Dialog__content{flex:1 1 auto}.drawnix .ttd-dialog-desc{font-size:15px;font-style:italic;font-weight:500;margin-bottom:1.5rem}.drawnix .ttd-dialog-tabs-root{width:100%;height:100%;display:flex;flex-direction:column}.drawnix .ttd-dialog-tab-trigger{color:var(--color-on-surface);font-size:.875rem;margin:0;padding:0 1rem;background-color:transparent;border:0;height:2.875rem;font-weight:600;font-family:inherit;letter-spacing:.4px}.drawnix .ttd-dialog-tab-trigger[data-state=active]{border-bottom:2px solid var(--color-primary)}.drawnix .ttd-dialog-triggers{border-bottom:1px solid var(--color-surface-high);margin-bottom:1.5rem;padding-inline:2.5rem}.drawnix .ttd-dialog-content{padding-inline:2.5rem;height:100%;display:flex;flex-direction:column}.drawnix .ttd-dialog-content[hidden]{display:none}.drawnix .ttd-dialog-input{width:auto;height:10rem;resize:none;border-radius:var(--border-radius-lg);border:1px solid var(--dialog-border-color);white-space:pre-wrap;padding:.85rem;box-sizing:border-box;font-family:monospace}@media screen and (min-width: 861px){.drawnix .ttd-dialog-input{width:100%;height:100%}}.drawnix .ttd-dialog-output-wrapper{display:flex;align-items:center;justify-content:center;padding:.85rem;box-sizing:border-box;flex-grow:1;position:relative;border-radius:var(--border-radius-lg);border:1px solid var(--dialog-border-color);height:400px;width:auto}@media screen and (min-width: 861px){.drawnix .ttd-dialog-output-wrapper{width:100%;height:200px}}.drawnix .ttd-dialog-output-wrapper canvas{max-width:100%;max-height:100%}.drawnix .ttd-dialog-output-canvas-container{display:flex;width:100%;height:100%;align-items:center;justify-content:center;flex-grow:1;overflow:hidden}.drawnix .ttd-dialog-output-error{color:red;font-weight:700;font-size:30px;word-break:break-word;overflow:auto;max-height:100%;height:100%;width:100%;text-align:center;position:absolute;z-index:10}.drawnix .ttd-dialog-output-error p{font-weight:500;font-family:Cascadia;text-align:left;white-space:pre-wrap;font-size:.875rem;padding:0 10px}.drawnix .ttd-dialog-panels{height:100%}@media screen and (min-width: 861px){.drawnix .ttd-dialog-panels{display:grid;grid-template-columns:1fr 1fr;gap:4rem}}.drawnix .ttd-dialog-panel{display:flex;flex-direction:column;width:100%}.drawnix .ttd-dialog-panel__header{display:flex;margin:0 4px 4px;align-items:center;gap:1rem}.drawnix .ttd-dialog-panel__header label{font-size:14px;font-style:normal;font-weight:600}.drawnix .ttd-dialog-panel:first-child .ttd-dialog-panel-button-container:not(.invisible){margin-bottom:4rem}@media screen and (min-width: 861px){.drawnix .ttd-dialog-panel .ttd-dialog-panel-button-container:not(.invisible){margin-bottom:.5rem!important}}.drawnix .ttd-dialog-panel textarea{height:100%;resize:none;border-radius:var(--border-radius-lg);border:1px solid var(--dialog-border-color);white-space:pre-wrap;padding:.85rem;box-sizing:border-box;width:100%;font-family:monospace}@media screen and (max-width: 861px){.drawnix .ttd-dialog-panel textarea{width:auto;height:10rem}}.drawnix .ttd-dialog-panel-button-container{margin-top:1rem;margin-bottom:.5rem}.drawnix .ttd-dialog-panel-button-container.invisible .ttd-dialog-panel-button{display:none}@media screen and (min-width: 861px){.drawnix .ttd-dialog-panel-button-container.invisible .ttd-dialog-panel-button{display:block;visibility:hidden}}.drawnix .ttd-dialog-panel-button{position:relative}.drawnix .ttd-dialog-panel-button.drawnix-button{font-family:inherit;font-weight:600;height:2.5rem;font-size:12px;color:#fff;background-color:var(--color-primary);width:100%}.drawnix .ttd-dialog-panel-button.drawnix-button:hover{background-color:var(--color-primary-darker)}.drawnix .ttd-dialog-panel-button.drawnix-button:active{background-color:var(--color-primary-darkest)}.drawnix .ttd-dialog-panel-button.drawnix-button:disabled{opacity:.5;cursor:not-allowed}.drawnix .ttd-dialog-panel-button.drawnix-button:disabled:hover{background-color:var(--color-primary)}@media screen and (min-width: 861px){.drawnix .ttd-dialog-panel-button.drawnix-button{width:auto;min-width:7.5rem}}.drawnix.theme--dark.drawnix .ttd-dialog-panel-button.drawnix-button{color:var(--color-gray-100)}.drawnix .ttd-dialog-panel-button div{display:contents}.drawnix .ttd-dialog-panel-button div.invisible{visibility:hidden}.drawnix .ttd-dialog-panel-button div.Spinner{display:flex!important;position:absolute;top:0;right:0;bottom:0;left:0;--spinner-color: white}.drawnix.theme--dark.drawnix .ttd-dialog-panel-button div.Spinner{--spinner-color: var(--color-gray-100)}.drawnix .ttd-dialog-panel-button div span{padding-left:.5rem;display:flex}.drawnix .ttd-dialog-submit-shortcut{margin-inline-start:.5rem;font-size:.625rem;opacity:.6;display:flex;gap:.125rem}.drawnix .ttd-dialog-submit-shortcut__key{border:1px solid gray;padding:2px 3px;border-radius:4px}.clean-confirm{background:#fff;border-radius:8px;padding:20px;width:300px}.clean-confirm__title{font-size:18px;font-weight:500;margin:0 0 8px}.clean-confirm__description{color:#666;font-size:14px;margin:0 0 20px}.clean-confirm__actions{display:flex;justify-content:flex-end;gap:8px}.clean-confirm__button{padding:8px 16px;border-radius:6px;font-size:14px;cursor:pointer;border:none}.clean-confirm__button--cancel{background:#f5f5f5;color:#000}.clean-confirm__button--cancel:hover{background:#e8e8e8}.clean-confirm__button--ok{background:#fff;color:#ff4d4f;border:1px solid #ff4d4f}.clean-confirm__button--ok:hover{color:#fff;background:#ff4d4f}.drawnix .link-popup{padding-left:8px}.drawnix .link-popup__link{font-size:14px}.drawnix .link-popup .link-popup__link{display:inline-block;width:18rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.drawnix .link-popup__input{padding:10px 0;width:328px;border:none;border-radius:4px;font-size:14px;outline:none}.drawnix-tutorial{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Noto Sans,Noto Sans CJK SC,Microsoft Yahei,Hiragino Sans GB,Arial,sans-serif;position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;background-color:transparent}.drawnix-tutorial p{margin:0;font-size:14px;color:#888;line-height:1.5}.drawnix-tutorial .tutorial-overlay{position:absolute;width:100%;height:100%;pointer-events:none;display:flex;justify-content:center;align-items:center}.drawnix-tutorial .tutorial-content{position:relative;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center}.drawnix-tutorial .brand-title{font-size:72px;font-weight:400;color:#333;letter-spacing:2px;margin:0 0 25px}.drawnix-tutorial .brand-description{font-size:18px;color:#333;text-align:center;max-width:600px;line-height:1.6;font-style:italic;margin-bottom:25px}.drawnix-tutorial .brand-tooltip{color:#888;text-align:center;max-width:600px;line-height:1.6;margin-bottom:40px}.drawnix-tutorial .feature-pointer{position:absolute}.drawnix-tutorial .top-left{position:absolute;top:100px;left:60px}.drawnix-tutorial .top-left .pointer-content{position:absolute;top:100px;width:100%;text-align:center;left:20px}.drawnix-tutorial .top-center{top:100px;left:50%;width:200px;transform:translate(-50%)}.drawnix-tutorial .top-center .pointer-content{position:absolute;width:100%;top:50px;left:60px}.drawnix-tutorial .bottom-right{bottom:70px;right:40px}.drawnix-tutorial .bottom-right .pointer-content{position:absolute;top:-30px;right:80px;width:100%}@media screen and (max-width: 768px){.drawnix-tutorial .tutorial-content{width:95%;height:95%}.drawnix-tutorial .feature-pointer{display:none}}