JSFiddle - React, Tailwind, and code Playground

JavaScript

if(typeof window._setTimeout =='undefined') {
window._setTimeout=window.setTimeout;
String.prototype.f=function(obj) {
var newStr=this+'';
if(arguments.length==1) {
if(typeof(obj)=='string') {
    obj={x:obj};
}


for(var i in obj) {
    newStr=newStr.replace(new RegExp('{'+i+'}', 'g'), obj[i]+'');
}
newStr+='';

} else {
    for(var i=0; i<arguments.length; i++) {
        newStr=newStr.replace('{'+(i+1)+'}', arguments[i]);
    }
}
return newStr;
}
    
window._activeSetTimeouts={};
window._activeSetTimeoutsTotal=0;
window._setTimeoutCounter=0;
window._showCurrentSetTimeouts=function() {
    var tgt=document.getElementById('_settimtouts');
    if(!tgt) {
        tgt=document.createElement('UL');
        tgt.style.position='absolute';
        tgt.style.border='1px solid #999';
        tgt.style.background='#EEE';
        tgt.style.width='90%';
        tgt.style.height='500px';
        tgt.style.overflow='auto';
        tgt.id='_settimtouts';
        
        document.body.appendChild(tgt);
    }
    
    tgt.innerHTML='';
    var counter=0;
    for(var i in window._activeSetTimeouts) {
        var li=document.createElement('LI');
        li.innerHTML='[{status}] {delay} ({calltime})<br /><pre style="width: 100%; height: 5em; overflow: auto; background: {bgcolor}">{cb}</pre>'.f(window._activeSetTimeouts[i]);
        li.style.background=(counter++%2)?'#CCC' : '#EEB';
        tgt.appendChild(li);
        ;
    }
}
window.setTimeout=function(cb, delay) {
    var id = window._setTimeoutCounter++;
    var handleId = window._setTimeout(function() {
        window._activeSetTimeouts[id].status='exec';
        cb();
        delete window._activeSetTimeouts[id];
        window._activeSetTimeoutsTotal--;
    }, delay);
    
    window._activeSetTimeouts[id]={
        calltime:new Date(),
        delay:delay,
        cb:cb,
        status:'wait'
    };
    window._activeSetTimeoutsTotal++;
    return id;
}
}

//following line for test
for(var i=0; i<5; i++)...