1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import { type ClassValue, clsx } from "clsx"
import { twMerge } from "tailwind-merge"
/**
* Merge Tailwind CSS classes with clsx.
* Standard shadcn/ui utility function.
*/
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
/**
* Format a date for display.
*/
export function formatDate(date: string | Date): string {
return new Date(date).toLocaleString()
}
/**
* Format bytes to human readable size.
*/
export function formatBytes(bytes: number): string {
if (bytes === 0) return '0 B'
const k = 1024
const sizes = ['B', 'KB', 'MB', 'GB']
const i = Math.floor(Math.log(bytes) / Math.log(k))
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`
}