div.container
	div.form
		div.input-group
			label Card Number
			input(type="text").js-card-number
		div.input-group
			label Card Name
			input(type="text").js-card-name
		div.input-group
			label Expire Date
			input(type="text").js-card-expire-date
	div.card
		div.chip
		div.card-informations
			div.card-numbers
				p.card-letter.card-number.first4 ••••
				p.card-letter.card-number.second4 ••••
				p.card-letter.card-number.third4 ••••
				p.card-letter.card-number.fourth4 ••••
			div.card-information
				div.card-date-expire
					p.date-expire__title Expires end
					p.card-letter.date-expire__date ••/••
				p.card-letter.card-name •••••••
			div.logo
				img(src="", alt="")
View Compiled
@import url('https://fonts.googleapis.com/css?family=Cutive+Mono|Rationale');
*{
	box-sizing: border-box;
}
body,html{
	height: 100%;
	background-color: #eee;
}
.container{
	display: flex;
	justify-content: center;
	padding: 3rem 2rem;
	width: 80%;
	margin: 0 auto;
}

.form{
	margin-right: 5rem;	
}
.input-group{
	width: 100%;
	display:flex;
	flex-direction: column;
	margin: .5rem;
}

.card{
	background: linear-gradient(to bottom right,#2C3E50,#7f8c8d);
	color: #ECECEC;
	width:  8.5cm;
	height: 5.4cm;
	border-radius: 10px;
	padding: .8cm .8cm .4cm;
}

.chip{
	width: 1.1cm;
	height: .8cm;
	margin-top: 1cm;
	margin-bottom: .3cm;
	border: 1px solid gold;
	border-radius: 5px;
}
.card-informations{
	display: flex;
	flex-wrap: wrap;
}

.card-numbers{
	font-family: 'Rationale', sans-serif;
	font-size: 18.90px;
	height: 18.90px;
	letter-spacing: 3.77px;
	width: 6.8cm;
	display: flex;
	justify-content: space-between;
	margin-bottom: .4cm;
}

.card-information{
	font-family: 'Cutive Mono', monospace;
	display: flex;
	flex-direction: column;
	font-size: .73rem;
}

.card-letter{
	font-weight: bold;
	text-transform: uppercase;
}

.card-date-expire{
	display: flex;
    align-self: center;
    flex-direction: row;
    align-items: center;
}
.card-date-expire > p{
	display: inline-block;
}
.date-expire__title{
	font-family: 'Arial', sans-serif;
	font-size: .24375rem;
	margin-right: 5px;
	width: 20px;
	text-align: right;
}

.card-name{
	letter-spacing: 1px;
}

.logo{
	width: 20%;
	height: 40px;
	margin-left: auto;
}

.logo img{
	width: 100%;
}
const $cardNumber = document.querySelector(".js-card-number");
const $cardName = document.querySelector(".js-card-name");
const $cardExpireDate = document.querySelector(".js-card-expire-date");
const $logoImg = document.querySelector('.logo img')

const setTextOnElement = (element, text) => (element.textContent = text);
const setLogo = urlLogo => $logoImg.src = urlLogo

const logosUrl = {
	master: 'https://seeklogo.com/images/M/MasterCard-logo-4C5D228602-seeklogo.com.png',
	visa: 'https://upload.wikimedia.org/wikipedia/commons/5/5e/Visa_Inc._logo.svg'
}

const handleCardNumber = event => {
	const number = event.target.value
	const arrayOfNumbersBy4 = number.split(" ").map(number => number.substr(0,4));
	const arrayLenght = arrayOfNumbersBy4.length;

	/* Elems */
	const $first4 = document.querySelector(".first4");
	const $second4 = document.querySelector(".second4");
	const $third4 = document.querySelector(".third4");
	const $fourth4 = document.querySelector(".fourth4");

	const resetNumbers = () => {
		setTextOnElement($first4, 9999);
		setTextOnElement($second4, 9999);
		setTextOnElement($third4, 9999);
		setTextOnElement($fourth4, 9999);
	};
	if (arrayLenght === 1 && !arrayOfNumbersBy4[0]) {
		resetNumbers();
		return;
	}
	
	debugger
	if (arrayLenght === 1) {
		setTextOnElement($first4, arrayOfNumbersBy4[0]);
		if(arrayOfNumbersBy4[0] == 4){
			setLogo(logosUrl.visa)
		}
	} else if (arrayLenght === 2) {
		setTextOnElement($first4, arrayOfNumbersBy4[0]);
		setTextOnElement($second4, arrayOfNumbersBy4[1]);
		const firstNumber = arrayOfNumbersBy4[0].charAt(0)
		const secondNumber = arrayOfNumbersBy4[0].charAt(1)
		
		if(
			(firstNumber == 5 && (secondNumber >= 1 && secondNumber <=5)) || (firstNumber == 2 && (secondNumber >= 2 && secondNumber <=7))
		) {
			setLogo(logosUrl.master)
		}
		/*
		First digit must be 5 and second digit must be in the range 1 through 5 inclusive. The range is 510000 through 559999.

First digit must be 2 and second digit must be in the range 2 through 7 inclusive. The range is 222100 through 272099.
		*/
	} else if (arrayLenght === 3) {
		setTextOnElement($first4, arrayOfNumbersBy4[0]);
		setTextOnElement($second4, arrayOfNumbersBy4[1]);
		setTextOnElement($third4, arrayOfNumbersBy4[2]);
	} else if (arrayLenght === 4) {
		setTextOnElement($first4, arrayOfNumbersBy4[0]);
		setTextOnElement($second4, arrayOfNumbersBy4[1]);
		setTextOnElement($third4, arrayOfNumbersBy4[2]);
		setTextOnElement($fourth4, arrayOfNumbersBy4[3]);
	}
};

const handleCardName = event => {
	const regexValidation = /[A-Za-z]/gi
	if(!regexValidation.test(event.key)) event.preventDefault()
	
	const text = event.target.value	
	const $cardField = document.querySelector('.card-name')
		
	setTextOnElement($cardField,text)
}

const handleExpireDate = event =>{
	const $dateField = document.querySelector('.date-expire__date') 
	console.log($dateField)
	const date = event.target.value
	setTextOnElement($dateField,date)
}


VMasker($cardNumber).maskPattern("9999 9999 9999 9999");
VMasker($cardExpireDate).maskPattern("99/99");

$cardNumber.addEventListener("keyup", handleCardNumber);
$cardExpireDate.addEventListener("keydown", handleExpireDate);
$cardName.addEventListener('keyup',handleCardName)
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://unpkg.com/vanilla-masker@1.1.1/build/vanilla-masker.min.js