From 7eba6d2fb8a0fd35b829a2d62e5d9b508412cdfb Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 6 Apr 2026 18:47:07 +0800 Subject: [PATCH] feat: restructure AI-CAD workbench to match CAD tool layout --- components/ai-cad/ai-cad-workbench.tsx | 1513 ++++++++++++------------ 1 file changed, 764 insertions(+), 749 deletions(-) diff --git a/components/ai-cad/ai-cad-workbench.tsx b/components/ai-cad/ai-cad-workbench.tsx index c647e4ead..e037b44b9 100644 --- a/components/ai-cad/ai-cad-workbench.tsx +++ b/components/ai-cad/ai-cad-workbench.tsx @@ -6,11 +6,10 @@ import { Bot, Box, BrainCircuit, - ChevronLeft, CheckCircle2, ChevronDown, + ChevronLeft, ChevronRight, - ChevronUp, Copy, Download, FileCode2, @@ -30,14 +29,7 @@ import { WandSparkles, XCircle, } from "lucide-react"; -import { - type KeyboardEvent, - type ReactNode, - useEffect, - useMemo, - useRef, - useState, -} from "react"; +import { type ReactNode, useEffect, useMemo, useRef, useState } from "react"; import { type ImperativePanelHandle, Panel, @@ -67,7 +59,6 @@ import { CardTitle, } from "@/components/ui/card"; import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; -import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Select, @@ -470,34 +461,34 @@ function getStatusLabel(status: Model3DTaskStatus) { function getStatusBadgeClass(status: Model3DTaskStatus) { switch (status) { case "success": - return "border-emerald-400/25 bg-emerald-400/15 text-emerald-100"; + return "border-emerald-200 bg-emerald-50 text-emerald-700"; case "running": - return "border-sky-400/25 bg-sky-400/15 text-sky-100"; + return "border-sky-200 bg-sky-50 text-sky-700"; case "queued": - return "border-amber-400/25 bg-amber-400/15 text-amber-100"; + return "border-amber-200 bg-amber-50 text-amber-700"; case "failed": case "banned": case "cancelled": case "expired": - return "border-rose-400/25 bg-rose-400/15 text-rose-100"; + return "border-rose-200 bg-rose-50 text-rose-700"; default: - return "border-white/10 bg-white/10 text-white/75"; + return "border-[#ddd7ca] bg-white text-[#2a261f]"; } } function getMessageStateClass(state?: ChatMessageState) { switch (state) { case "success": - return "border-white/10 bg-[#262626]"; + return "border-emerald-200 bg-emerald-50/70"; case "failed": - return "border-rose-400/20 bg-rose-400/8"; + return "border-rose-200 bg-rose-50/80"; case "running": - return "border-sky-400/20 bg-sky-400/8"; + return "border-sky-200 bg-sky-50/80"; case "queued": case "thinking": - return "border-white/10 bg-[#232323]"; + return "border-[#ddd7ca] bg-[#f5f1e8]"; default: - return "border-white/10 bg-[#232323]"; + return "border-[#ddd7ca] bg-[#f5f1e8]"; } } @@ -1457,14 +1448,14 @@ function getCodeDiffRowClass(kind: CodeDiffKind, side: "left" | "right") { } if (kind === "changed") { - return "bg-amber-400/10"; + return "bg-amber-50"; } if (kind === "removed") { - return side === "left" ? "bg-rose-400/12" : "bg-rose-400/6"; + return side === "left" ? "bg-rose-50" : "bg-rose-50/55"; } - return side === "right" ? "bg-emerald-400/12" : "bg-emerald-400/6"; + return side === "right" ? "bg-emerald-50" : "bg-emerald-50/55"; } function AiCadCodeDiffPane({ @@ -1493,16 +1484,16 @@ function AiCadCodeDiffPane({ title: string; }) { return ( -
-
+
+
-
{title}
-

{subtitle}

+
{title}
+

{subtitle}

{code ? (
); @@ -2159,7 +2155,7 @@ function AiCadMessageActionButton({ }) { return ( - -
- AI -
+
+
+
+ + + 返回首页 + +
+
+ AI
+ + AI-CAD Studio +
- -
-
-
- AI-CAD -
-
- commitWorkspaceName(workspaceNameDraft)} - onChange={(event) => - setWorkspaceNameDraft(event.target.value) - } - onKeyDown={handleWorkspaceNameKeyDown} - placeholder="untitled / main.kcl" - value={workspaceNameDraft} - /> -
-
- -
- - - {isLoadingWorkspaceList ? "正在读取" : normalizedWorkspaceName} - - - {versions.length} versions - - - {completedCount} completed - - - {workspaceSyncState === "synced" ? ( - - ) : workspaceSyncState === "syncing" || - workspaceSyncState === "loading" ? ( - - ) : ( - - )} - {workspaceSyncState === "synced" + +
+ + + +
+ + +
+ AI +
+
+ +
+
+
+ + + {generationProvider === "kittycad-cad" + ? "KittyCAD / Zoo CAD" + : "Tripo3D"} + + {activeVersion + ? `Focus V${activeVersion.versionNumber}` + : "Ready for first pass"} + + + left explorer / center canvas / right agent + +
+ +
+ + +
{(workspaceSyncError || workspaceOperationError) && ( -
+
{workspaceSyncError ? ( -

+

云端同步提示:{workspaceSyncError}

) : null} {workspaceOperationError ? ( -

+

工作台提示:{workspaceOperationError}

) : null}
)} - -
-
-
- - 多工作台 -
- -
- - - -
-
- - -
- {workspaces.map((workspace) => ( - - ))} -
-
- -
-
-
- Panel Layout -
- - left tree / center canvas / right agent - -
-
- - - -
-
-
-
+
-
+
Panels
{ + historyPanelRef.current?.expand(); + setActiveLeftPanelView("project"); + }} + shortLabel="Proj" + /> + { historyPanelRef.current?.expand(); - setActiveResultTab("preview"); + setActiveLeftPanelView("tree"); }} shortLabel="Tree" /> @@ -3969,13 +3758,13 @@ export function AiCadWorkbench() {
-
+
Tools
{primaryDownloadEntry ? ( ) : (
-
+
) : ( - - + +
- + AI-CAD Agent - + Continuous design thread for the active version.
- + Agent
-
+
- + Session Context {activeVersion ? ( - + Focus V{activeVersion.versionNumber} ) : ( - + New thread )}
{activeVersion ? ( -
+
{getProviderLabel(activeVersion.provider)} @@ -4242,7 +4031,7 @@ export function AiCadWorkbench() {
) : null}
-

+

{activeVersion ? activeVersion.generationMode === "iterate" ? `当前已经沿着 V${activeVersion.versionNumber} 进入连续修改模式。` @@ -4263,9 +4052,9 @@ export function AiCadWorkbench() { return (

-
+
{message.role === "user" ? ( <> @@ -4291,7 +4080,7 @@ export function AiCadWorkbench() {
{message.role !== "user" && message.state ? ( - + {getMessageStateLabel(message.state)} ) : null} @@ -4314,27 +4103,27 @@ export function AiCadWorkbench() { {linkedVersion.generationMode === "iterate" ? ( - + 连续修改 ) : null} {linkedVersion.parentVersionId ? ( - + linked output ) : ( - + root output )}
) : null} -
+
{message.content}
-
+
{linkedVersion ? (
- + {linkedVersion ? linkedVersion.generationMode === "iterate" @@ -4384,9 +4173,9 @@ export function AiCadWorkbench() {
-
+
- + 生成引擎 {generationProvider === "tripo-3d" ? ( <> - + Tripo 模型版本 ) : ( - + 输出 GLB / STEP / KCL )} {activeVersion ? ( - + {willSubmitAsIteration ? `基于 V${activeVersion.versionNumber} 连续修改` : `参考版本 V${activeVersion.versionNumber}`} @@ -4449,8 +4238,8 @@ export function AiCadWorkbench() { className={cn( "mb-2.5 rounded-[8px] border px-3.5 py-2.5 text-[13px] leading-6", kittycadProviderStatus?.configured - ? "border-emerald-400/20 bg-emerald-400/10 text-emerald-100" - : "border-amber-400/20 bg-amber-400/10 text-amber-100" + ? "border-emerald-200 bg-emerald-50 text-emerald-800" + : "border-amber-200 bg-amber-50 text-amber-800" )} >
@@ -4484,16 +4273,16 @@ export function AiCadWorkbench() {
) : null} -
+
-
+
Suggested Next Edits
{semanticFocusInsights.length > 0 ? (
{semanticFocusInsights.map((insight) => ( {insight.shortLabel} @@ -4505,7 +4294,7 @@ export function AiCadWorkbench() {
{followUpSuggestions.slice(0, 3).map((item) => (
-
+
Prompt Directives
{STRUCTURED_PROMPT_DIRECTIVES.map((directive) => (