- The level state carries a Behavior, so the state changes only when its kind
does.
- The meter renders its bars once and an effect draws the level into them.
- The render-counting test now counts every commit, and asserts none while the
level moves.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Cut placement, surrounding context, design measurements and decision history
from comments this branch added, across code, styles, tests and stories.
- Correct one that claimed most Firefox builds can't route audio.
- Drop a comment left duplicated in the footer story.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Draws the level as lit bars, and each failure state as its own message with a
next action rather than as a meter that has stopped.
- A bar and the space beside it keep one size wherever the meter is drawn; what
the width decides is how many bars there are. Bars spread to fill would be a
different shape in every place, and would close into one block where the space
ran short.
- Announces the level on a fixed scale, so it does not rest on hue or on how
many bars happened to fit.
- The hook is a bridge and nothing more: the capture belongs to the state layer.
- The capture is held by a component of its own, so a level that does change
redraws the meter rather than whatever is rendered beside it. A level arrives
many times a second; held by the menu it would reconcile every device row on
the way to the bars. A test counts those renders, because nothing else would
notice the hook moving back.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>