/**
* @fileoverview 主应用组件
* @description 负责应用的路由配置、布局和设计模式集成
*/
import React, { Suspense } from 'react';
import { Routes, Route, Navigate } from 'react-router-dom';
import { motion, AnimatePresence } from 'framer-motion';
import { useDesignModeStore } from './main';
// 页面组件(懒加载)
const Dashboard = React.lazy(() => import('./pages/Dashboard'));
const ComponentEditor = React.lazy(() => import('./pages/ComponentEditor'));
const DesignSystem = React.lazy(() => import('./pages/DesignSystem'));
const LivePreview = React.lazy(() => import('./pages/LivePreview'));
// 布局组件
import AppLayout from './components/layout/AppLayout';
import LoadingSpinner from './components/ui/LoadingSpinner';
// 页面过渡动画配置
const pageVariants = {
initial: {
opacity: 0,
y: 20,
},
in: {
opacity: 1,
y: 0,
},
out: {
opacity: 0,
y: -20,
},
};
const pageTransition = {
type: 'tween',
ease: 'anticipate',
duration: 0.3,
};
/**
* 页面容器组件 - 提供统一的页面布局和动画
*/
const PageContainer: React.FC<{
children: React.ReactNode;
title: string;
description?: string;
className?: string;
}> = ({ children, title, description, className = '' }) => (
{title}
{description && (
{description}
)}
{children}
);
/**
* 页面路由配置组件
*/
const AppRoutes: React.FC = () => {
return (
}>
{/* 默认重定向到仪表盘 */}
}
/>
{/* 仪表盘页面 */}
}
/>
{/* 组件编辑器页面 */}
}
/>
{/* 设计系统页面 */}
}
/>
{/* 实时预览页面 */}
}
/>
{/* 404 页面 */}
}
/>
);
};
/**
* 设计模式集成组件
*/
const DesignModeIntegration: React.FC = () => {
const { isDesignModeEnabled, selectedComponent, hoveredComponent } = useDesignModeStore();
// 为组件添加设计模式属性
React.useEffect(() => {
if (!isDesignModeEnabled) return;
const addDesignModeAttributes = () => {
const components = document.querySelectorAll('[data-component]');
components.forEach((element, index) => {
const componentName = element.getAttribute('data-component');
const elementName = element.getAttribute('data-element');
const action = element.getAttribute('data-action');
// 添加设计模式属性
element.setAttribute('data-design-mode', 'true');
element.setAttribute('data-design-mode-component', componentName || 'Unknown');
if (elementName) {
element.setAttribute('data-design-mode-element', elementName);
}
if (action) {
element.setAttribute('data-design-mode-action', action);
}
});
};
// 监听 DOM 变化
const observer = new MutationObserver(addDesignModeAttributes);
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
});
// 初始调用
addDesignModeAttributes();
return () => {
observer.disconnect();
};
}, [isDesignModeEnabled]);
// 添加全局样式
React.useEffect(() => {
if (isDesignModeEnabled) {
const style = document.createElement('style');
style.id = 'design-mode-styles';
style.textContent = `
[data-design-mode="true"] {
cursor: crosshair;
}
[data-design-mode="true"]:hover {
outline: 2px solid #3b82f6 !important;
outline-offset: 2px !important;
background-color: rgba(59, 130, 246, 0.05) !important;
}
[data-design-mode-active="true"] {
outline: 3px solid #ef4444 !important;
outline-offset: 2px !important;
background-color: rgba(239, 68, 68, 0.1) !important;
}
[data-design-mode-hover="true"] {
outline: 2px solid #f59e0b !important;
outline-offset: 2px !important;
background-color: rgba(245, 158, 11, 0.1) !important;
}
`;
document.head.appendChild(style);
return () => {
document.getElementById('design-mode-styles')?.remove();
};
}
}, [isDesignModeEnabled]);
return null;
};
/**
* 主应用组件
*/
const App: React.FC = () => {
const { isDesignModeEnabled } = useDesignModeStore();
return (
{/* 设计模式集成 */}
{/* 主要内容 */}
{/* 开发模式信息 */}
{import.meta.env.DEV && (
Design Mode: {isDesignModeEnabled ? 'Enabled' : 'Disabled'}
React: {React.version}
Vite: {import.meta.env.MODE}
)}
);
};
export default App;