From 7dd2a5881b7ac3594336223c6f84ec6c272a4e86 Mon Sep 17 00:00:00 2001
From: ddCat <2695092045@qq.com>
Date: Fri, 31 Jul 2026 17:16:26 +0800
Subject: [PATCH] =?UTF-8?q?feat(*):=20=E7=A9=BA=E9=97=B4=E7=95=8C=E9=9D=A2?=
=?UTF-8?q?=20-=20=E7=BB=9F=E4=B8=80=E5=B7=A5=E4=BD=9C=E5=8F=B0=E6=B5=AE?=
=?UTF-8?q?=E5=B1=82=E5=B9=B6=E6=94=B6=E6=95=9B=E7=94=BB=E5=B8=83=E6=A8=A1?=
=?UTF-8?q?=E5=9E=8B=E9=80=89=E6=8B=A9=E7=84=A6=E7=82=B9=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web/src/layouts/user-layout.tsx | 9 +-
web/src/styles/globals.css | 155 +++++++++++++++++++++++++++++---
2 files changed, 153 insertions(+), 11 deletions(-)
diff --git a/web/src/layouts/user-layout.tsx b/web/src/layouts/user-layout.tsx
index 83fcb4c11..c532ee46e 100644
--- a/web/src/layouts/user-layout.tsx
+++ b/web/src/layouts/user-layout.tsx
@@ -1,4 +1,4 @@
-import type { ReactNode } from "react";
+import { useLayoutEffect, type ReactNode } from "react";
import { useLocation } from "react-router";
import { CanvasDeleteProjectsDialog } from "@/components/canvas/canvas-delete-projects-dialog";
@@ -9,6 +9,13 @@ import { isSpatialWorkbenchPath } from "@/lib/workspace-routes";
export default function UserLayout({ children }: { children: ReactNode }) {
const { pathname } = useLocation();
const spatialWorkbench = isSpatialWorkbenchPath(pathname);
+
+ useLayoutEffect(() => {
+ // Ant Design 浮层挂载在 body,必须用路由级标记隔离用户工作台与画布编辑器、运营后台。
+ document.body.classList.toggle("app-spatial-overlays", spatialWorkbench);
+ return () => document.body.classList.remove("app-spatial-overlays");
+ }, [spatialWorkbench]);
+
return (
{children}
diff --git a/web/src/styles/globals.css b/web/src/styles/globals.css
index 70a70fea3..4ccabc1d3 100644
--- a/web/src/styles/globals.css
+++ b/web/src/styles/globals.css
@@ -186,7 +186,7 @@
--workspace-border-strong: rgba(17, 17, 17, 0.2);
--workspace-grid-line: rgba(17, 17, 17, 0.035);
--workspace-nav: rgba(250, 250, 250, 0.86);
- --workspace-sidebar: rgba(250, 250, 250, 0.88);
+ --workspace-sidebar: rgba(250, 250, 250, 0.72);
--workspace-accent: #171717;
--workspace-accent-soft: rgba(17, 17, 17, 0.065);
background-color: var(--workspace-canvas);
@@ -204,7 +204,7 @@
--workspace-border-strong: rgba(255, 255, 255, 0.18);
--workspace-grid-line: rgba(255, 255, 255, 0.026);
--workspace-nav: rgba(10, 10, 10, 0.88);
- --workspace-sidebar: rgba(14, 14, 14, 0.9);
+ --workspace-sidebar: rgba(12, 12, 13, 0.72);
--workspace-accent: #f5f5f5;
--workspace-accent-soft: rgba(255, 255, 255, 0.08);
}
@@ -225,19 +225,153 @@
}
.app-workspace-shell.is-spatial .app-workspace-sidebar {
- border: 1px solid var(--workspace-border);
+ border: 1px solid color-mix(in srgb, var(--foreground) 16%, transparent);
border-radius: 8px;
- background: var(--workspace-sidebar);
+ background:
+ linear-gradient(145deg, color-mix(in srgb, white 10%, transparent), transparent 24%, transparent 76%, color-mix(in srgb, var(--foreground) 3%, transparent)),
+ var(--workspace-sidebar);
box-shadow:
0 26px 70px rgba(0, 0, 0, 0.12),
- inset 0 1px 0 color-mix(in srgb, white 12%, transparent);
- backdrop-filter: blur(24px) saturate(125%);
+ inset 0 1px 0 color-mix(in srgb, white 24%, transparent),
+ inset 1px 0 0 color-mix(in srgb, white 7%, transparent);
+ backdrop-filter: blur(28px) saturate(132%);
+ -webkit-backdrop-filter: blur(28px) saturate(132%);
}
.dark .app-workspace-shell.is-spatial .app-workspace-sidebar {
box-shadow:
0 28px 80px rgba(0, 0, 0, 0.46),
- inset 0 1px 0 rgba(255, 255, 255, 0.08);
+ inset 0 1px 0 rgba(255, 255, 255, 0.18),
+ inset 1px 0 0 rgba(255, 255, 255, 0.055);
+ }
+
+ body.app-spatial-overlays {
+ --workspace-overlay-bg: rgba(244, 244, 245, 0.78);
+ --workspace-overlay-bg-strong: rgba(250, 250, 250, 0.88);
+ --workspace-overlay-border: rgba(17, 17, 17, 0.22);
+ --workspace-overlay-divider: rgba(17, 17, 17, 0.1);
+ --workspace-overlay-highlight: rgba(255, 255, 255, 0.86);
+ --workspace-overlay-hover: rgba(17, 17, 17, 0.065);
+ --workspace-overlay-selected: rgba(17, 17, 17, 0.1);
+ --workspace-overlay-shadow: 0 26px 72px rgba(15, 23, 42, 0.18), 0 4px 18px rgba(15, 23, 42, 0.08);
+ }
+
+ .dark body.app-spatial-overlays {
+ --workspace-overlay-bg: rgba(10, 10, 11, 0.78);
+ --workspace-overlay-bg-strong: rgba(15, 15, 16, 0.88);
+ --workspace-overlay-border: rgba(255, 255, 255, 0.22);
+ --workspace-overlay-divider: rgba(255, 255, 255, 0.105);
+ --workspace-overlay-highlight: rgba(255, 255, 255, 0.2);
+ --workspace-overlay-hover: rgba(255, 255, 255, 0.075);
+ --workspace-overlay-selected: rgba(255, 255, 255, 0.115);
+ --workspace-overlay-shadow: 0 30px 84px rgba(0, 0, 0, 0.62), 0 8px 24px rgba(0, 0, 0, 0.34);
+ }
+
+ body.app-spatial-overlays :where(
+ .ant-dropdown-menu,
+ .ant-select-dropdown,
+ .ant-popover-inner,
+ .ant-picker-dropdown .ant-picker-panel-container,
+ .ant-cascader-menus,
+ .ant-mentions-dropdown,
+ .ant-tooltip-inner,
+ .ant-modal-content,
+ .ant-drawer-content,
+ .ant-message-notice-content,
+ .ant-notification-notice
+ ) {
+ border: 1px solid var(--workspace-overlay-border) !important;
+ background:
+ linear-gradient(145deg, var(--workspace-overlay-highlight), transparent 24%, transparent 76%, rgba(158, 178, 214, 0.055)),
+ var(--workspace-overlay-bg) !important;
+ box-shadow:
+ var(--workspace-overlay-shadow),
+ inset 0 1px 0 var(--workspace-overlay-highlight),
+ inset 1px 0 0 color-mix(in srgb, var(--workspace-overlay-highlight) 36%, transparent) !important;
+ backdrop-filter: blur(30px) saturate(138%) !important;
+ -webkit-backdrop-filter: blur(30px) saturate(138%) !important;
+ }
+
+ body.app-spatial-overlays :where(.ant-modal-content, .ant-drawer-content, .ant-notification-notice) {
+ background:
+ linear-gradient(145deg, var(--workspace-overlay-highlight), transparent 20%, transparent 82%, rgba(158, 178, 214, 0.05)),
+ var(--workspace-overlay-bg-strong) !important;
+ }
+
+ body.app-spatial-overlays :where(.ant-dropdown-menu, .ant-select-dropdown, .ant-popover-inner, .ant-cascader-menus, .ant-mentions-dropdown) {
+ border-radius: 8px !important;
+ }
+
+ body.app-spatial-overlays :where(
+ .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled),
+ .ant-dropdown-menu-submenu-title:not(.ant-dropdown-menu-item-disabled),
+ .ant-select-item-option:not(.ant-select-item-option-disabled),
+ .ant-cascader-menu-item:not(.ant-cascader-menu-item-disabled),
+ .ant-mentions-dropdown-menu-item
+ ) {
+ border-radius: 5px;
+ transition: background-color var(--motion-instant) ease-out, color var(--motion-instant) ease-out;
+ }
+
+ body.app-spatial-overlays :where(
+ .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled):hover,
+ .ant-dropdown-menu-submenu-title:not(.ant-dropdown-menu-item-disabled):hover,
+ .ant-select-item-option-active:not(.ant-select-item-option-disabled),
+ .ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),
+ .ant-mentions-dropdown-menu-item-active
+ ) {
+ background: var(--workspace-overlay-hover) !important;
+ }
+
+ body.app-spatial-overlays :where(
+ .ant-dropdown-menu-item-selected,
+ .ant-select-item-option-selected:not(.ant-select-item-option-disabled),
+ .ant-cascader-menu-item-active
+ ) {
+ background: var(--workspace-overlay-selected) !important;
+ color: var(--foreground) !important;
+ }
+
+ body.app-spatial-overlays :where(
+ .ant-dropdown-menu-item-divider,
+ .ant-popover-inner-content > .border-b,
+ .ant-popover-inner-content > .border-y,
+ .ant-modal-header,
+ .ant-modal-footer,
+ .ant-drawer-header
+ ) {
+ border-color: var(--workspace-overlay-divider) !important;
+ }
+
+ body.app-spatial-overlays :where(.ant-popover-arrow::before, .ant-tooltip-arrow::before) {
+ border: 1px solid var(--workspace-overlay-border);
+ background: var(--workspace-overlay-bg-strong) !important;
+ }
+
+ body.app-spatial-overlays :where(.ant-modal-mask, .ant-drawer-mask) {
+ background: rgba(0, 0, 0, 0.48) !important;
+ backdrop-filter: blur(7px);
+ -webkit-backdrop-filter: blur(7px);
+ }
+
+ @media (prefers-reduced-transparency: reduce) {
+ body.app-spatial-overlays :where(
+ .ant-dropdown-menu,
+ .ant-select-dropdown,
+ .ant-popover-inner,
+ .ant-picker-dropdown .ant-picker-panel-container,
+ .ant-cascader-menus,
+ .ant-mentions-dropdown,
+ .ant-tooltip-inner,
+ .ant-modal-content,
+ .ant-drawer-content,
+ .ant-message-notice-content,
+ .ant-notification-notice
+ ) {
+ background: var(--workspace-overlay-bg-strong) !important;
+ backdrop-filter: none !important;
+ -webkit-backdrop-filter: none !important;
+ }
}
.app-workspace-shell.is-spatial .app-workspace-brand-mark {
@@ -1389,14 +1523,15 @@
}
.canvas-composer-model-picker.ant-select .ant-select-content {
- background: color-mix(in srgb, var(--background) 96%, var(--foreground) 4%) !important;
- border-color: color-mix(in srgb, var(--foreground) 16%, transparent) !important;
+ background: var(--background) !important;
+ border-color: color-mix(in srgb, var(--foreground) 8%, transparent) !important;
box-shadow: none !important;
}
.canvas-composer-model-picker.ant-select-focused .ant-select-content {
- border-color: color-mix(in srgb, var(--foreground) 28%, transparent) !important;
+ border-color: color-mix(in srgb, var(--foreground) 8%, transparent) !important;
box-shadow: none !important;
+ outline: none !important;
}
.canvas-model-picker-popup .ant-select-item-option-active:not(.ant-select-item-option-disabled),