"use client"; import * as React from "react"; import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; import { Button } from "@/components/ui/button"; import { Menu } from "lucide-react"; import { LAYOUT } from "@/lib/constants/breakpoints"; /** * ResponsiveLayout - 响应式布局组件 * * 提供统一的响应式布局,支持桌面端和移动端自适应。 * * @example * ```tsx * } * main={} * rightPanel={} * /> * ``` * * @param sidebar - 侧边栏内容(桌面端显示,移动端可折叠) * @param main - 主内容区(所有设备都显示) * @param rightPanel - 右侧面板(大屏幕显示,小屏幕隐藏或折叠) * @param header - 顶部栏(可选) * @param className - 额外的 CSS 类名 */ export interface ResponsiveLayoutProps { sidebar?: React.ReactNode; main: React.ReactNode; rightPanel?: React.ReactNode; header?: React.ReactNode; className?: string; sidebarWidth?: string; // 侧边栏宽度(可选,默认使用 LAYOUT.sidebarWidth) } export function ResponsiveLayout({ sidebar, main, rightPanel, header, className, sidebarWidth, }: ResponsiveLayoutProps) { const actualSidebarWidth = sidebarWidth || LAYOUT.sidebarWidth; return (
{/* 桌面端侧边栏:中等屏幕及以上显示 */} {sidebar && ( )} {/* 移动端侧边栏:使用 Sheet 组件实现可折叠侧边栏 */} {sidebar && ( {sidebar} )} {/* 主内容区 */}
{/* 顶部栏(如果提供) */} {header && (
{header}
)} {/* 主内容区和右侧面板容器 */}
{/* 主内容区 */}
{main}
{/* 右侧面板:大屏幕显示,小屏幕隐藏 */} {rightPanel && ( <> {/* 移动端右侧面板:使用 Sheet 组件实现可折叠面板 */} {rightPanel} )}
); }