--- description: A drawer that smoothly slides in & out of the screen. category: overlay links: - label: Drawer icon: i-custom-reka-ui to: https://github.com/unovue/vaul-vue - label: GitHub icon: i-simple-icons-github to: https://github.com/nuxt/ui/tree/v3/src/runtime/components/Drawer.vue --- ## Usage Use a [Button](/components/button) or any other component in the default slot of the Drawer. Then, use the `#content` slot to add the content displayed when the Drawer is open. ::component-code --- prettier: true slots: default: | content: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #content :placeholder{class="h-48 m-4"} :: You can also use the `#header`{lang="ts-type"}, `#body`{lang="ts-type"} and `#footer`{lang="ts-type"} slots to customize the Drawer's content. ### Title Use the `title` prop to set the title of the Drawer's header. ::component-code --- prettier: true props: title: 'Drawer with title' slots: default: | body: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #body :placeholder{class="h-48"} :: ### Description Use the `description` prop to set the description of the Drawer's header. ::component-code --- prettier: true ignore: - title props: title: 'Drawer with description' description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' slots: default: | body: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #body :placeholder{class="h-48"} :: ### Direction Use the `direction` prop to control the direction of the Drawer. Defaults to `bottom`. ::component-code --- prettier: true props: direction: 'right' slots: default: | content: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #content :placeholder{class="min-w-96 min-h-96 size-full m-4"} :: ### Inset Use the `inset` prop to inset the Drawer from the edges. ::component-code --- prettier: true props: direction: 'right' inset: true slots: default: | content: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #content :placeholder{class="min-w-96 min-h-96 size-full m-4"} :: ### Handle Use the `handle` prop to control whether the Drawer has a handle or not. Defaults to `true`. ::component-code --- prettier: true props: handle: false slots: default: | content: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #content :placeholder{class="h-48 m-4"} :: ### Overlay Use the `overlay` prop to control whether the Drawer has an overlay or not. Defaults to `true`. ::component-code --- prettier: true props: overlay: false slots: default: | content: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #content :placeholder{class="h-48 m-4"} :: ### Scale background Use the `should-scale-background` prop to scale the background when the Drawer is open, creating a visual depth effect. ::component-code --- prettier: true props: shouldScaleBackground: true slots: default: | content: | --- :u-button{label="Open" color="neutral" variant="subtle" trailing-icon="i-lucide-chevron-up"} #content :placeholder{class="h-screen m-4"} :: ::warning Make sure to add the `vaul-drawer-wrapper` directive to a parent element of your app to make this work. ```vue [app.vue] ``` ```ts [nuxt.config.ts] export default defineNuxtConfig({ app: { rootAttrs: { 'vaul-drawer-wrapper': '', 'class': 'bg-(--ui-bg)' } } }) ``` :: ## Examples ### Control open state You can control the open state by using the `default-open` prop or the `v-model:open` directive. ::component-example --- prettier: true name: 'drawer-open-example' --- :: ::note In this example, leveraging [`defineShortcuts`](/composables/define-shortcuts), you can toggle the Drawer by pressing :kbd{value="O"}. :: ::tip This allows you to move the trigger outside of the Drawer or remove it entirely. :: ### Prevent closing Set the `dismissible` prop to `false` to prevent the Drawer from being closed when clicking outside of it or pressing escape. ::component-example --- prettier: true name: 'drawer-dismissible-example' --- :: ::note In this example, the `header` slot is used to add a close button which is not done by default. :: ### With footer slot Use the `#footer` slot to add content after the Drawer's body. ::component-example --- prettier: true collapse: true name: 'drawer-footer-slot-example' --- :: ### With command palette You can use a [CommandPalette](/components/command-palette) component inside the Drawer's content. ::component-example --- collapse: true name: 'drawer-command-palette-example' --- :: ## API ### Props :component-props ### Slots :component-slots ### Emits :component-emits ## Theme :component-theme