;
+
+ return (
+
+ );
+ }
return (
)}
+ className={emptyStateClassName}
>
{children}
diff --git a/src/components/project/ProjectGalleryView.test.tsx b/src/components/project/ProjectGalleryView.test.tsx
index c64c177d..a3e8702b 100644
--- a/src/components/project/ProjectGalleryView.test.tsx
+++ b/src/components/project/ProjectGalleryView.test.tsx
@@ -134,4 +134,28 @@ describe('ProjectGalleryView', () => {
expect(deleteEditorProjectMock).toHaveBeenCalledWith('editor-project-1');
expect(deleteEditorProjectMock).toHaveBeenCalledWith('editor-project-2');
});
+
+ it('renders the empty project action with shared empty state chrome', async () => {
+ const onOpenProject = vi.fn();
+ listEditorProjectsMock.mockResolvedValueOnce([]);
+ createEditorProjectMock.mockResolvedValueOnce({
+ ...projectItems[0],
+ projectId: 'editor-project-new',
+ });
+ const user = userEvent.setup();
+
+ render();
+
+ const newProjectButton = await screen.findByRole('button', {
+ name: '新建项目',
+ });
+
+ expect(newProjectButton.className).toContain('platform-empty-state');
+ expect(newProjectButton.className).toContain('project-gallery__new-card');
+
+ await user.click(newProjectButton);
+
+ expect(createEditorProjectMock).toHaveBeenCalledTimes(1);
+ expect(onOpenProject).toHaveBeenCalledWith('editor-project-new');
+ });
});
diff --git a/src/components/project/ProjectGalleryView.tsx b/src/components/project/ProjectGalleryView.tsx
index ec3c6011..a52e80ed 100644
--- a/src/components/project/ProjectGalleryView.tsx
+++ b/src/components/project/ProjectGalleryView.tsx
@@ -327,14 +327,16 @@ export function ProjectGalleryView({ onOpenProject }: ProjectGalleryViewProps) {
正在读取项目
) : projects.length === 0 ? (
-
+
) : (
)}