OVERSCANUI KIT
no button at all a worn bezel with weight channels do not converge zero depth instrumented, full of smoke a field of real characters a camera looking out additive, so no shadow hairlines, no new shader no raster, so no scanlines

A range from what is flowing, never a countdown from a setting. Time to exhaustion is the remaining amount divided by the rate it is being used, and the rate is where estimates lie. The time left is drawn as a band from the fastest recent rate to the slowest, so unsteady use widens it, with nothing in the middle to read as the answer. A rate that is only set or commanded gives no estimate at all, because a dial setting is not what is flowing. Too few samples, no remaining amount, or no use at all are each refused in their own words, and the source of the rate is always printed.

demo/endurance.html, from this page
import 'overscan'
import 'overscan/overscan.css'

<ov-endurance id="live-endurance"></ov-endurance>
live: one simulated minute a second
variation: src="models/endurance-steady.json"
import 'overscan'
import 'overscan/overscan.css'

<ov-endurance src="models/endurance-steady.json"></ov-endurance>
steady use
unsteady use
only a set rate
use that sometimes stops
two samples
variation: src="models/endurance-unsteady.json"
import 'overscan'
import 'overscan/overscan.css'

<ov-endurance src="models/endurance-unsteady.json"></ov-endurance>
terminal
variation: src="models/endurance-set.json"
import 'overscan'
import 'overscan/overscan.css'

<ov-endurance src="models/endurance-set.json"></ov-endurance>
industrial
cyber
antiseptic
esper
neo
machina
holo
aegis
vector