import { clsx, type ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } export function getFirstLetters(str: string, n: number): string { return str .split(/\s+/) .slice(0, n) .map(word => word[0] || '') .join(''); } export function formatFileSize(bytes: number, decimals = 2): string { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } export function createPrefixedLogger(prefix: string, styles?: string[]) { const result: Record void> = {}; const methods = ['log', 'trace', 'debug', 'info', 'warn', 'error'] as const; for (const methodName of methods) { const originalMethod = console[methodName].bind(console); result[methodName] = (...args: any[]) => { if (typeof args[0] === 'string') { originalMethod(`${prefix} ${args[0]}`, ...(styles || []), ...args.slice(1)); } else { originalMethod(prefix, styles, ...args); } }; } return result; }