Skip to content

Sheet

Slide-over panel that slides in from the edge of the screen.

Installation

bash
npx @galaxy-stack/nebula-cli add sheet
bash
npx @galaxy-stack/nebula-cli add sheet
bash
npx @galaxy-stack/nebula-cli add sheet
bash
# If you have installed galaxy-design globally
galaxy-design add sheet

Usage

tsx
import {
  Sheet,
  SheetContent,
  SheetDescription,
  SheetHeader,
  SheetTitle,
  SheetTrigger,
} from '@/components/sheet'

export default function SheetDemo() {
  return (
    <Sheet>
      <SheetTrigger asChild>
        <Button variant="outline">Open</Button>
      </SheetTrigger>
      <SheetContent>
        <SheetHeader>
          <SheetTitle>Edit profile</SheetTitle>
          <SheetDescription>
            Make changes to your profile here. Click save when you're done.
          </SheetDescription>
        </SheetHeader>
        <div className="grid gap-4 py-4">
          <div className="grid grid-cols-4 items-center gap-4">
            <Label htmlFor="name" className="text-right">
              Name
            </Label>
            <Input id="name" value="Pedro Duarte" className="col-span-3" />
          </div>
        </div>
      </SheetContent>
    </Sheet>
  )
}
vue
<script setup lang="ts">
import { ref } from 'vue'
import { Sheet } from '@/components/sheet'
import { Button } from '@/components/button'

const open = ref(false)
</script>

<template>
  <Sheet v-model:open="open">
    <Button variant="outline" @click="open = true">Open</Button>
    <template #content>
      <div class="p-6">
        <h2 class="text-lg font-semibold">Edit profile</h2>
        <p class="text-sm text-muted-foreground">
          Make changes to your profile here.
        </p>
      </div>
    </template>
  </Sheet>
</template>

API Reference

Props

PropTypeDefaultDescriptionFrameworks
openbooleanundefinedControlled open stateAll
defaultOpenbooleanfalseInitial open stateAll
onOpenChange(open: boolean) => void-Called when open state changesAll
modalbooleantrueWhether interaction outside is disabledAll
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

Subcomponents

SheetTrigger

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

SheetContent

PropTypeDefaultDescriptionFrameworks
side'top' | 'bottom' | 'left' | 'right''right'Side to slide in fromAll
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

SheetHeader

PropTypeDefaultDescriptionFrameworks
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

SheetTitle

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

SheetDescription

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

SheetFooter

PropTypeDefaultDescriptionFrameworks
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

SheetClose

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

Examples

Different Sides

tsx
<Sheet>
  <SheetContent side="top">Content from top</SheetContent>
</Sheet>

<Sheet>
  <SheetContent side="left">Content from left</SheetContent>
</Sheet>

Accessibility

  • Focus trap when open
  • Escape key closes the sheet
  • Backdrop click closes the sheet
  • Proper ARIA labels

Author

Bùi Trọng Hiếu (kevinbui)

License

MIT © 2025 Bùi Trọng Hiếu (kevinbui)

Released under the MIT License.