fix(panel): surrender whole content items instead of eliding panel text

The optional Panel content (provider name, usage text, credit balance) was
composed into one string and given whatever width the meter row left over,
then elided. With the four meters the compact renderer draws, a settings-wide
selection needed ~144px and received 88px, so "Claude 82% used 125cr" reached
the panel as "Claude 82% u...": a complete value became a fragment that reads
as a different one, with no sign that content had been dropped.

The renderer now composes the label from separable segments and shows the
widest composition that fits, surrendering whole items by priority: the
provider name first, because the icon beside it already identifies the
provider, then the credit balance, keeping the usage figure. Only a single
remaining item is elided, as a last resort. The full composition stays in the
panel tooltip and in accessible names, so nothing becomes unreachable.

The width budget is also derived from the row the panel actually lays out
instead of a flat allowance. The old formula reserved ~12-20px that were never
used, which by itself surrendered items while the space was free; three
providers with every switch on now keep the full text.

PanelTextFit.js holds the pure composition and fitting logic. The compact
renderer measures each candidate on its own hidden label, because raw font
metrics and shaped label widths differ by a fraction of a pixel and that is
enough to elide a composition chosen to fit.

The panel configuration matrix now captures four providers, the cap where
content competes for width, and rejects labels elided while a narrower
composition would have fitted. Verified across its 336 captures: zero such
elisions, and 108 cases that correctly surrender an item.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
d15e376fd2Simone committed on 9/10/2026, 9:11:59 PMparent02b7a89
15 files changedLine totals unavailable