Custom modal component for Nuxt 3.
- 🔧 Fully customizable (colors, functions, slots)
- 🤳🏻 Slides up on mobile
- ✨ Nice fade in/out
- ⚡ Setup in seconds
- ✅ Access modals from anywhere
Install the layer:
npm i -D nuxt-modalAdd the layer in the extends array in nuxt.config.ts:
export default defineNuxtConfig({
extends: ['nuxt-modal'],
})<template>
<NuxtModal v-model="isModalOpen">
<template v-slot:header>Inline Modal</template>
<template v-slot:content>
<p>This modal an inline modal, that doesn't need it's own component.</p>
</template>
</NuxtModal>
<button @click="openModal">Open</button>
</template>
<script>
const isModalOpen = ref(false)
const openModal = () => (isModalOpen.value = true)
</script><!-- components/ModalComponent.vue -->
<template>
<NuxtModal :name="name">
<template v-slot:header>Hello! 👋🏼</template>
<template v-slot:content>
<p>This is a simple nuxt-modal component</p>
</template>
<template v-slot:buttons>
<button @click="close">Cancel</button>
<button @click="close">Got it!</button>
</template>
</NuxtModal>
</template>
<script setup lang="ts">
const props = defineProps<{
name: string
}>()
const { close } = useModal(props.name)
</script><!-- app.vue -->
<template>
<ModalComponent :name="name" />
<button @click="modalComponent.open">Open</button>
</template>
<script>
const name = ref('myModal)
const modal = useModal(name.value)
</script>That's it, you've got a fully functional modal component in your project. Keep reading to customize the modal to suit your needs.
The main component used to display modals is NuxtModal. Here's the full default configuration:
<template>
<NuxtModal
v-model // boolean with visible value
:name="'modalName'"
:header="true"
:buttons="true"
:borders="true"
@close="modal.close()"
@proceed="modal.close()"
/>
</template>You can access your modals anywhere in your app as we store the data with useState().
Example
const { open, close, toggle, visible } = useModal('modalName')header: shown at the top of the modalcontent: main content of the modalbuttons: close/proceed buttons, if you don't add any we'll show a cancel & proceed button fallback
Example
<NuxtModal>
<template v-slot:header></template>
<template v-slot:content></template>
<template v-slot:buttons></template>
</NuxtModal>| Prop | Type | Default | Description |
|---|---|---|---|
v-model |
boolean |
false |
the visibility of the modal |
name |
string |
`` | (optional) the unique name of the modal |
header |
boolean |
true |
show/hide the modal header |
buttons |
boolean |
true |
show/hide the modal buttons |
borders |
boolean |
true |
show/hide the modal header & button borders |
Fired when the users clicks the cancel button, or the modal background.
Example
<NuxtModal @close="doSomething()" />Fired when the user accepts the modal. You can put any function in here to do something based on what the modal is for.
Example
<NuxtModal @proceed="doSomething()" />