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>
Simone committed on 9/10/2026, 9:11:59 PMparent02b7a89
15 files changedLine totals unavailable