feat(desktop): 深色 AI 控制台视觉改造 + 工作台仪表盘

桌面端从扁平 dev 工具风改为深色高端 AI 控制台:分层表面 + 紫青强调 + 微光 +
首页仪表盘,提升第一印象与吸引力。

- 设计 tokens: tailwind ink 分层调色板 + glow/card 阴影; index.css 深色基底 +
  品牌渐变 + 深色滚动条
- shell: TopBar(品牌渐变+毛玻璃+发光健康灯) / LeftNav(激活态紫色高亮+左光条) /
  BottomDrawer(深色+状态色)
- 新 views/Home 工作台仪表盘: 渐变 hero + 4 状态卡 + 3 能力卡 + 快速开始(默认首页)
- 画布: TypedNode 深色节点卡; StudioView ReactFlow colorMode=dark + 深色工具栏/面板/
  MiniMap; Inspector 深色表单
- KbView/MemoryView/MemoryPanel/Placeholder 全深色化; 进度条改紫青渐变
- 纯前端改造, npm build✓; 浏览器验证: 仪表盘 + 编排画布深色呈现

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-06-11 16:56:04 +08:00
parent d623b8590e
commit 2291f60380
18 changed files with 327 additions and 207 deletions
+12 -4
View File
@@ -6,6 +6,7 @@ import { BottomDrawer } from "./shell/BottomDrawer";
import { StudioView } from "./studio/StudioView";
import { MemoryView } from "./views/MemoryView";
import { KbView } from "./views/KbView";
import { Home } from "./views/Home";
import { Placeholder } from "./views/Placeholder";
import { submitTask, streamTokens, type Identity } from "./lib/api";
import type { TaskDsl } from "./lib/dsl";
@@ -21,7 +22,7 @@ const PLACEHOLDERS: Partial<Record<ViewKey, { title: string; desc: string }>> =
};
export default function App() {
const [view, setView] = useState<ViewKey>("studio");
const [view, setView] = useState<ViewKey>("home");
const [identity, setIdentity] = useState<Identity>({ userId: "wt", sessionId: "sess-ui" });
const [run, setRun] = useState<RunState>(emptyRun);
const closeRef = useRef<(() => void) | null>(null);
@@ -64,12 +65,19 @@ export default function App() {
);
return (
<div className="flex h-screen w-screen flex-col text-gray-900">
<div className="relative flex h-screen w-screen flex-col bg-ink-950 text-slate-200">
{/* 顶部柔光,增加纵深 */}
<div
className="pointer-events-none absolute inset-x-0 top-0 h-64 opacity-60"
style={{ background: "radial-gradient(60% 100% at 50% 0%, rgba(124,92,246,0.10), transparent 70%)" }}
/>
<TopBar identity={identity} setIdentity={setIdentity} />
<div className="flex min-h-0 flex-1">
<div className="relative flex min-h-0 flex-1">
<LeftNav active={view} onSelect={setView} />
<main className="min-w-0 flex-1 overflow-hidden">
{view === "studio" ? (
{view === "home" ? (
<Home onSelect={setView} />
) : view === "studio" ? (
<StudioView onRun={onRun} phase={run.phase} />
) : view === "kb" ? (
<KbView />