Skip to content

Instantly share code, notes, and snippets.

@dgleba
Created January 2, 2022 17:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dgleba/79b1c8bb8f61fff75211df9c01e22134 to your computer and use it in GitHub Desktop.
Save dgleba/79b1c8bb8f61fff75211df9c01e22134 to your computer and use it in GitHub Desktop.
Login Form | Vue
<div id="app">
<div class="login-page">
<transition name="fade">
<div v-if="!registerActive" class="wallpaper-login"></div>
</transition>
<div class="wallpaper-register"></div>
<div class="container">
<div class="row">
<div class="col-lg-4 col-md-6 col-sm-8 mx-auto">
<div v-if="!registerActive" class="card login" v-bind:class="{ error: emptyFields }">
<h1>Sign In</h1>
<form class="form-group">
<input v-model="emailLogin" type="email" class="form-control" placeholder="Email" required>
<input v-model="passwordLogin" type="password" class="form-control" placeholder="Password" required>
<input type="submit" class="btn btn-primary" @click="doLogin">
<p>Don't have an account? <a href="#" @click="registerActive = !registerActive, emptyFields = false">Sign up here</a>
</p>
<p><a href="#">Forgot your password?</a></p>
</form>
</div>
<div v-else class="card register" v-bind:class="{ error: emptyFields }">
<h1>Sign Up</h1>
<form class="form-group">
<input v-model="emailReg" type="email" class="form-control" placeholder="Email" required>
<input v-model="passwordReg" type="password" class="form-control" placeholder="Password" required>
<input v-model="confirmReg" type="password" class="form-control" placeholder="Confirm Password" required>
<input type="submit" class="btn btn-primary" @click="doRegister">
<p>Already have an account? <a href="#" @click="registerActive = !registerActive, emptyFields = false">Sign in here</a>
</p>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
var app = new Vue({
el: "#app",
data: {
registerActive: false,
emailLogin: "",
passwordLogin: "",
emailReg: "",
passwordReg: "",
confirmReg: "",
emptyFields: false
},
methods: {
doLogin() {
if (this.emailLogin === "" || this.passwordLogin === "") {
this.emptyFields = true;
} else {
alert("You are now logged in");
}
},
doRegister() {
if (this.emailReg === "" || this.passwordReg === "" || this.confirmReg === "") {
this.emptyFields = true;
} else {
alert("You are now registered");
}
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>
p {
line-height: 1rem;
}
.card {
padding: 20px;
}
.form-group {
input {
margin-bottom: 20px;
}
}
.login-page {
align-items: center;
display: flex;
height: 100vh;
.wallpaper-login {
background: url(https://images.pexels.com/photos/32237/pexels-photo.jpg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260)
no-repeat center center;
background-size: cover;
height: 100%;
position: absolute;
width: 100%;
}
.fade-enter-active,
.fade-leave-active {
transition: opacity .5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.wallpaper-register {
background: url(https://images.pexels.com/photos/533671/pexels-photo-533671.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260)
no-repeat center center;
background-size: cover;
height: 100%;
position: absolute;
width: 100%;
z-index: -1;
}
h1 {
margin-bottom: 1.5rem;
}
}
.error {
animation-name: errorShake;
animation-duration: 0.3s;
}
@keyframes errorShake {
0% {
transform: translateX(-25px);
}
25% {
transform: translateX(25px);
}
50% {
transform: translateX(-25px);
}
75% {
transform: translateX(25px);
}
100% {
transform: translateX(0);
}
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment