Files
avandClaude Opus 4.8 dd9a31e301 Stabilize panel speed label width
Cap formatBytesShort at four characters by rolling the mantissa up to the
next unit once it reaches 1000, and give .sbx-speed-label a fixed min-width
so the panel widget no longer shifts horizontally as speed values change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 14:49:59 +03:00

48 lines
1.4 KiB
JavaScript

// Formatting helpers for byte counts and transfer rates.
const UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
const SHORT_UNITS = ['', 'K', 'M', 'G', 'T', 'P'];
function scale(n) {
n = Number(n) || 0;
let i = 0;
while (n >= 1024 && i < UNITS.length - 1) {
n /= 1024;
i += 1;
}
return [n, i];
}
// "2.4 MB", human readable with a space.
export function formatBytes(n) {
const [v, i] = scale(n);
const digits = i === 0 ? 0 : v < 10 ? 2 : v < 100 ? 1 : 0;
return `${v.toFixed(digits)} ${UNITS[i]}`;
}
// Compact for the panel: "2.4M", "120K", "0".
// Keeps the mantissa under three integer digits so a value is at most four
// characters wide ("999K", "9.9M", "1023") — the panel field has a fixed width
// and must never overflow it (see .sbx-speed-label in stylesheet.css).
export function formatBytesShort(n) {
let [v, i] = scale(n);
if (i > 0 && v >= 1000 && i < SHORT_UNITS.length - 1) {
v /= 1024;
i += 1;
}
if (i === 0)
return `${Math.round(v)}`;
const digits = v < 10 ? 1 : 0;
return `${v.toFixed(digits)}${SHORT_UNITS[i]}`;
}
// "2.4 MB/s" for the menu.
export function formatSpeed(bytesPerSec) {
return `${formatBytes(bytesPerSec)}/s`;
}
// "2.4M" for the panel (no /s, arrow provides context).
export function formatSpeedShort(bytesPerSec) {
return formatBytesShort(bytesPerSec);
}