JSFiddle - React, Tailwind, and code Playground

by milesplit

HTML

<h1>Input Abstraction Layer</h1>
    
    <p>...</p>

<a href="#">hey</a>

JavaScript

/*
Copyright (c) 2013 MileSplit, Inc.
Author: Jason Byrne
Contributor: Alan Szlosek
License: MIT
*/
/* 	USAGE
	Requires: jQuery or Zepto
	Public properties:
		supports
	Public methods:
		adapter([name[, eventMap]])
		on(event, callback)
		off(token)
		trigger(event, args, target)
		
*/
;(function($){
	// Private methods
    var	adapters = {}, listeners = {},
		speechChangeEvent = null,
		$doc = $(document), geo = navigator.geolocation;
	// Pubsub
	var ps=(function(){var q={},topics={},subUid=-1;q.subscribe=function(topic,func){topics[topic]=topics[topic]||[];var token=(++subUid).toString();topics[topic].push({token:token,func:func});return token}; q.publish=function(topic,args,_this){if(!topics[topic]){return false}setTimeout(function(){var subscribers=topics[topic],len=subscribers?subscribers.length:0;while(len--){subscribers[len].func.call(_this||this,args,topic)}},0);return true};q.unsubscribe=function(token){for(var m in topics){if(topics[m]){for(var i=0,j=topics[m].length;i<j;i++){if(topics[m][i].token===token){topics[m].splice(i,1);return token}}}}return false};return q})();
	// Keys shim
	var keys = function(o){
		if (o.keys) return o.keys;
		var out=[];
		for (var key in o) {
			out.push(key);
		}
		return out;
	};
    // Initalize
	$.dial = { on: ps.subscribe, off:ps.unsubscribe, trigger: ps.publish };
	// Supports
	$.dial.supports = {
		touch: !!window.ontouchstart,
		mouse: !!window.onmousemove,
		keyboard: !!window.onkeydown,
		orientation: !!window.orientation,
		geolocation: !!geo
	};
	$.dial.supports.speech = (function() {
		var input = document.createElement('input');
		input.setAttribute('x-webkit-speech', 'x-webkit-speech');
		input.setAttribute('speech', 'speech');
        speechChangeEvent = ('webkitSpeech' in input) ?
            'webkitspeechchange' : 'speechchange';
		return (speechChangeEvent in input);
	})();
	// Adapters
	$.dial.adapter = function(type, events){
		// Overloads
		if (arguments.length == 0) return adapters;
		else if...