"use client"; import * as Tabs from "@radix-ui/react-tabs"; import * as Tooltip from "@radix-ui/react-tooltip"; import { ArrowRightIcon, ArrowsOutIcon, BuildingsIcon, CheckIcon, CircleNotchIcon, CubeIcon, EyeIcon, EyeSlashIcon, GearSixIcon, ImageIcon, LockSimpleIcon, PaperPlaneTiltIcon, PlusIcon, SlidersHorizontalIcon, SparkleIcon, UploadSimpleIcon, WarningCircleIcon, } from "@phosphor-icons/react"; import Image from "next/image"; import { FormEvent, useEffect, useMemo, useState } from "react"; import { SettingsCenter } from "@/components/settings-center"; import { initialLayers, initialMessages, styleDirections, workflowStages, } from "@/lib/demo"; import type { ChatMessage } from "@/types/workflow"; import type { SettingsReadiness } from "@/types/settings"; const iconWeight = "regular" as const; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8000"; export function WorkflowStudio() { const [layers, setLayers] = useState(initialLayers); const [selectedDirection, setSelectedDirection] = useState("quiet-modern"); const [messages, setMessages] = useState(initialMessages); const [draft, setDraft] = useState(""); const [furnitureMode, setFurnitureMode] = useState<"reference" | "remove">("reference"); const [settingsOpen, setSettingsOpen] = useState(false); const [readiness, setReadiness] = useState(null); const currentDirection = useMemo( () => styleDirections.find((item) => item.id === selectedDirection) ?? styleDirections[0], [selectedDirection], ); useEffect(() => { async function loadReadiness() { try { const response = await fetch(`${API_BASE}/v1/readiness`, { cache: "no-store" }); if (!response.ok) return; const current = await response.json() as SettingsReadiness; setReadiness(current); if (!current.ready && !window.sessionStorage.getItem("settings-intro-seen")) { window.sessionStorage.setItem("settings-intro-seen", "true"); setSettingsOpen(true); } } catch { setReadiness(null); } } void loadReadiness(); }, []); function toggleLayer(id: string) { setLayers((items) => items.map((item) => (item.id === id ? { ...item, visible: !item.visible } : item)), ); } function sendMessage(event: FormEvent) { event.preventDefault(); const value = draft.trim(); if (!value) return; setMessages((items) => [ ...items, { id: `user-${Date.now()}`, role: "user", body: value }, { id: `assistant-${Date.now()}`, role: "assistant", body: "已记录为设计约束。正式接入后,这条指令会先更新布局锁定和 Style DNA,再只重绘受影响视角。", meta: "结构化修改", }, ]); setDraft(""); } return (

空间风格工作台

11-2-104 住宅概念方案

已保存
户型清洗 3D 白模 效果图
适应画布
上方住宅户型 矢量 PDF · 43 个 CAD 图层
从真实 PDF 中分离出的住宅建筑结构平面图
已分离建筑结构 比例待交叉校准

白模将在结构确认后生成

系统会拉伸墙体、门窗和柱,并自动建立三个室内相机。

先选定风格方向

低成本方向图通过后,再生成完整多视角效果图。

{messages.slice(-3).map((message) => (
{message.role === "assistant" ? ( ) : null}
{message.meta ? {message.meta} : null}

{message.body}

))}
setDraft(event.target.value)} placeholder="例如:保留床和窗的位置,客厅更松弛,不要冷灰" />