feat(web): 用户工作台 - 产品化壳层、内容库布局与积分入口

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ddCat
2026-09-16 22:59:45 +08:00
parent f52702b70f
commit 969e2831b2
46 changed files with 5355 additions and 944 deletions

View File

@@ -1,27 +1,39 @@
import { useLayoutEffect, type ReactNode } from "react";
import { useLocation } from "react-router";
import { ConfigProvider } from "antd";
import { AppWorkspaceShell } from "@/components/layout/app-top-nav";
import { cn } from "@/lib/utils";
import { isSpatialWorkbenchPath } from "@/lib/workspace-routes";
import { getWorkspaceAntThemeConfig } from "@/lib/app-theme";
import { useWorkspaceButtonFeedback } from "@/hooks/use-workspace-button-feedback";
import "@/styles/workspace-product.css";
const workspaceTheme = getWorkspaceAntThemeConfig();
export default function UserLayout({ children }: { children: ReactNode }) {
const { pathname } = useLocation();
const spatialWorkbench = isSpatialWorkbenchPath(pathname);
const productWorkspace = !/^\/canvas\/[^/]+(?:\/|$)/.test(pathname);
useWorkspaceButtonFeedback(productWorkspace);
useLayoutEffect(() => {
// Ant Design 浮层挂载在 body,必须用路由级标记隔离用户工作台与画布编辑器、运营后台。
document.body.classList.add("app-user-overlays");
document.body.classList.toggle("app-spatial-overlays", spatialWorkbench);
document.body.classList.toggle("app-product-overlays", productWorkspace);
return () => {
document.body.classList.remove("app-user-overlays");
document.body.classList.remove("app-spatial-overlays");
document.body.classList.remove("app-product-overlays");
};
}, [spatialWorkbench]);
}, [spatialWorkbench, productWorkspace]);
return (
<div className={cn("app-user-workspace h-dvh overflow-hidden text-foreground", spatialWorkbench && "app-spatial-workspace")}>
<AppWorkspaceShell>{children}</AppWorkspaceShell>
</div>
<ConfigProvider theme={productWorkspace ? workspaceTheme : undefined}>
<div className={cn("app-user-workspace h-dvh overflow-hidden text-foreground", spatialWorkbench && "app-spatial-workspace", productWorkspace && "app-product-workspace")}>
<AppWorkspaceShell>{children}</AppWorkspaceShell>
</div>
</ConfigProvider>
);
}