import { clsx, type ClassValue } from "clsx" import { twMerge } from "tailwind-merge" export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } /** * Generate a UUID v4. Uses `crypto.randomUUID()` when available (secure * contexts), otherwise falls back to `crypto.getRandomValues()`. */ export function randomUUID(): string { if ( typeof crypto !== "undefined" && typeof crypto.randomUUID === "function" ) { return crypto.randomUUID() } // Fallback for non-secure contexts (HTTP over LAN) const bytes = new Uint8Array(16) crypto.getRandomValues(bytes) // Set version 4 and variant bits bytes[6] = (bytes[6] & 0x0f) | 0x40 bytes[8] = (bytes[8] & 0x3f) | 0x80 const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("") return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}` }