chore: add frontend/src/components/layout/Layout.tsx
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import React from 'react';
|
||||
import Sidebar from './Sidebar';
|
||||
import BottomTab from './BottomTab';
|
||||
import { useUiStore } from '../../stores';
|
||||
|
||||
interface LayoutProps {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* 布局组件 - Layout
|
||||
* 功能:定义应用整体布局结构,包含侧边导航栏、主内容区和底部标签栏
|
||||
* 布局结构:
|
||||
* - Sidebar(左侧边栏):桌面端固定显示,可折叠(宽度 240px / 64px)
|
||||
* - main(主内容区):根据侧边栏状态动态调整左边距
|
||||
* - BottomTab(底部标签栏):移动端底部导航,固定定位
|
||||
* 响应式策略:
|
||||
* - 桌面端(≥768px):显示侧边栏,主内容区留出左边距
|
||||
* - 移动端(<768px):隐藏侧边栏,使用底部标签栏导航
|
||||
*/
|
||||
const Layout: React.FC<LayoutProps> = ({ children }) => {
|
||||
// 从 UI 状态中获取侧边栏折叠状态,用于动态调整主内容区宽度
|
||||
const { sidebarCollapsed } = useUiStore();
|
||||
|
||||
return (
|
||||
<div className="app-layout">
|
||||
<Sidebar />
|
||||
<main
|
||||
className="main-content"
|
||||
role="main"
|
||||
style={{
|
||||
marginLeft: sidebarCollapsed ? '64px' : '240px',
|
||||
padding: '32px',
|
||||
maxWidth: '1280px',
|
||||
transition: 'margin-left 0.3s ease'
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</main>
|
||||
<BottomTab />
|
||||
|
||||
<style>{`
|
||||
.app-layout {
|
||||
display: flex;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
flex: 1;
|
||||
padding-bottom: 88px;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.main-content {
|
||||
margin-left: 0 !important;
|
||||
padding: 20px;
|
||||
padding-bottom: 88px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1440px) {
|
||||
.main-content {
|
||||
max-width: 1440px;
|
||||
}
|
||||
}
|
||||
`}</style>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Layout;
|
||||
Reference in New Issue
Block a user