.container
	//- h1 Dot digit input
	//- p Type the code that you received in your e-mail below:
	.inputs#inputs
		input(maxlength="2" placeholder="•" value="")
		input(maxlength="2" placeholder="•" value="")
		input(maxlength="2" placeholder="•" value="")
		input(maxlength="1" placeholder="•" value="")
View Compiled
@import url('https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700')

$fontsize: 60px //code
$placeholderColor: lighten(#3498db, 20%)

body
	background-color: #2980b9
	background-image: linear-gradient(45deg, darken(#2980b9, 10%), #3498db)
	background-size: 100%
	background-position: 0 0
	background-attachment: fixed
	padding: 10px
	height: 100vh
	color: #fff
	font-family: "Open Sans", sans-serif
	box-sizing: border-box
	overflow: hidden

input::-webkit-input-placeholder
	color: $placeholderColor !important
 
input:-moz-placeholder
	color: $placeholderColor !important  
 
input::-moz-placeholder  /* Firefox 19+ */
	color: $placeholderColor !important
 
input:-ms-input-placeholder  
	color: $placeholderColor !important

.container
	width: 90%
	height: 100vh
	margin: 0 auto
	display: flex
	flex-direction: column
	justify-content: center
	align-items: 	center
	p
		font-size: 24px
		font-weight: 100
	h1
		font-size: 32px
		font-weight: 600
	
.inputs
	input
		width: #{$fontsize/(3/2)+10}
		height: $fontsize
		line-height: 100%
		background-color: transparent
		border: 0
		outline: 0
		color: white
		font-size: $fontsize
		word-spacing: 0px
		overflow: hidden
		text-align: center

	
	
View Compiled
function processInput(holder){
	var elements = holder.children(), //taking the "kids" of the parent
			str = ""; //unnecesary || added for some future mods
	
	elements.each(function(e){ //iterates through each element
		var val = $(this).val().replace(/\D/,""), //taking the value and parsing it. Returns string without changing the value.
				focused = $(this).is(":focus"), //checks if the current element in the iteration is focused
				parseGate = false;
		
		val.length==1?parseGate=false:parseGate=true; 
			/*a fix that doesn't allow the cursor to jump 
			to another field even if input was parsed 
			and nothing was added to the input*/
		
		$(this).val(val); //applying parsed value.
		
		if(parseGate&&val.length>1){ //Takes you to another input
			var	exist = elements[e+1]?true:false; //checks if there is input ahead
			exist&&val[1]?( //if so then
				elements[e+1].disabled=false,
				elements[e+1].value=val[1], //sends the last character to the next input
				elements[e].value=val[0], //clears the last character of this input
				elements[e+1].focus() //sends the focus to the next input
			):void 0;
		} else if(parseGate&&focused&&val.length==0){ //if the input was REMOVING the character, then
			var exist = elements[e-1]?true:false; //checks if there is an input before
			if(exist) elements[e-1].focus(); //sends the focus back to the previous input
		}
		
		val==""?str+=" ":str+=val;
	});
}

$("#inputs").on('input', function(){processInput($(this))}); //still wonder how it worked out. But we are adding input listener to the parent... (omg, jquery is so smart...);

$("#inputs").on('click', function(e) { //making so that if human focuses on the wrong input (not first) it will move the focus to a first empty one.
	var els = $(this).children(),
			str = "";
	els.each(function(e){
		var focus = $(this).is(":focus");
		$this = $(this);
		while($this.prev().val()==""){
			$this.prev().focus();
			$this = $this.prev();
		}
	})
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://code.jquery.com/jquery-3.2.1.min.js