Skip to content

Sheet 抽屉 ​

新粗野主义风格的侧边面板组件,可从任意边缘滑入。基于 reka-ui 的 Dialog 原语构建。

预览 ​

Preview

安装 ​

pnpm dlx brutx-vue@latest add sheet

用法 ​

vue
<script setup>
import { DialogRoot as Sheet, DialogTrigger as SheetTrigger, DialogClose as SheetClose } from 'reka-ui'
import {
    SheetContent,
    SheetHeader,
    SheetFooter,
    SheetTitle,
    SheetDescription,
    Button,
} from 'brutx-ui-vue'
</script>

<template>
    <Sheet>
        <SheetTrigger as-child>
            <Button variant="outline">Open Sheet</Button>
        </SheetTrigger>
        <SheetContent side="right">
            <SheetHeader>
                <SheetTitle>Edit Profile</SheetTitle>
                <SheetDescription>
                    Make changes to your profile here.
                </SheetDescription>
            </SheetHeader>
            <div class="py-4">
                <p class="text-sm">Sheet content goes here.</p>
            </div>
            <SheetFooter>
                <SheetClose as-child>
                    <Button variant="outline">Cancel</Button>
                </SheetClose>
                <Button variant="primary">Save</Button>
            </SheetFooter>
        </SheetContent>
    </Sheet>
</template>

方向变体 ​

方向说明
top从顶部滑入
bottom从底部滑入
left从左侧滑入(最大 sm:max-w-sm)
right从右侧滑入(默认,最大 sm:max-w-sm)
vue
<script setup>
import { DialogRoot as Sheet, DialogTrigger as SheetTrigger } from 'reka-ui'
import { SheetContent, Button } from 'brutx-ui-vue'
</script>

<template>
    <Sheet>
        <SheetTrigger as-child>
            <Button>Open Left Sheet</Button>
        </SheetTrigger>
        <SheetContent side="left">
            <p>Content slides in from the left.</p>
        </SheetContent>
    </Sheet>
</template>

子组件 ​

组件说明
Sheet根原语(从 reka-ui 导入 DialogRoot 并命名为 Sheet)
SheetTrigger触发原语(从 reka-ui 导入 DialogTrigger)
SheetPortal传送容器原语(从 reka-ui 导入 DialogPortal)
SheetContent带方向变体的面板内容,内置关闭按钮
SheetHeader头部容器
SheetFooter底部容器
SheetTitle带样式的面板标题,包装 Reka UI DialogTitle
SheetDescription带样式的面板描述,包装 Reka UI DialogDescription
SheetClose关闭原语(从 reka-ui 导入 DialogClose)

Reka UI 原语 ​

Sheet、SheetTrigger、SheetPortal 和 SheetClose 分别是从 reka-ui 导入的 DialogRoot、DialogTrigger、DialogPortal 和 DialogClose 的本地别名。下方生成 API 中的五个样式组件从 BrutxUI 导入。

Sheet 使用布尔值 open 和 v-model:open 控制打开状态,通过 update:open 发出新的布尔状态。defaultOpen 设置非受控初始状态,默认 false;modal 默认 true。默认插槽用于放置触发器与面板,并提供当前 open 状态和 close() 方法。

SheetContent 将其他属性和事件监听器传给 DialogContent。例如 openAutoFocus 可在模板中使用 @open-auto-focus 监听。内置关闭按钮使用 sheet.close 本地化文本;side="left" 时位于左上角,其余方向位于右上角。

API 参考 ​

SheetContent

SheetContent — 属性
名称类型默认值说明
side
"bottom" | "left" | "right" | "top" | undefined
"right"
面板从视口哪一侧滑入,控制定位、边框与过渡方向;left 时内置关闭按钮位于左上角,其余方向位于右上角。
详情

声明类型

NonNullable<"right" | "bottom" | "left" | "top" | null | undefined> | undefined

字面量

  • "bottom"
  • "left"
  • "right"
  • "top"

默认值详情

解析值
"right"

来源

SheetContent.vue:25

packages/ui/src/components/sheet/SheetContent.vue

class
string | undefined
undefined
合并到浮动内容面板的 CSS 类;其余属性和监听器通过 $attrs 传给 Reka UI DialogContent。
详情

声明类型

string | undefined

默认值详情

解析值
undefined

来源

SheetContent.vue:26

packages/ui/src/components/sheet/SheetContent.vue

SheetContent — 事件
名称签名或类型说明
@openAutoFocus
[event: Event]
通过 $attrs 转发的 Reka UI 事件,在内容打开时准备自动聚焦时触发,可调用 preventDefault() 接管聚焦。
详情

声明类型

[event: Event]

来源

SheetContent.vue:61

packages/ui/src/components/sheet/SheetContent.vue

