diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts
deleted file mode 100644
index eae8aeb53..000000000
--- a/apps/web/next-env.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-///
-///
-
-// This file is auto-used by Next.js TypeScript projects.
diff --git a/apps/web/next.config.js b/apps/web/next.config.js
deleted file mode 100644
index 91ef62f0d..000000000
--- a/apps/web/next.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- reactStrictMode: true,
-};
-
-module.exports = nextConfig;
diff --git a/apps/web/src/App.css b/apps/web/src/App.css
deleted file mode 100644
index 24233c189..000000000
--- a/apps/web/src/App.css
+++ /dev/null
@@ -1,140 +0,0 @@
-/* V21 App Root Styles */
-
-.xx-app-root {
- min-height: 100vh;
- display: flex;
- align-items: center;
- justify-content: center;
- background: linear-gradient(135deg, #f8fafc 0%, #eef2ff 100%);
- padding: 24px;
-}
-
-.xx-app-container {
- max-width: 480px;
- width: 100%;
- text-align: center;
-}
-
-/* Hero Section */
-.xx-hero-section {
- margin-bottom: 40px;
-}
-
-.xx-logo {
- font-size: 72px;
- margin-bottom: 24px;
- animation: float 3s ease-in-out infinite;
-}
-
-@keyframes float {
- 0%, 100% { transform: translateY(0); }
- 50% { transform: translateY(-10px); }
-}
-
-.xx-hero-section h1 {
- font-size: 36px;
- font-weight: 850;
- color: #0f172a;
- margin: 0 0 12px;
- letter-spacing: -0.5px;
-}
-
-.xx-hero-section p {
- font-size: 18px;
- color: #64748b;
- margin: 0;
-}
-
-.xx-status-badge {
- display: inline-flex;
- align-items: center;
- gap: 8px;
- margin-top: 20px;
- padding: 8px 16px;
- background: #eef2ff;
- color: #4f46e5;
- border-radius: 20px;
- font-size: 14px;
- font-weight: 600;
-}
-
-.xx-status-dot {
- width: 8px;
- height: 8px;
- background: #4f46e5;
- border-radius: 50%;
- animation: pulse 2s ease-in-out infinite;
-}
-
-@keyframes pulse {
- 0%, 100% { opacity: 1; transform: scale(1); }
- 50% { opacity: 0.5; transform: scale(1.2); }
-}
-
-/* Card */
-.xx-card {
- background: rgba(255,255,255,0.94);
- border: 1px solid rgba(226,232,240,0.95);
- border-radius: 22px;
- box-shadow: 0 24px 70px rgba(15,23,42,0.09);
- padding: 28px;
- transition: all 0.25s;
-}
-
-.xx-card:hover {
- box-shadow: 0 26px 64px rgba(15,23,42,0.14);
- transform: translateY(-2px);
-}
-
-.xx-card h3 {
- font-size: 18px;
- font-weight: 700;
- color: #0f172a;
- margin: 0 0 20px;
- text-align: left;
-}
-
-/* Quick Links */
-.xx-link-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 16px;
-}
-
-.xx-link-item {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 12px;
- padding: 24px 16px;
- background: #f8fafc;
- border: 1px solid #e2e8f0;
- border-radius: 16px;
- text-decoration: none;
- color: #0f172a;
- font-weight: 600;
- transition: all 0.2s;
-}
-
-.xx-link-item:hover {
- background: #eef2ff;
- border-color: #4f46e5;
- color: #4f46e5;
- transform: translateY(-2px);
- box-shadow: 0 8px 24px rgba(79,70,229,0.15);
-}
-
-.xx-link-icon {
- font-size: 32px;
-}
-
-/* Responsive */
-@media (max-width: 480px) {
- .xx-hero-section h1 {
- font-size: 28px;
- }
-
- .xx-link-grid {
- grid-template-columns: 1fr;
- }
-}
diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx
deleted file mode 100644
index 31e644b8e..000000000
--- a/apps/web/src/App.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * App Root Component - V21 UI
- * 注意:此组件已被路由系统接管,仅作为默认展示
- */
-import { Link } from 'react-router-dom';
-import './App.css';
-
-function App() {
- return (
-
-
-
-
🎬
-
小虾 SaaS
-
自动化视频剪辑平台
-
-
- 前端开发中
-
-
-
-
-
快速链接
-
- Projects (Coming Soon)
-
- 📋
- 我的项目
-
-
-
-
-
- );
-}
-
-export default App;
diff --git a/apps/web/src/components/business/QuotaDisplay.tsx b/apps/web/src/components/business/QuotaDisplay.tsx
deleted file mode 100644
index 49eadc054..000000000
--- a/apps/web/src/components/business/QuotaDisplay.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * 配额使用展示组件 - V21 UI
- */
-import React from 'react';
-import { Card, Progress, Row, Col, Tag, Space } from 'antd';
-import { ProjectOutlined, CloudOutlined, WarningOutlined } from '@ant-design/icons';
-import './business.css';
-
-interface QuotaStatus {
- projects: {
- used: number;
- limit: number;
- status: string;
- };
- storage: {
- used_gb: number;
- limit_gb: number;
- status: string;
- };
-}
-
-interface QuotaDisplayProps {
- quota: QuotaStatus;
-}
-
-const QuotaDisplay: React.FC = ({ quota }) => {
- const getStatusTag = (status: string) => {
- const config: Record = {
- normal: { color: 'success', text: '正常', className: 'xx-tag-success' },
- warning: { color: 'warning', text: '接近上限', className: 'xx-tag-warning' },
- critical: { color: 'error', text: '即将超限', className: 'xx-tag-error' },
- exceeded: { color: 'error', text: '已超限', className: 'xx-tag-error' },
- };
- const item = config[status] || config.normal;
- return (
- } className={`xx-tag ${item.className}`}>
- {item.text}
-
- );
- };
-
- const getProgressColor = (status: string) => {
- const colorMap: Record = {
- normal: '#16a34a',
- warning: '#d97706',
- critical: '#dc2626',
- exceeded: '#dc2626',
- };
- return colorMap[status] || '#4f46e5';
- };
-
- return (
-
-
-
-
-
-
-
- 项目数量
-
-
- {getStatusTag(quota.projects.status)}
-
-
- {quota.projects.used} / {quota.projects.limit} 个项目
-
-
-
-
-
-
-
-
-
- 存储空间
-
-
- {getStatusTag(quota.storage.status)}
-
-
- {quota.storage.used_gb.toFixed(2)} / {quota.storage.limit_gb} GB
-
-
-
-
-
- );
-};
-
-export default QuotaDisplay;
diff --git a/apps/web/src/components/layout/Header.tsx b/apps/web/src/components/layout/Header.tsx
index 64d05962a..76ceb32d7 100644
--- a/apps/web/src/components/layout/Header.tsx
+++ b/apps/web/src/components/layout/Header.tsx
@@ -5,6 +5,7 @@ import { useLocation, useNavigate } from 'react-router-dom';
import { useAuthStore } from '@/store/authStore';
import { useLogout } from '@/hooks/useAuth';
import type { MenuProps } from 'antd';
+import './Header.css';
const extractProjectId = (pathname: string) => {
const match = pathname.match(/^\/projects\/([^/]+)/);
diff --git a/apps/web/src/store/workspaceStore.ts b/apps/web/src/store/workspaceStore.ts
deleted file mode 100644
index eab0d2188..000000000
--- a/apps/web/src/store/workspaceStore.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 工作空间状态管理
- */
-import { create } from 'zustand';
-import { Workspace } from '@/api/workspace';
-
-interface WorkspaceState {
- currentWorkspace: Workspace | null;
- workspaces: Workspace[];
-
- // Actions
- setCurrentWorkspace: (workspace: Workspace | null) => void;
- setWorkspaces: (workspaces: Workspace[]) => void;
- addWorkspace: (workspace: Workspace) => void;
- removeWorkspace: (workspaceId: string) => void;
-}
-
-export const useWorkspaceStore = create((set) => ({
- currentWorkspace: null,
- workspaces: [],
-
- setCurrentWorkspace: (workspace) => {
- set({ currentWorkspace: workspace });
- },
-
- setWorkspaces: (workspaces) => {
- set({ workspaces });
- },
-
- addWorkspace: (workspace) => {
- set((state) => ({
- workspaces: [...state.workspaces, workspace],
- }));
- },
-
- removeWorkspace: (workspaceId) => {
- set((state) => ({
- workspaces: state.workspaces.filter((w) => w.id !== workspaceId),
- currentWorkspace:
- state.currentWorkspace?.id === workspaceId ? null : state.currentWorkspace,
- }));
- },
-}));