正在打开图谱…
}diff --git a/package.json b/package.json index d61efcc..9f7f7ef 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "typecheck": "tsc --noEmit", "test:headless": "node --test tests/headless/*.test.mjs", "test:headless:browser": "node tests/headless/browser-storage.mjs", - "test:headless:proxy": "node tests/headless/proxy.integration.mjs" + "test:headless:proxy": "node tests/headless/proxy.integration.mjs", + "test:headless:renderer": "node tests/headless/renderer.integration.mjs" }, "dependencies": { "@radix-ui/react-dialog": "1.3.1", diff --git a/src/app/dashboard/dashboard.tsx b/src/app/dashboard/dashboard.tsx index c053436..f3654e1 100644 --- a/src/app/dashboard/dashboard.tsx +++ b/src/app/dashboard/dashboard.tsx @@ -12,6 +12,7 @@ import { useActiveBoard } from "@/components/workspace/active-board"; import toolbar from "@/components/ui/toolbar.module.css"; import { EditableTitle } from "@/components/workspace/editable-title"; import { UserAvatar } from "@/components/workspace/user-avatar"; +import { useCanvasRuntimeHost } from "@/components/workspace/canvas-runtime-host"; import { AccountPanel } from "@/components/workspace/account-panel"; import { readDemoBoards } from "@/lib/demo-workspace"; import { loadBoardDirectory } from "@/lib/board-directory"; @@ -20,6 +21,7 @@ import styles from "@/components/workspace/workspace.module.css"; export default function DashboardSidebar() { const router = useRouter(); + const runtimeHost = useCanvasRuntimeHost(); const { board: activeBoard, setBoard: setActiveBoard } = useActiveBoard(); const reduceMotion = useReducedMotion(); const params = useParams<{ workspace?: string; board?: string }>(); @@ -140,7 +142,7 @@ export default function DashboardSidebar() { async function logout() { try { - if (!demo) await api("auth/logout", { method: "POST" }); + if (!demo) { await runtimeHost.retireIdentity(); await api("auth/logout", { method: "POST" }); } router.push("/login"); } catch (e) { setError(errorText(e)); } } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 15c13f5..1a6a8f3 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,3 +1,4 @@ +import { CanvasRuntimeHost } from "@/components/workspace/canvas-runtime-host"; import { AppFeedback } from "@/components/ui/app-feedback"; import type { Metadata } from "next"; import type { ReactNode } from "react"; @@ -19,7 +20,7 @@ export const metadata: Metadata = { export default function RootLayout({ children }: { children: ReactNode }) { return ( -
画布已关闭
; + return{blocked ? '有修改需要处理' : pending.length ? '正在同步…' : '已同步'}{blocked && }
正在准备画布…
; +} diff --git a/src/components/canvas/transformable-node.tsx b/src/components/canvas/transformable-node.tsx index c4b4913..d3e6c8d 100644 --- a/src/components/canvas/transformable-node.tsx +++ b/src/components/canvas/transformable-node.tsx @@ -6,12 +6,15 @@ import { Grip, Maximize2, RotateCw } from "lucide-react"; import { elementCapabilities, type TextStyle } from "@/lib/canvas-elements"; import type { CanvasNode, NodeDirection } from "@/lib/canvas"; import { resizeFromPointer, rotationFromPointer, type NodeTransform, type ResizeDirection } from "@/lib/canvas-geometry"; +import type { EditingLease } from "./editing-lease"; import { NodeStyleToolbar } from "./node-style-toolbar"; import { MembershipBadge } from "./frame-feedback"; import { ContentHandles } from "./content-handles"; import styles from "./canvas.module.css"; -export const NodeEditing = createContext({ +const defaultEditing = { + beginTransform: undefined as undefined | ((id: string) => boolean | void | EditingLease正在准备画布…
}); -type Loaded = { board: Board; snapshot?: CanvasSnapshot; route: string }; +const HeadlessGraphCanvas = dynamic(() => import("@/components/canvas/headless-graph-canvas"), { ssr: false, loading: () =>正在准备画布…
}); +type Loaded = { board: Board; snapshot?: CanvasSnapshot; route: string; engine?: ProjectEngine }; export default function GraphPage({ workspaceId, boardId }: { workspaceId: string; boardId: string }) { const demo = useSearchParams().get("demo") === "1"; const router = useRouter(); + const runtimeHost = useCanvasRuntimeHost(); const route = workspaceId + ":" + boardId; const { board: activeBoard, setBoard: setActiveBoard } = useActiveBoard(); const [loaded, setLoaded] = useState正在打开图谱…
}