@closeAutoFocus
[event: Event]
通过 $attrs 转发的 Reka UI 事件,在内容关闭时准备恢复焦点时触发,可阻止默认聚焦。
详情

声明类型

[event: Event]

来源

SheetContent.vue:61

packages/ui/src/components/sheet/SheetContent.vue

@interactOutside
[event: PointerDownOutsideEvent | FocusOutsideEvent]
通过 $attrs 转发的 Reka UI 事件,在面板外发生指针按下或焦点交互时触发,可阻止由该交互引起的关闭。
详情

声明类型

[event: PointerDownOutsideEvent | FocusOutsideEvent]

来源

SheetContent.vue:61

packages/ui/src/components/sheet/SheetContent.vue

@escapeKeyDown
[event: KeyboardEvent]
通过 $attrs 转发的 Reka UI 事件,在顶层面板收到 Escape 按键时触发,可阻止默认关闭。
详情

声明类型

[event: KeyboardEvent]

来源

SheetContent.vue:61

packages/ui/src/components/sheet/SheetContent.vue

@pointerDownOutside
[event: PointerDownOutsideEvent]
通过 $attrs 转发的 Reka UI 事件,在面板外按下指针时触发,可阻止默认关闭。
详情

声明类型

[event: PointerDownOutsideEvent]

来源

SheetContent.vue:61

packages/ui/src/components/sheet/SheetContent.vue

@focusOutside
[event: FocusOutsideEvent]
通过 $attrs 转发的 Reka UI 事件,在焦点移到面板外时触发,可阻止该外部交互的默认处理。
详情

声明类型

[event: FocusOutsideEvent]

来源

SheetContent.vue:61

packages/ui/src/components/sheet/SheetContent.vue

SheetContent — 插槽
名称签名或类型说明
#default
{}
面板主体,可组合 SheetHeader、内容区域与 SheetFooter;本地化的内置关闭按钮位于内容之后。
详情

声明类型

{}

来源

SheetContent.vue

packages/ui/src/components/sheet/SheetContent.vue

SheetDescription

SheetDescription — 属性
名称类型默认值说明
class
string | undefined
—
合并到 Reka UI 描述原语的 CSS 类,默认使用辅助说明文字样式。
详情

声明类型

string | undefined

默认值详情

未声明默认值
—

来源

SheetDescription.vue:8

packages/ui/src/components/sheet/SheetDescription.vue

SheetDescription — 插槽
名称签名或类型说明
#default
{}
面板的辅助说明,用于无障碍描述关联;插槽没有有效内容时不渲染描述元素。
详情

声明类型

{}

来源

SheetDescription.vue

packages/ui/src/components/sheet/SheetDescription.vue

SheetFooter

SheetFooter — 属性
名称类型默认值说明
class
string | undefined
—
合并到面板底部操作区的 CSS 类。
详情

声明类型

string | undefined

默认值详情

未声明默认值
—

来源

SheetFooter.vue:7

packages/ui/src/components/sheet/SheetFooter.vue

SheetFooter — 插槽
名称签名或类型说明
#default
{}
底部按钮或其他操作内容。
详情

声明类型

{}

来源

SheetFooter.vue

packages/ui/src/components/sheet/SheetFooter.vue

SheetHeader

SheetHeader — 属性
名称类型默认值说明
class
string | undefined
—
合并到面板头部容器的 CSS 类。
详情

声明类型

string | undefined

默认值详情

未声明默认值
—

来源

SheetHeader.vue:7

packages/ui/src/components/sheet/SheetHeader.vue

SheetHeader — 插槽
名称签名或类型说明
#default
{}
面板标题、描述与其他头部内容。
详情

声明类型

{}

来源

SheetHeader.vue

packages/ui/src/components/sheet/SheetHeader.vue

SheetTitle

SheetTitle — 属性
名称类型默认值说明
class
string | undefined
—
合并到 Reka UI 标题原语的 CSS 类,默认使用粗体标题样式。
详情

声明类型

string | undefined

默认值详情

未声明默认值
—

来源

SheetTitle.vue:8

packages/ui/src/components/sheet/SheetTitle.vue

SheetTitle — 插槽
名称签名或类型说明
#default
{}
面板标题,用于无障碍名称关联;插槽没有有效内容时不渲染标题元素。
详情

声明类型

{}

来源

SheetTitle.vue

packages/ui/src/components/sheet/SheetTitle.vue

可访问性 ​

  • 键盘操作:支持 Escape 关闭面板
  • ARIA 属性:自动管理 aria-labelledby(关联 SheetTitle)、aria-describedby(关联 SheetDescription)
  • 焦点管理:打开时焦点锁定在面板内,关闭时恢复焦点到触发器

蛮力铸就。