Layout
用于构建带侧边栏、头部、页签、内容区和页脚的应用布局
Layout 用于搭建典型产品页面、工具类应用或内容型站点布局。它内置侧边栏展开/折叠状态、移动端抽屉侧栏、侧栏拖拽触发轨道、头部、页签、主内容区和页脚结构。
import {
Layout,
LayoutFooter,
LayoutHeader,
LayoutMain,
LayoutRail,
LayoutRoot,
LayoutSidebar,
LayoutTab,
LayoutTrigger
} from '@skyroc/web-ui';何时使用
- 页面需要固定的应用外壳,包括侧边栏、头部、内容区和页脚。
- 侧边栏需要支持桌面端折叠、移动端抽屉展开。
- 需要在同一布局中切换
sidebar、floating、inset三种视觉结构。 - 只需要局部内容排列时,不应使用 Layout,直接使用普通容器或 CSS grid/flex 即可。
基础结构
Layout 是便捷组合组件,内部会创建 LayoutRoot、LayoutSidebar、LayoutMain、LayoutHeader、LayoutTab、LayoutFooter 和 LayoutRail。
<Layout
defaultOpen
header={<div className="h-12 px-4">Header</div>}
sidebar={<div className="p-2">Sidebar</div>}
tab={<div className="border-b p-4">Tab</div>}
footer={<div className="border-t p-4">Footer</div>}
>
<div className="p-4">Content</div>
</Layout>触发器
在 header 或自定义结构中放置 LayoutTrigger,可以切换侧边栏。桌面端切换 open,移动端切换移动抽屉。
<Layout
defaultOpen
header={(
<div className="flex items-center gap-2 px-4">
<LayoutTrigger />
<span>Dashboard</span>
</div>
)}
sidebar={<nav className="p-2">Menu</nav>}
>
<main className="p-4">Content</main>
</Layout>变体
通过 variant 控制侧边栏和主内容区的视觉关系。
| 变体 | 说明 |
|---|---|
sidebar | 标准侧边栏布局,主内容贴合侧栏 |
floating | 侧边栏带间距、圆角、边框和阴影 |
inset | 页面背景使用侧栏色,主内容内嵌卡片 |
折叠模式
通过 collapsible 控制桌面端折叠行为。
| 模式 | 说明 |
|---|---|
icon | 折叠到 collapsedSidebarWidth,适合图标菜单 |
offcanvas | 折叠时侧边栏滑出画布并隐藏 |
方向与尺寸
通过 side 控制侧边栏在左侧或右侧;通过 size 调整布局字体和布局间距变量。sidebarWidth 和 collapsedSidebarWidth 以 px 为输入,会按当前 size 比例换算为 CSS rem 变量。
自定义样式
通过 ui 控制各 slot 的 class,包括 root、sidebarRoot、sidebarWrapper、sidebar、sidebarGapHandler、mobileRoot、mobile、rail、trigger、main、header、tab 和 footer。
API
Layout
便捷组合组件,适合大多数页面级布局。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| children | 主内容区内容 | ReactNode | - |
| header | 头部区域内容 | ReactNode | - |
| sidebar | 侧边栏内容,支持 render function 获取折叠状态 | ReactNode | LayoutSidebarRenderFn | - |
| tab | 页签区域内容,显示在 header 下方 | ReactNode | - |
| footer | 页脚区域内容 | ReactNode | - |
| variant | 布局视觉变体 | 'sidebar' | 'floating' | 'inset' | 'sidebar' |
| collapsible | 侧边栏折叠模式 | 'offcanvas' | 'icon' | 'offcanvas' |
| side | 侧边栏方向 | 'left' | 'right' | 'left' |
| size | 尺寸,影响字体、布局间距和宽度换算 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| open | 受控模式下的桌面侧边栏打开状态 | boolean | - |
| defaultOpen | 非受控模式下的默认打开状态 | boolean | false |
| onOpenChange | 桌面侧边栏打开状态变化时触发 | (open: boolean) => void | - |
| sidebarWidth | 展开时侧边栏宽度,单位 px,会按 size 比例换算 | number | 240 |
| collapsedSidebarWidth | icon 折叠模式下的侧边栏宽度,单位 px,会按 size 比例换算 | number | 50 |
| ui | 各 slot 的自定义 class | LayoutUi | - |
结构组件
需要更细粒度控制时,可以直接组合结构组件。LayoutSidebar、LayoutRail、LayoutTrigger 必须在 LayoutRoot 内使用,因为它们依赖布局上下文。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| LayoutRoot | 布局根容器,提供侧边栏状态和上下文 | LayoutRootProps | - |
| LayoutSidebar | 桌面侧边栏和移动端抽屉侧栏 | LayoutSidebarProps | - |
| LayoutMain | 主内容区域 | LayoutMainProps | - |
| LayoutHeader | 头部区域 | LayoutHeaderProps | - |
| LayoutTab | 页签区域 | LayoutTabProps | - |
| LayoutFooter | 页脚区域 | LayoutFooterProps | - |
| LayoutRail | 侧边栏边缘触发轨道,点击切换侧边栏 | LayoutRailProps | - |
| LayoutTrigger | 侧边栏切换按钮,内部使用 ButtonIcon | LayoutTriggerProps | - |
类型
LayoutProps
便捷组合组件属性。继承 LayoutRootProps,并额外提供 header、sidebar、tab、footer 和 ui。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 主内容区内容。 |
| collapsedSidebarWidth | number | 折叠侧边栏宽度,单位 px。默认值为 50。 |
| collapsible | 'offcanvas' | 'icon' | 侧边栏折叠模式。默认值为 offcanvas。 |
| defaultOpen | boolean | 非受控默认打开状态。默认值为 false。 |
| footer | ReactNode | 页脚内容。 |
| header | ReactNode | 头部内容。 |
| onOpenChange | (open: boolean) => void | 打开状态变化回调。 |
| open | boolean | 受控打开状态。 |
| side | 'left' | 'right' | 侧边栏方向。默认值为 left。 |
| sidebar | ReactNode | LayoutSidebarRenderFn | 侧边栏内容或 render function。 |
| sidebarWidth | number | 展开侧边栏宽度,单位 px。默认值为 240。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 布局尺寸。默认值为 md。 |
| tab | ReactNode | 页签内容。 |
| ui | LayoutUi | 各 slot 的自定义 class。 |
| variant | 'sidebar' | 'floating' | 'inset' | 布局变体。默认值为 sidebar。 |
LayoutRootProps
布局根组件属性,负责状态、上下文和 CSS 宽度变量。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | LayoutRootRenderFn | 子节点或接收 open 的 render function。 |
| className | ClassValue | 根容器 class。 |
| collapsedSidebarWidth | number | 折叠侧边栏宽度,单位 px。 |
| collapsible | 'offcanvas' | 'icon' | 侧边栏折叠模式。 |
| defaultOpen | boolean | 非受控默认打开状态。 |
| onOpenChange | (open: boolean) => void | 打开状态变化回调。 |
| open | boolean | 受控打开状态。 |
| side | 'left' | 'right' | 侧边栏方向。 |
| sidebarWidth | number | 展开侧边栏宽度,单位 px。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 布局尺寸。 |
| variant | 'sidebar' | 'floating' | 'inset' | 布局变体。 |
LayoutSidebarProps
侧边栏组件属性。桌面端渲染固定侧栏,移动端渲染抽屉内容。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | LayoutSidebarRenderFn | 侧边栏内容或接收 collapsed 状态的 render function。 |
| className | ClassValue | 侧边栏主体 class。 |
| collapsible | 'offcanvas' | 'icon' | 折叠模式。 |
| side | 'left' | 'right' | 侧边栏方向。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 布局尺寸。 |
| ui | LayoutUi | 侧边栏相关 slot class。 |
| variant | 'sidebar' | 'floating' | 'inset' | 布局变体。 |
LayoutSidebarChildrenProps
传给 sidebar render function 的状态。
| 字段 | 类型 | 说明 |
|---|---|---|
| collapsed | boolean | 侧边栏是否折叠。 |
| collapsedWidth | number | 折叠宽度,单位 px。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 布局尺寸。 |
LayoutMainProps
主内容区域属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 主内容。 |
| className | ClassValue | 主内容区域 class。 |
| collapsible | 'offcanvas' | 'icon' | 折叠模式,用于匹配布局样式。 |
| variant | 'sidebar' | 'floating' | 'inset' | 布局变体,用于匹配主区域样式。 |
LayoutRailProps
侧边栏边缘触发轨道属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | 触发轨道 class。 |
| collapsible | 'offcanvas' | 'icon' | 折叠模式,用于匹配轨道位置。 |
| side | 'left' | 'right' | 侧边栏方向。 |
| variant | 'sidebar' | 'floating' | 'inset' | 布局变体,用于匹配轨道位置。 |
LayoutTriggerProps
侧边栏切换按钮属性。基于 ButtonIcon 使用,点击时会调用布局上下文的 toggleSidebar。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | 触发按钮 class。 |
| disabled | boolean | 是否禁用按钮。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 按钮尺寸。 |
LayoutUi
各 slot 的自定义 class。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根容器 class。 |
| sidebarRoot | ClassValue | 侧边栏外层 class。 |
| sidebarWrapper | ClassValue | 侧边栏定位包裹层 class。 |
| sidebar | ClassValue | 侧边栏主体 class。 |
| sidebarGapHandler | ClassValue | 侧边栏占位区域 class。 |
| mobileRoot | ClassValue | 移动端抽屉根容器 class。 |
| mobile | ClassValue | 移动端侧栏内容 class。 |
| rail | ClassValue | 触发轨道 class。 |
| trigger | ClassValue | 触发按钮 class。 |
| main | ClassValue | 主内容区域 class。 |
| header | ClassValue | 头部区域 class。 |
| tab | ClassValue | 页签区域 class。 |
| footer | ClassValue | 页脚区域 class。 |
LayoutRootRenderFn
根布局渲染函数
LayoutSlots
Layout 可配置 ui 的内置 slot