mirror of
https://github.com/Kaelio/ktx.git
synced 2026-06-07 07:55:13 +02:00
65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
|
|
"use client";
|
||
|
|
|
||
|
|
import { useState } from "react";
|
||
|
|
|
||
|
|
type Props = {
|
||
|
|
text: string;
|
||
|
|
className?: string;
|
||
|
|
};
|
||
|
|
|
||
|
|
export function CopyButton({ text, className = "" }: Props) {
|
||
|
|
const [copied, setCopied] = useState(false);
|
||
|
|
|
||
|
|
const onClick = async () => {
|
||
|
|
try {
|
||
|
|
await navigator.clipboard.writeText(text);
|
||
|
|
setCopied(true);
|
||
|
|
setTimeout(() => setCopied(false), 1500);
|
||
|
|
} catch {
|
||
|
|
// Older browsers or denied permission — fail silently
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
return (
|
||
|
|
<button
|
||
|
|
type="button"
|
||
|
|
onClick={onClick}
|
||
|
|
aria-label={copied ? "Copied" : "Copy code"}
|
||
|
|
className={`inline-flex items-center justify-center w-7 h-7 rounded-md transition-all hover:bg-white/5 ${className}`}
|
||
|
|
>
|
||
|
|
{copied ? (
|
||
|
|
<svg
|
||
|
|
width="14"
|
||
|
|
height="14"
|
||
|
|
viewBox="0 0 24 24"
|
||
|
|
fill="none"
|
||
|
|
stroke="currentColor"
|
||
|
|
strokeWidth="2.4"
|
||
|
|
strokeLinecap="round"
|
||
|
|
strokeLinejoin="round"
|
||
|
|
className="text-emerald-400"
|
||
|
|
aria-hidden="true"
|
||
|
|
>
|
||
|
|
<polyline points="20 6 9 17 4 12" />
|
||
|
|
</svg>
|
||
|
|
) : (
|
||
|
|
<svg
|
||
|
|
width="13"
|
||
|
|
height="13"
|
||
|
|
viewBox="0 0 24 24"
|
||
|
|
fill="none"
|
||
|
|
stroke="currentColor"
|
||
|
|
strokeWidth="2"
|
||
|
|
strokeLinecap="round"
|
||
|
|
strokeLinejoin="round"
|
||
|
|
className="opacity-70"
|
||
|
|
aria-hidden="true"
|
||
|
|
>
|
||
|
|
<rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
|
||
|
|
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
|
||
|
|
</svg>
|
||
|
|
)}
|
||
|
|
</button>
|
||
|
|
);
|
||
|
|
}
|