/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import { type ClassValue, clsx } from 'clsx'; import { twMerge } from 'tailwind-merge'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } export function formatNumber(num: number): string { if (num >= 1_000_000) { return (num / 1_000_000).toFixed(1) + 'M'; } if (num >= 1_000) { return (num / 1_000).toFixed(1) + 'K'; } return num.toLocaleString(); } export function formatBytes(bytes: number): string { if (bytes >= 1024 * 1024 * 1024) { return (bytes / (1024 * 1024 * 1024)).toFixed(1) + ' GB'; } if (bytes >= 1024 * 1024) { return (bytes / (1024 * 1024)).toFixed(0) + ' MB'; } if (bytes >= 1024) { return (bytes / 1024).toFixed(0) + ' KB'; } return bytes + ' B'; } export function formatDuration(ms: number): string { if (ms < 1000) { return ms + 'ms'; } if (ms < 60000) { return (ms / 1000).toFixed(1) + 's'; } const minutes = Math.floor(ms / 60000); const seconds = Math.floor((ms % 60000) / 1000); return `${minutes}:${seconds.toString().padStart(2, '0')}`; }