overlays

Slideover

Display a dialog that slides in from the edge of the screen.

Usage

Use a v-model to control the Slideover state.

<script setup>
const isOpen = ref(false)
</script>

<template>
  <div>
    <UButton label="Open" @click="isOpen = true" />

    <USlideover v-model="isOpen">
      <!-- Content -->
    </USlideover>
  </div>
</template>

You can put a Card component inside your Slideover to handle forms and take advantage of header and footer slots:

<script setup>
const isOpen = ref(false)
</script>

<template>
  <div>
    <UButton label="Open" @click="isOpen = true" />

    <USlideover v-model="isOpen">
      <UCard class="flex flex-col flex-1" :ui="{ body: { base: 'flex-1' }, ring: '', divide: 'divide-y divide-gray-100 dark:divide-gray-800' }">
        <template #header>
          <!-- Content -->
        </template>

        <!-- Content -->

        <template #footer>
          <!-- Content -->
        </template>
      </UCard>
    </USlideover>
  </div>
</template>

Disable overlay

Set the overlay prop to false to disable it.

<script setup>
const isOpen = ref(false)
</script>

<template>
  <div>
    <UButton label="Open" @click="isOpen = true" />

    <USlideover v-model="isOpen" :overlay="false">
      <div class="p-4 flex-1">
        <Placeholder class="h-full" />
      </div>
    </USlideover>
  </div>
</template>

Disable transition

Set the transition prop to false to disable it.

<script setup>
const isOpen = ref(false)
</script>

<template>
  <div>
    <UButton label="Open" @click="isOpen = true" />

    <USlideover v-model="isOpen" :transition="false">
      <div class="p-4 flex-1">
        <Placeholder class="h-full" />
      </div>
    </USlideover>
  </div>
</template>

Prevent close

Use the prevent-close prop to disable the outside click alongside the esc keyboard shortcut.

<script setup>
const isOpen = ref(false)
</script>

<template>
  <div>
    <UButton label="Open" @click="isOpen = true" />

    <USlideover v-model="isOpen" prevent-close>
      <UCard class="flex flex-col flex-1" :ui="{ body: { base: 'flex-1' }, ring: '', divide: 'divide-y divide-gray-100 dark:divide-gray-800' }">
        <template #header>
          <div class="flex items-center justify-between">
            <h3 class="text-base font-semibold leading-6 text-gray-900 dark:text-white">
              Slideover
            </h3>
            <UButton color="gray" variant="ghost" icon="i-heroicons-x-mark-20-solid" class="-my-1" @click="isOpen = false" />
          </div>
        </template>

        <Placeholder class="h-full" />
      </UCard>
    </USlideover>
  </div>
</template>

You can still handle the esc shortcut yourself by using our defineShortcuts composable.

<script setup>
const isOpen = ref(false)

defineShortcuts({
  escape: {
    usingInput: true,
    whenever: [isOpen],
    handler: () => { isOpen.value = false }
  }
})
</script>

Props

ui
any
undefined
side
"left" | "right"
"right"
transition
boolean
true
modelValue
boolean
false
appear
boolean
false
overlay
boolean
true
preventClose
boolean
false

Preset

USlideover.vue
{
  "wrapper": "fixed inset-0 flex z-50",
  "overlay": {
    "base": "fixed inset-0 transition-opacity",
    "background": "bg-gray-200/75 dark:bg-gray-800/75",
    "transition": {
      "enter": "ease-in-out duration-500",
      "enterFrom": "opacity-0",
      "enterTo": "opacity-100",
      "leave": "ease-in-out duration-500",
      "leaveFrom": "opacity-100",
      "leaveTo": "opacity-0"
    }
  },
  "base": "relative flex-1 flex flex-col w-full focus:outline-none",
  "background": "bg-white dark:bg-gray-900",
  "ring": "",
  "rounded": "",
  "padding": "",
  "shadow": "shadow-xl",
  "width": "w-screen max-w-md",
  "transition": {
    "enter": "transform transition ease-in-out duration-300",
    "leave": "transform transition ease-in-out duration-200"
  }
}