Modal Login Form

Create a <ModalLoginForm> component with <VueFinalModal> and TailwindCSS.

A example that use form component in vue-final-modal.

This example use Vorms to handle the form validate.

Preview

Preview.vue
<script setup lang="ts">
import { ModalsContainer, useModal } from 'vue-final-modal'
import ModalLoginForm from './ModalLoginForm.vue'
const { open, close } = useModal({
component: ModalLoginForm,
attrs: {
onSubmit(formData) {
alert(JSON.stringify(formData, null, 2))
close()
},
},
})
</script>
<template>
<VButton @click="open">
Open Modal
</VButton>
<ModalsContainer />
</template>

<ModalLoginForm> component

ModalLoginForm.vue
<script setup lang="ts">
import { VueFinalModal } from 'vue-final-modal'
import type { FormData } from './LoginFormVorms.vue'
import LoginFormVorms from './LoginFormVorms.vue'
const emit = defineEmits<{
(e: 'submit', formData: FormData): void
}>()
</script>
<template>
<VueFinalModal
class="flex justify-center items-center"
content-class="relative p-4 rounded-lg bg-white dark:bg-gray-900"
content-transition="vfm-fade"
overlay-transition="vfm-fade"
>
<LoginFormVorms @submit="formData => emit('submit', formData)" />
</VueFinalModal>
</template>

<LoginFormVorms> component

LoginFormVorms.vue
<script setup lang="ts">
import { useForm } from '@vorms/core'
export type FormData = {
account: string
password: string
remember: boolean
}
const emit = defineEmits<{
(e: 'submit', formData: FormData): void
}>()
const { register, errors, handleSubmit } = useForm({
initialValues: {
account: '',
password: '',
remember: false,
},
onSubmit(values) {
emit('submit', values)
},
})
const { value: account, attrs: accountAttrs } = register('account', {
validate(value) {
if (!value)
return 'account is required!'
},
})
const { value: password, attrs: passwordAttrs } = register('password')
const { value: remember, attrs: rememberAttrs } = register('remember')
</script>
<template>
<h1 class="text-2xl mb-4">Login</h1>
<form @submit="handleSubmit">
<div class="field">
<input
v-model="account"
class="field__input"
type="text"
placeholder="Account"
v-bind="accountAttrs"
>
<div v-show="'account' in errors" class="field__error">
{{ errors.account }}
</div>
</div>
<div class="field">
<input
v-model="password"
class="field__input"
type="password"
placeholder="Password"
v-bind="passwordAttrs"
>
</div>
<div class="field checkbox">
<input
id="remember"
v-model="remember"
class="field__checkbox"
type="checkbox"
v-bind="rememberAttrs"
>
<label for="remember">remember</label>
</div>
<div class="field">
<input type="submit" value="Submit">
</div>
</form>
</template>
<style>
.field + .field {
margin-top: 15px;
}
.field__input,
input[type='submit'] {
box-sizing: border-box;
width: 100%;
border-radius: 4px;
border: 1px solid white;
padding: 4px 16px 4px 4px;
}
.field__error {
color: red;
margin-top: 2px;
}
.checkbox {
display: flex;
align-items: center;
}
.field__checkbox {
accent-color: #41b883;
}
.field__checkbox + label {
margin-left: 4px;
}
input[type='submit'] {
background: #41b883;
border: 1px solid #41b883;
cursor: pointer;
}
</style>