"use client"; import * as React from "react"; import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; import { Button } from "@/components/ui/button"; import { Menu, PanelRight } from "lucide-react"; import { LAYOUT } from "@/lib/constants/breakpoints"; import { useI18n } from "@/lib/i18n/provider"; /** * ResponsiveLayout - 响应式布局组件 * * 提供统一的响应式布局,支持桌面端和移动端自适应。 * * @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; } export function ResponsiveLayout({ sidebar, main, rightPanel, header, className, sidebarWidth, }: ResponsiveLayoutProps) { const actualSidebarWidth = sidebarWidth || LAYOUT.sidebarWidth; const { t } = useI18n(); /** 与顶部安全区对齐;与 ChatHeader(h-16)上圆钮视觉对齐 */ const mobileFabTop = "top-[max(0.75rem,env(safe-area-inset-top,0px)+0.25rem)]"; return (
{sidebar && ( )} {sidebar && ( {sidebar} )}
{header && (
{header}
)}
{main}
{rightPanel && ( <> {rightPanel} )}
); }