| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- 'use client';
- import { useState } from 'react';
- import { Check, Copy } from 'lucide-react';
- import { cn } from '@/lib/cn';
- export function CopyButton({
- value,
- label = 'Copy',
- className,
- }: {
- value: string;
- label?: string;
- className?: string;
- }) {
- const [copied, setCopied] = useState(false);
- async function copy() {
- try {
- await navigator.clipboard.writeText(value);
- setCopied(true);
- setTimeout(() => setCopied(false), 2000);
- } catch {
- // Clipboard unavailable (insecure context) — ignore.
- }
- }
- return (
- <button
- type="button"
- onClick={copy}
- aria-label={copied ? 'Copied' : label}
- className={cn(
- 'inline-flex items-center gap-1.5 rounded-lg border px-2.5 py-1.5 text-xs font-medium transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground focus-visible:outline-2 focus-visible:outline-fd-ring',
- className,
- )}
- >
- {copied ? (
- <Check className="size-3.5 text-brand" aria-hidden />
- ) : (
- <Copy className="size-3.5" aria-hidden />
- )}
- <span>{copied ? 'Copied' : label}</span>
- </button>
- );
- }
|