JSFiddle - React, Tailwind, and code Playground

by Hellfrom

HTML

<input type="text" id="mask" class="TCMask[(+380) ###-####,(+380) ___-____]" /><br />
<input id="fname" class="TCSuggest" autocomlete="off" /><br />
<input class="TCSuggest" autocomlete="off" /><br />

Тут если не написать API то я лох
для автокомплита нужно указать в Settings.Data.Suggest.Dictionaries id уже готового DOM input
например input#name Settings.Data.Suggest.Dictionaries

			function go(){
				Typecast.Init();
			}

go()

CSS

/*
Typecast 1.4 (release)
by Ara Pehlivanian (http://arapehlivanian.com)

This work is licensed under a Creative Commons Licence
http://creativecommons.org/licenses/by-nd/2.5/
*/

#SuggestOutputArea{
	border: solid 1px #ccc;
	background: #fff;
}

#SuggestOutputArea ul{
	list-style-type: none;
	margin: 0;
	padding: 0;
}

#SuggestOutputArea ul li:hover{
	cursor: pointer;
}
#SuggestOutputArea ul li.selected{
	background-color: #006;
	color: #fff;
}

JavaScript

/*
Typecast 1.4 (release)
by Ara Pehlivanian (http://arapehlivanian.com)

This work is licensed under a Creative Commons Licence
http://creativecommons.org/licenses/by-nd/2.5/
*/

var Typecast = {
	InitMask : false,
	InitSuggest : false,
    Add:function (obj){
        this.Parse(document.body.getElementsByTagName("input"));
    },
	Init : function(){
		this.Parse(document.body.getElementsByTagName("input"));
		this.Behaviours.Mask.Init();
		this.Behaviours.Suggest.Init();
	},
	
	Parse : function(nodes){
		
		for(var i=0; i<nodes.length; i++){
			var node = nodes[i];

			if(node.type=="text" && node.className && node.className.indexOf("TC") != -1){
				if(!node.id) Typecast.Utils.GenerateID(node);
				
				var behaviourName = (node.className.indexOf("[") != -1) ? node.className.substring(node.className.indexOf("TC")+2, node.className.indexOf("[")) : node.className.substring(node.className.indexOf("TC")+2, node.className.length);
				
				Typecast["Init" + behaviourName] = true;
				Typecast.Behaviours[behaviourName].InitField(node);

				node.onfocus = Typecast.Behaviours[behaviourName].Run;
				node.onkeyup = Typecast.Behaviours[behaviourName].KeyHandler;
				node.onkeydown = Typecast.Behaviours[behaviourName].KeyHandler;
				node.onblur = Typecast.Behaviours[behaviourName].Stop;
				node.onmouseup = Typecast.Behaviours[behaviourName].MouseUp;
			}
		}
	},
	
	Behaviours : {
		Mask : {
			Init : function(){
			},
			
			InitField : function(field){
				var fieldData = [];
				if(!eval("Typecast.Config.Data.Mask.Masks." + field.id)){
					fieldData = field.className.substring(field.className.indexOf("[")+1, field.className.indexOf("]"))
				}else{
					fieldData = eval("Typecast.Config.Data.Mask.Masks." + field.id);
				}
				Typecast.Behaviours.Mask.ParseFieldData(field, fieldData);
				field.value = field.DefaultText.join("");
			},
			
			Run : function(e){
				e = (!e) ? window.event : e;
			},
			
			Stop : function(){
			},
			
			KeyHandler :...