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}
)
}