35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
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<T extends (...args: any[]) => void>(
|
|
func: T,
|
|
delay: number,
|
|
): (...args: Parameters<T>) => void {
|
|
let timeoutId: ReturnType<typeof setTimeout>;
|
|
|
|
return (...args: Parameters<T>) => {
|
|
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`;
|
|
};
|