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.