App

Bundles

Stats
BundleMinifiedGzipBrotli
index.js15.2 kB5.8 kB5.25 kB

Source

import { html, render } from "lit";

const Timer = (elapsed, duration, setDuration, reset) => html`
	<label>
		Elapsed time: <progress value=${elapsed / duration}></progress
	></label>
	<div class="elapsed">${(elapsed / 1000).toFixed(1)}s</div>
	<label>
		Duration:
		<input
			type="range"
			min="1"
			max="20000"
			.value=${duration}
			@input=${setDuration}
		/>
	</label>
	<div>
		<button class="btn btn-primary" @click=${reset}>Reset</button>
	</div>
`;

const container = document.getElementById("app");

function update(elapsed, duration, last_time) {
	const reset = () => update(0, duration, performance.now());
	const setDuration = e => update(elapsed, e.target.value, last_time);

	if (elapsed < duration) {
		requestAnimationFrame(time =>
			update(
				elapsed + Math.min(time - last_time, duration - elapsed),
				duration,
				time
			)
		);
	}

	render(Timer(elapsed, duration, setDuration, reset), container);
}

update(0, 5000, performance.now());