Skyroc UI
通用

Layout

用于构建带侧边栏、头部、页签、内容区和页脚的应用布局

Layout 用于搭建典型产品页面、工具类应用或内容型站点布局。它内置侧边栏展开/折叠状态、移动端抽屉侧栏、侧栏拖拽触发轨道、头部、页签、主内容区和页脚结构。

import {
  Layout,
  LayoutFooter,
  LayoutHeader,
  LayoutMain,
  LayoutRail,
  LayoutRoot,
  LayoutSidebar,
  LayoutTab,
  LayoutTrigger
} from '@skyroc/web-ui';

何时使用

  • 页面需要固定的应用外壳,包括侧边栏、头部、内容区和页脚。
  • 侧边栏需要支持桌面端折叠、移动端抽屉展开。
  • 需要在同一布局中切换 sidebarfloatinginset 三种视觉结构。
  • 只需要局部内容排列时,不应使用 Layout,直接使用普通容器或 CSS grid/flex 即可。

基础结构

Layout 是便捷组合组件,内部会创建 LayoutRootLayoutSidebarLayoutMainLayoutHeaderLayoutTabLayoutFooterLayoutRail

<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 调整布局字体和布局间距变量。sidebarWidthcollapsedSidebarWidth 以 px 为输入,会按当前 size 比例换算为 CSS rem 变量。

自定义样式

通过 ui 控制各 slot 的 class,包括 rootsidebarRootsidebarWrappersidebarsidebarGapHandlermobileRootmobilerailtriggermainheadertabfooter

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非受控模式下的默认打开状态booleanfalse
onOpenChange桌面侧边栏打开状态变化时触发(open: boolean) => void-
sidebarWidth展开时侧边栏宽度,单位 px,会按 size 比例换算number240
collapsedSidebarWidthicon 折叠模式下的侧边栏宽度,单位 px,会按 size 比例换算number50
ui各 slot 的自定义 classLayoutUi-

结构组件

需要更细粒度控制时,可以直接组合结构组件。LayoutSidebarLayoutRailLayoutTrigger 必须在 LayoutRoot 内使用,因为它们依赖布局上下文。

属性说明类型默认值
LayoutRoot布局根容器,提供侧边栏状态和上下文LayoutRootProps-
LayoutSidebar桌面侧边栏和移动端抽屉侧栏LayoutSidebarProps-
LayoutMain主内容区域LayoutMainProps-
LayoutHeader头部区域LayoutHeaderProps-
LayoutTab页签区域LayoutTabProps-
LayoutFooter页脚区域LayoutFooterProps-
LayoutRail侧边栏边缘触发轨道,点击切换侧边栏LayoutRailProps-
LayoutTrigger侧边栏切换按钮,内部使用 ButtonIconLayoutTriggerProps-

类型

LayoutProps

便捷组合组件属性。继承 LayoutRootProps,并额外提供 header、sidebar、tab、footer 和 ui。

字段类型说明
childrenReactNode主内容区内容。
collapsedSidebarWidthnumber折叠侧边栏宽度,单位 px。默认值为 50。
collapsible'offcanvas' | 'icon'侧边栏折叠模式。默认值为 offcanvas。
defaultOpenboolean非受控默认打开状态。默认值为 false。
footerReactNode页脚内容。
headerReactNode头部内容。
onOpenChange(open: boolean) => void打开状态变化回调。
openboolean受控打开状态。
side'left' | 'right'侧边栏方向。默认值为 left。
sidebarReactNode | LayoutSidebarRenderFn侧边栏内容或 render function。
sidebarWidthnumber展开侧边栏宽度,单位 px。默认值为 240。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'布局尺寸。默认值为 md。
tabReactNode页签内容。
uiLayoutUi各 slot 的自定义 class。
variant'sidebar' | 'floating' | 'inset'布局变体。默认值为 sidebar。

LayoutRootProps

布局根组件属性,负责状态、上下文和 CSS 宽度变量。

