Vuetify is a popular UI framework for Vue apps.
In this article, we’ll look at how to work with the Vuetify framework.
Inset Bottom Sheet
A bottom sheet can be inset, so that the maximum width on the desktop is 70%.
It can be reduced more with the width
prop.
For example, we can write:
<template>
<v-container>
<v-row class="text-center">
<v-col col="12">
<div class="text-center">
<v-bottom-sheet v-model="sheet" inset>
<template v-slot:activator="{ on, attrs }">
<v-btn color="orange" dark v-bind="attrs" v-on="on">Open Inset</v-btn>
</template>
<v-sheet class="text-center" height="200px">
<v-btn class="mt-6" text color="error" @click="sheet = !sheet">close</v-btn>
<div class="my-3">Lorem ipsum</div>
</v-sheet>
</v-bottom-sheet>
</div>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
sheet: false,
}),
};
</script>
We add the inset
prop to reduce the width of the bottom sheet.
Music Player
The bottom sheet can be used to display a music player.
For example, we can write:
<template>
<v-container>
<v-row class="text-center">
<v-col col="12">
<div class="text-center">
<v-bottom-sheet inset>
<template v-slot:activator="{ on, attrs }">
<v-btn color="red" dark v-bind="attrs" v-on="on">Open Player</v-btn>
</template>
<v-card tile>
<v-progress-linear :value="50" class="my-0" height="3"></v-progress-linear>
<v-list>
<v-list-item>
<v-list-item-content>
<v-list-item-title>Violin Sonata No. 9 in A Major, Op. 47</v-list-item-title>
<v-list-item-subtitle>Ludwig van Beethoven</v-list-item-subtitle>
</v-list-item-content>
<v-spacer></v-spacer>
<v-list-item-icon>
<v-btn icon>
<v-icon>mdi-rewind</v-icon>
</v-btn>
</v-list-item-icon>
<v-list-item-icon :class="{ 'mx-5': $vuetify.breakpoint.mdAndUp }">
<v-btn icon>
<v-icon>mdi-pause</v-icon>
</v-btn>
</v-list-item-icon>
<v-list-item-icon class="ml-0" :class="{ 'mr-3': $vuetify.breakpoint.mdAndUp }">
<v-btn icon>
<v-icon>mdi-fast-forward</v-icon>
</v-btn>
</v-list-item-icon>
</v-list-item>
</v-list>
</v-card>
</v-bottom-sheet>
</div>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
sheet: false,
}),
};
</script>
We have the v-card
inside the v-bottom-sheet
which is used as the container for our content.
v-list
inside the v-card
hs the text.
v-list-item-content
has the title and subtitle.
And the v-list-item-icon
has the rewind, pause, and fast forward buttons.
Open in List
We can show a list in a bottom sheet.
For example, we can write:
<template>
<v-container>
<v-row class="text-center">
<v-col col="12">
<div class="text-center">
<v-bottom-sheet v-model="sheet">
<template v-slot:activator="{ on, attrs }">
<v-btn color="purple" dark v-bind="attrs" v-on="on">Open In</v-btn>
</template>
<v-list>
<v-subheader>Open in</v-subheader>
<v-list-item v-for="tile in tiles" :key="tile.title" @click="sheet = false">
<v-list-item-avatar>
<v-avatar size="32px" tile>
<img
:src="`https://cdn.vuetifyjs.com/images/bottom-sheets/${tile.img}`"
:alt="tile.title"
/>
</v-avatar>
</v-list-item-avatar>
<v-list-item-title>{{ tile.title }}</v-list-item-title>
</v-list-item>
</v-list>
</v-bottom-sheet>
</div>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
sheet: false,
tiles: [
{ img: "keep.png", title: "Keep" },
{ img: "inbox.png", title: "Inbox" },
{ img: "hangouts.png", title: "Hangouts" },
{ img: "messenger.png", title: "Messenger" },
{ img: "google.png", title: "Google+" },
],
}),
};
</script>
We have the tiles
which are rendered as v-list-item
s in a v-list
.
The v-list
is in the v-bottom-sheet
.
So we see the list displayed when we open the bottom sheet.
Conclusion
We can have any content in our bottom sheet.