← Files NGS Analysis WorkbenchARCHIVED FILE

src/components/CopyButton.tsx

1.08 KB · Sep 30, 2026 · 23:20 UTC

↓ Download file

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