Skip to content

Offcanvas

The Offcanvas component provides a sidebar panel that slides in from the edge of the viewport. It supports left/right/top/bottom placement, <Teleport>, ESC dismiss, and backdrop interactions.

Basic Usage

Control the offcanvas visibility via v-model. By default, it slides in from the right (end).

vue
<script setup lang="ts">
import { ref } from 'vue'
const visible = ref(false)
</script>

<template>
  <button class="btn btn-primary" @click="visible = true">Open Offcanvas</button>
  <TOffcanvas v-model="visible" title="Basic Offcanvas">
    <p>Offcanvas content</p>
  </TOffcanvas>
</template>

Four Placements

Use the placement prop to control from which edge the offcanvas slides in: start (left), end (right, default), top, or bottom.

vue
<template>
  <TOffcanvas v-model="visible" title="Left" placement="start" />
  <TOffcanvas v-model="visible" title="Right" placement="end" />
  <TOffcanvas v-model="visible" title="Top" placement="top" />
  <TOffcanvas v-model="visible" title="Bottom" placement="bottom" />
</template>

Without Backdrop

Set :backdrop="false" to remove the backdrop overlay. The background content remains interactive.

vue
<TOffcanvas v-model="visible" title="No Backdrop" :backdrop="false">
  <template #footer>
    <button class="btn btn-primary" @click="visible = false">Close</button>
  </template>
</TOffcanvas>

Form Content

Place form elements inside the offcanvas body and use the #footer slot for action buttons.

Show Code
vue
<TOffcanvas v-model="visible" title="Login">
  <div class="mb-3">
    <label class="form-label">Username</label>
    <input v-model="username" type="text" class="form-control">
  </div>
  <template #footer>
    <button class="btn btn-primary ms-auto" @click="visible = false">Submit</button>
  </template>
</TOffcanvas>

API

Props

PropTypeDefaultDescription
modelValuebooleanfalsev-model binding, controls visibility
placement'start' | 'end' | 'top' | 'bottom''end'Slide-in direction
titlestringOffcanvas title
closablebooleantrueShow close button
closeOnBackdropboolean | 'static'trueClose on backdrop click; 'static' prevents closing
closeOnEscbooleantrueClose on ESC key press
backdropbooleantrueShow backdrop overlay
scrollbooleanfalseAllow body scrolling when open
teleportTostring'body'Teleport target selector

Slots

NameDescription
defaultOffcanvas body content
titleCustom title area
headerCustom entire header (replaces default title + close button)
footerFooter action bar (with border-top)

Emits

EventPayloadDescription
update:modelValue(value: boolean)v-model update
openFires when offcanvas starts opening
openedFires after open transition completes
closeFires when offcanvas starts closing
closedFires after close transition completes