sclass HBubblesProgressBar extends HTMLBase { S mainClass = "bubble-progress-bar"; S id = aGlobalID(); S preprocessCSS(S css) { ret replace(css, ".mc", "." + mainClass); } *() { css([[ .mc { position: relative; width: 50vw; top: 50%; left: 50%; transform: translate3d(-50%, -50%, 0); } .mc input { display: none; } .mc label div { position: absolute; top: 0; left: 0; background: linear-gradient(to bottom, #A3E2EF 35%, #4F9CC0); height: 100%; width: 0%; box-shadow: 0 0 8px 1px white inset; } .mc label div:before { content: ""; display: block; width: 100%; height: 100%; position: absolute; top: 0; left: 0; background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/172299/bubbles-mask.gif); mix-blend-mode: overlay; opacity: 0.5; } .mc span { display: inline-block; color: #4F9CC0; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 1.5px; margin-top: 0.7rem; } .mc span:last-child { float: right; } ]]); } public S html() { ret div(linesLL( htag input(type := "checkbox", id := id + "-cb"), hlabelFor(id + "-cb", emptydiv()), span("Progress"), span("0%", id := id + "-progress"), ), +id, class := mainClass); } S demo() { ret hhtml(hbody(hcombine( hcss([[ html, body { margin: 0; height: 100%; width: 100%; } body { background: #26323D; background-image: radial-gradient(transparent 65%, rgba(black, 0.3)); font-family: sans-serif; } ]]), complete(), hjs_dollarVars([[ window.onload = function() { var elm = document.querySelector('#' + $id + '-progress'); var div = document.querySelector('#' + $id + ' label div'); setInterval(function(){ if(!elm.innerHTML.match(/100%/gi)){ elm.innerHTML = (parseInt(elm.innerHTML) + 1) + '%'; div.style.width = elm.innerHTML; } else { clearInterval(); } }, 100); }; ]], +id)))); } }