"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 && (
)}
{/* 主内容区和右侧面板容器 */}
{/* 主内容区 */}
{main}
{/* 右侧面板:大屏幕显示,小屏幕隐藏 */}
{rightPanel && (
<>
{/* 移动端右侧面板:使用 Sheet 组件实现可折叠面板 */}
{rightPanel}
>
)}
);
}