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 cf4e99514..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) {