字段类型说明
childrenReactNode | LayoutRootRenderFn子节点或接收 open 的 render function。
classNameClassValue根容器 class。
collapsedSidebarWidthnumber折叠侧边栏宽度,单位 px。
collapsible'offcanvas' | 'icon'侧边栏折叠模式。
defaultOpenboolean非受控默认打开状态。
onOpenChange(open: boolean) => void打开状态变化回调。
openboolean受控打开状态。
side'left' | 'right'侧边栏方向。
sidebarWidthnumber展开侧边栏宽度,单位 px。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'布局尺寸。
variant'sidebar' | 'floating' | 'inset'布局变体。

LayoutSidebarProps

侧边栏组件属性。桌面端渲染固定侧栏,移动端渲染抽屉内容。

字段类型说明
childrenReactNode | LayoutSidebarRenderFn侧边栏内容或接收 collapsed 状态的 render function。
classNameClassValue侧边栏主体 class。
collapsible'offcanvas' | 'icon'折叠模式。
side'left' | 'right'侧边栏方向。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'布局尺寸。
uiLayoutUi侧边栏相关 slot class。
variant'sidebar' | 'floating' | 'inset'布局变体。

LayoutSidebarChildrenProps

传给 sidebar render function 的状态。

字段类型说明
collapsedboolean侧边栏是否折叠。
collapsedWidthnumber折叠宽度,单位 px。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'布局尺寸。

LayoutMainProps

主内容区域属性。

字段类型说明
childrenReactNode主内容。
classNameClassValue主内容区域 class。
collapsible'offcanvas' | 'icon'折叠模式,用于匹配布局样式。
variant'sidebar' | 'floating' | 'inset'布局变体,用于匹配主区域样式。

LayoutHeaderProps

头部区域属性。

字段类型说明
childrenReactNode头部内容。
classNameClassValue头部区域 class。

LayoutTabProps

页签区域属性。

字段类型说明
childrenReactNode页签内容。
classNameClassValue页签区域 class。

页脚区域属性。

字段类型说明
childrenReactNode页脚内容。
classNameClassValue页脚区域 class。

LayoutRailProps

侧边栏边缘触发轨道属性。

字段类型说明
classNameClassValue触发轨道 class。
collapsible'offcanvas' | 'icon'折叠模式,用于匹配轨道位置。
side'left' | 'right'侧边栏方向。
variant'sidebar' | 'floating' | 'inset'布局变体,用于匹配轨道位置。

LayoutTriggerProps

侧边栏切换按钮属性。基于 ButtonIcon 使用,点击时会调用布局上下文的 toggleSidebar。

字段类型说明
classNameClassValue触发按钮 class。
disabledboolean是否禁用按钮。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'按钮尺寸。

LayoutUi

各 slot 的自定义 class。

字段类型说明
rootClassValue根容器 class。
sidebarRootClassValue侧边栏外层 class。
sidebarWrapperClassValue侧边栏定位包裹层 class。
sidebarClassValue侧边栏主体 class。
sidebarGapHandlerClassValue侧边栏占位区域 class。
mobileRootClassValue移动端抽屉根容器 class。
mobileClassValue移动端侧栏内容 class。
railClassValue触发轨道 class。
triggerClassValue触发按钮 class。
mainClassValue主内容区域 class。
headerClassValue头部区域 class。
tabClassValue页签区域 class。
footerClassValue页脚区域 class。

LayoutSidebarRenderFn

侧边栏渲染函数

(props: LayoutSidebarChildrenProps) => ReactNode

LayoutRootRenderFn

根布局渲染函数

(props: { open: boolean }) => ReactNode

LayoutSlots

Layout 可配置 ui 的内置 slot

'root' | 'sidebarRoot' | 'sidebarWrapper' | 'sidebar' | 'sidebarGapHandler' | 'mobileRoot' | 'mobileOverlay' | 'mobile' | 'rail' | 'trigger' | 'main' | 'header' | 'tab' | 'footer'

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page