--- 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"} :: ### Handle Only Use the `handle-only` prop to only allow the Drawer to be dragged by the handle. ::component-code --- prettier: true props: handleOnly: 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"} :: ### 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. You can set the `set-background-color-on-scale` prop to `false` to prevent changing the background color. ::component-code --- prettier: true props: shouldScaleBackground: true setBackgroundColorOnScale: 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 `data-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: { 'data-vaul-drawer-wrapper': '', 'class': 'bg-default' } } }) ``` :: ## 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. :: ### Disable dismissal 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 interactive background Set the `overlay` and `modal` props to `false` alongside the `dismissible` prop to make the Drawer's background interactive without closing the Drawer. ::component-example --- prettier: true name: 'drawer-modal-example' --- :: ### Responsive drawer You can render a [Modal](/components/modal) component on desktop and a Drawer on mobile for example. ::component-example --- prettier: true name: 'drawer-responsive-example' --- :: ### Nested drawers :badge{label="Soon" class="align-text-top"} You can nest drawers within each other by using the `nested` prop. ::component-example --- prettier: true name: 'drawer-nested-example' --- :: ### 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