Components/SignalMeter

SignalMeter

A segmented strength bar that reads confidence, relevance, or signal as a count of lit segments.

VerifiedSince 0.3.9

SignalMeter

Basic Usage

Four Levels

value decides how many segments light up. Unlit segments keep the hairline tone and ignore tone entirely.

Loading demo...

Where It Fits

  • The confidence footer and alternatives list of a suggestion card — TxRecommendationCard uses it internally.
  • Relevance on retrieval results: three segments scan across a column faster than a percentage.
  • Any discrete strong / medium / weak / none quantity. Use TxProgressBar for continuous ones.

API

Props

PropTypeDefaultDescription
valuenumberLit segment count. Required; clamped into [0, max] and truncated toward zero.
maxnumber3Total segment count.
tonestring'currentColor'Colour of the lit segments, any CSS colour. Inherits the parent's text colour by default.
labelstringAccessible name. Without it the whole meter is marked aria-hidden.
barHeightnumber10Segment height in px.
barWidthnumber4Segment width in px.

Events

The component has no interaction and emits nothing.

Slots

The component has no slots.

Interaction Contract

  • A presentation-only primitive: no events, no internal state, repaints when value changes.
  • label decides the accessibility semantics. Supply it and the meter renders role="img" with aria-label; omit it and the whole meter is aria-hidden="true". The latter is deliberate — three empty spans announced one at a time are noise, and in real layouts the meter always sits beside its own visible text.
  • An out-of-range value neither throws nor overflows; it is clamped into [0, max].
  • tone takes a raw CSS colour string and does not follow the theme. Pass a variable such as var(--tx-color-success) rather than a hex literal if you want it to.
  • The fill transition runs 300ms; prefers-reduced-motion: reduce drops the transition and keeps the final colour.

Best Practices

  • Colour is never the only carrier of state: put a text label beside the meter (High confidence / Needs review) and pass that same text as label.
  • Keep max consistent within a screen, or "two of three" and "two of five" read as the same strength.
  • When the parent already shows a visible label, leave label off so a screen reader announces it once.
  • Map a semantic value such as confidence to value + tone in the host rather than scattering magic numbers through templates.

Source

  • Component source: packages/tuffex/packages/components/src/signal-meter/src/TxSignalMeter.vue.
  • Types: packages/tuffex/packages/components/src/signal-meter/src/types.ts.
  • Verified coverage: packages/tuffex/packages/components/src/signal-meter/__tests__/signal-meter.test.ts (6 cases) covers segment and lit counts, the controlled value loop, out-of-range clamping, a custom max, the role / aria-hidden branch around label, and tone plus geometry reaching the custom properties.
  • Adapted from Beautiful UI (https://www.beautifului.dev), © 2026 Shane Levine, MIT.
查看源码
packages/tuffex/packages/components/src/signal-meter/index.ts