← Files NGS Analysis WorkbenchARCHIVED FILE
src/components/CopyButton.tsx
1.08 KB · Sep 30, 2026 · 23:20 UTC
import { useState } from "react";
import { Icon } from "../design-system/Icon";
import { copyToClipboard, type CopyStatus } from "../report/format";
import ui from "../styles/ui.module.css";
export function CopyButton({
value,
label = "Copy path",
accessibleLabel = label,
failureLabel = "Copy failed",
variant = "quiet",
}: {
value: string;
label?: string;
accessibleLabel?: string;
failureLabel?: string;
variant?: "quiet" | "secondary";
}) {
const [status, setStatus] = useState<CopyStatus>("idle");
return (
<button
aria-label={accessibleLabel}
className={`${ui.button} ${
variant === "quiet" ? ui.buttonQuiet : ui.buttonSecondary
}`}
data-status={status}
onClick={() => void copyToClipboard(value, setStatus)}
title={accessibleLabel}
type="button"
>
<Icon name={status === "copied" ? "check-md" : "copy"} size={16} />
<span aria-live="polite">
{status === "copied"
? "Copied"
: status === "failed"
? failureLabel
: label}
</span>
</button>
);
}
SHA-256: e4ee4cefb686814e8391d5b0cc6551d5bfb2d686b8bb6eb7791a27763ad78d36