2026-03-25 09:27:12 +08:00
|
|
|
import { type ClassValue, clsx } from "clsx";
|
2026-03-22 02:57:49 +08:00
|
|
|
import { twMerge } from "tailwind-merge";
|
2026-07-10 21:41:49 +08:00
|
|
|
import { safeRandomUUID } from "@/lib/uuid";
|
2026-03-22 02:57:49 +08:00
|
|
|
|
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
|
|
|
return twMerge(clsx(inputs));
|
|
|
|
|
}
|
2026-04-04 16:21:43 +08:00
|
|
|
|
|
|
|
|
export function generateId(): string {
|
2026-07-10 21:41:49 +08:00
|
|
|
return safeRandomUUID();
|
2026-04-04 16:21:43 +08:00
|
|
|
}
|
2026-04-04 16:25:25 +08:00
|
|
|
|
|
|
|
|
export async function copyToClipboard(text: string): Promise<boolean> {
|
|
|
|
|
try {
|
|
|
|
|
await navigator.clipboard.writeText(text);
|
|
|
|
|
return true;
|
|
|
|
|
} catch {
|
|
|
|
|
try {
|
|
|
|
|
const textarea = document.createElement("textarea");
|
|
|
|
|
textarea.value = text;
|
|
|
|
|
textarea.style.position = "fixed";
|
|
|
|
|
textarea.style.opacity = "0";
|
|
|
|
|
document.body.appendChild(textarea);
|
|
|
|
|
textarea.select();
|
|
|
|
|
const ok = document.execCommand("copy");
|
|
|
|
|
document.body.removeChild(textarea);
|
|
|
|
|
return ok;
|
|
|
|
|
} catch {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|