Feedback & status

AppMeter

A scalar measurement within a known range — disk usage, a score, remaining quota.

<app-meter value="82" low="60" high="90" optimum="low" label="Disk usage 82%" />

<app-meter> reports a single measurement against a known range — how much disk is used, a score out of 100, quota remaining. That's different from <app-progress>, which tracks a task's completion from 0 toward a total over time. A meter is a reading you take at a moment; a progress bar is a journey toward done. Semantically it's role="meter", not role="progressbar".

Give it low/high thresholds and it auto-tones green/amber/red by which end is optimum — without thresholds it keeps whatever tone you pass, exactly like a plain app-progress fill.

It shares app-progress's .progress / .progress-bar markup and theme, so the Razor <app-meter> and the React <AppMeter> render identically on every Webority surface.

Playground

Every attribute, live. Each change re-renders the real tag helper on the server, so the markup underneath is the exact call that produced the meter above it. Clear low/high to see the fallback tone take over.

<app-meter value="62" label="Disk usage" />

A plain meter

With no low/high thresholds, app-meter keeps the tone you pass — the same fallback fill as app-progress.

No thresholds
CPU load
Show code
<app-meter value="62" tone="info" label="CPU load" show-label="true" />

Threshold auto-toning

Pass low and high and the fill tones itself: which zone counts as good depends on optimum — "high" means bigger is better (a score, uptime), "low" means smaller is better (an error rate, latency).

Bigger is better — optimum="high"
At or below low is danger, between is warning, at or above high is success.
Below threshold
Mid range
Above threshold
Show code
<app-meter value="15" low="20" high="80" label="Below threshold" show-label="true" />
<app-meter value="50" low="20" high="80" label="Mid range" show-label="true" />
<app-meter value="90" low="20" high="80" label="Above threshold" show-label="true" />
Smaller is better — optimum="low"
The zones flip: at or below low is now success, at or above high is danger.
Low error rate
Mid error rate
High error rate
Show code
<app-meter value="15" low="20" high="80" optimum="low" label="Low error rate" show-label="true" />
<app-meter value="50" low="20" high="80" optimum="low" label="Mid error rate" show-label="true" />
<app-meter value="90" low="20" high="80" optimum="low" label="High error rate" show-label="true" />

A real example: disk usage

More used is worse, so optimum is "low" — the thresholds mark the warning and critical lines an ops dashboard would actually use.

92% used
A warning line at 60% and a danger line at 90%.
Disk usage 92%
Show code
<app-meter value="92" low="60" high="90" optimum="low" label="Disk usage 92%" show-label="true" />

A visible label

label is always the accessible name (aria-label). Add show-label to also render it inside the fill.

label only vs show-label
Quota used
Show code
<app-meter value="40" tone="neutral" label="Quota used" />
<app-meter value="40" tone="neutral" label="Quota used" show-label="true" />

Compact size

size="sm" renders a thin 4px bar for inline or table use, same as app-progress.

size="sm"
Show code
<app-meter value="70" size="sm" tone="success" label="Storage quota" />
Tracking a task instead of a reading? Use app-progress<app-meter> is a snapshot of a value within a range. When the number moves upward toward a known total as work happens — an upload, an import, a multi-step job — that's a task, and <app-progress> is the right component.

When to use

Use it when

  • You have a single measurement within a known min…max range — disk used, a score, remaining quota.
  • There are meaningful thresholds where the reading becomes concerning, and you want the colour to say so automatically.
  • The value is a state to read at a glance, not a task advancing toward completion.

Reach for something else when

  • The value is a task's completion moving toward 100% over time. → app-progress
  • A single headline number with an optional trend, not a bar. → app-kpi-tile
  • There is no known amount at all — it's just "working". → app-spinner

Best practices

Do
Disk usage 82%
Real thresholds that mean something operationally, so the auto-tone is trustworthy.
Don't
Import progress
A task advancing toward completion isn't a measurement — that's app-progress, not app-meter.

Every option

The whole surface of the component, one cell per resulting value — including every tone the low/high/optimum auto-toning logic can produce and the boundary values (at-or-below low, at-or-above high) that decide which zone a reading falls into.

tone — fallback fill, no thresholds (all five)

tone="info"
info reading
tone="success"
success reading
tone="warning"
warning reading
tone="danger"
danger reading
tone="neutral"
neutral reading

threshold auto-tone — optimum="high" (bigger is better): every resulting tone

value=10, low=20, high=80 → below low → danger
Below threshold
value=20 (== low) → at-or-below low → danger
At low
value=50 → between low and high → warning
Mid range
value=80 (== high) → at-or-above high → success
At high
value=90, low=20, high=80 → above high → success
Above threshold

threshold auto-tone — optimum="low" (smaller is better): every resulting tone

value=10, low=20, high=80, optimum="low" → below low → success
Below threshold
value=20 (== low) → at-or-below low → success
At low
value=50 → between low and high → warning
Mid range
value=80 (== high) → at-or-above high → danger
At high
value=90, low=20, high=80, optimum="low" → above high → danger
Above threshold

size

size="sm"
size="md"

label / show-label

(no label)
label only (accessible name, not rendered)
label + show-label (rendered inside the fill)
Quota used
show-label with a long label — overflow inside the fill
Primary volume — disk usage is approaching the configured warning threshold

value clamping — out-of-range input

value=-25, min=0, max=100 → clamped to 0%
Below min
value=250, min=0, max=100 → clamped to 100%
Above max

Attributes

AttributeTypeDefaultDescription
value *number—The measurement (min…max); clamped into range.
minnumber0Range floor.
maxnumber100Range ceiling.
toneinfo | success | warning | danger | neutralinfoFallback fill when no low/high thresholds are given.
optimumhigh | lowhighWhich end is good — high = bigger is better.
lownumber—At-or-below this value is the low zone.
highnumber—At-or-above this value is the high zone.
sizesm | mdmdBar thickness.
labelstring—Accessible name; also shown in the bar when show-label.
show-labelboolfalseRender the label text inside the bar.