import { clsx, type ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } export function generateSlug(title: string) { return title .toLowerCase() // Convert to lowercase .trim() // Remove leading/trailing whitespace .replace(/[^\w\s-]/g, "") // Remove special characters .replace(/\s+/g, "-") // Replace spaces with hyphens .replace(/-+/g, "-") // Remove consecutive hyphens .replace(/^-+|-+$/g, ""); // Remove leading/trailing hyphens } export function debounce void>( func: T, delay: number, ): (...args: Parameters) => void { let timeoutId: ReturnType; return (...args: Parameters) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => func(...args), delay); }; } export const formatFileSize = (size: number) => { if (size < 1024) return `${size} B`; if (size < 1024 * 1024) return `${(size / 1024).toFixed(2)} KB`; return `${(size / (1024 * 1024)).toFixed(2)} MB`; };