From 84c780a6f807629fcbc5b40f1787f1aba7460b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 12 Sep 2026 20:45:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=20UI=20=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E5=85=A8=E5=B1=8F=E5=A4=96=E5=A3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 通过 portal 将资源编辑器挂载到 body 并覆盖标题栏以下区域 移除外层 FocusTrap,保留内部确认对话框的模态行为 统一左右浮动面板的顶部与底部留白 --- .../src/view/ui-editor/index.tsx | 211 +++++++++++------- 1 file changed, 134 insertions(+), 77 deletions(-) diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx index 4e551bb6a..c03871d8a 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx @@ -1,5 +1,6 @@ import { Redo2, Undo2, X } from 'lucide-react'; import { type ReactNode, useEffect, useMemo, useState } from 'react'; +import { createPortal } from 'react-dom'; import { ThemedModal } from '../../components/modal/ThemedModal'; import { @@ -11,7 +12,10 @@ import { EditorDialogs } from './components/EditorDialogs'; import { ImportOverview } from './components/ImportOverview'; import { InputSidebar } from './components/InputSidebar'; import { InspectorSidebar } from './components/Inspector/InspectorSidebar'; -import { PreviewWorkspace } from './components/preview/PreviewWorkspace'; +import { + PreviewWorkspace, + type UiEditorRenderMode, +} from './components/preview/PreviewWorkspace'; import { RecognitionOverview } from './components/RecognitionOverview'; import { SeparationOverview } from './components/SeparationOverview'; import { ToolNavigation } from './components/ToolNavigation'; @@ -71,8 +75,34 @@ export default function UiEditorPage({ const [generateAfterWarning, setGenerateAfterWarning] = useState(false); const [generateSuccess, setGenerateSuccess] = useState(null); const [returnConfirmOpen, setReturnConfirmOpen] = useState(false); - const [leftPanelOpen, setLeftPanelOpen] = useState(true); - const [rightPanelOpen, setRightPanelOpen] = useState(true); + const [renderMode, setRenderMode] = + useState('editor-overlay'); + const [showFrame, setShowFrame] = useState(false); + const overview = + session.input.activeStep === 'structure-recognition' ? ( + { + session.input.focusNode(treeId, nodeId); + session.input.highlightStatusField(nodeId, 'layout_status'); + }} + /> + ) : session.input.activeStep === 'asset-separation' ? ( + { + session.input.focusNode(treeId, nodeId); + session.input.highlightStatusField(nodeId, 'component_status'); + }} + /> + ) : ( + + ); const saveDisabled = session.save.isSaving || session.save.isGenerating || @@ -163,20 +193,41 @@ export default function UiEditorPage({ onBack?.(); } - return ( + const editorContent = (
{resourceId ? ( -
- +
{resourceLabel ?? 'UI 设计'}
+
+ + +
+ {renderMode === 'final-preview' ? ( + + ) : null}
) : null} +
) : null} + {resourceId ? ( + + ) : null} {session.save.saveError ? (
{session.save.saveError} @@ -232,7 +301,7 @@ export default function UiEditorPage({ ) : null} {session.save.generateError ? (
代码生成失败:{session.save.generateError} @@ -240,75 +309,50 @@ export default function UiEditorPage({ ) : null} {generateSuccess ? (
{generateSuccess}
) : null}
- -
-
-
- {leftPanelOpen ? : null} - -
-
- - -
-
- {rightPanelOpen ? ( - <> - {session.input.activeStep === 'structure-recognition' ? ( - { - session.input.focusNode(treeId, nodeId); - session.input.highlightStatusField(nodeId, 'layout_status'); - }} - /> - ) : session.input.activeStep === 'asset-separation' ? ( - { - session.input.focusNode(treeId, nodeId); - session.input.highlightStatusField( - nodeId, - 'component_status', - ); - }} - /> - ) : ( - - )} - - - ) : null} - + +
+
+
event.preventDefault()} + > + + +
+
event.preventDefault()} + > + {overview} +
+
+
+ +
@@ -423,6 +467,19 @@ export default function UiEditorPage({
); + + if (!resourceId) return editorContent; + + if (typeof document === 'undefined') return editorContent; + + return createPortal( +
+
+ {editorContent} +
+
, + document.body, + ); } function stepLabel(step: UiEditorWorkflowProjection['activeStep'] | undefined) {