import type { ReactNode } from "react" import { cn } from "@/shared/lib/utils" /** * 仪表盘移动端响应式布局(L8)。 * * 根据屏幕尺寸自动调整 Widget 布局: * - 移动端(< sm):单列堆叠,重要 Widget 优先 * - 平板(sm - lg):双列网格 * - 桌面(>= lg):按配置的 layoutClassName 渲染 * * 通过 CSS Grid 的 order 属性实现移动端优先级排序, * 避免重复渲染(P2-9 教训)。 */ export function DashboardResponsiveLayout({ children, className, mobileFirstSlot, }: { children: ReactNode className?: string /** 移动端置顶的 Widget(如今日课表/待办) */ mobileFirstSlot?: ReactNode }) { return (
{mobileFirstSlot && (
{mobileFirstSlot}
)} {children}
) } /** * 移动端水平滑动卡片容器(L8)。 * * - snap-x snap-mandatory 提供卡片吸附效果 * - 隐藏滚动条但保留滚动功能 * - 仅在移动端生效,桌面端转为网格 */ export function MobileSwipeContainer({ children, className, ariaLabel, }: { children: ReactNode className?: string ariaLabel?: string }) { return (
{children}
) } /** * 桌面端网格容器(L8)。 * * 与 MobileSwipeContainer 配对使用, * 桌面端显示网格,移动端隐藏(由 MobileSwipeContainer 接管)。 */ export function DesktopGrid({ children, className, columns = 3, }: { children: ReactNode className?: string columns?: 2 | 3 | 4 }) { const gridCols = { 2: "sm:grid-cols-2", 3: "sm:grid-cols-2 lg:grid-cols-3", 4: "sm:grid-cols-2 lg:grid-cols-4", }[columns] return (
{children}
) }