Progress
The native progress element, restyled per engine. Screen readers announce the percentage without a single ARIA attribute.
plain CSS — works everywhere
How it works
<progress value max>carries the semantics; utilities restyle it per engine —[&::-webkit-progress-value]:for Chromium/WebKit,[&::-moz-progress-bar]:for Firefox.- The classic gotcha — vendor pseudo-elements can’t share a comma-separated rule, because one invalid selector kills the whole rule — doesn’t apply here: every utility class compiles to its own rule, so each engine just ignores the selectors it doesn’t know.
- Drop the
valueattribute entirely and you get the native indeterminate animation.