コピーボタンCopyButtonExperimental

クリップボードへのコピー操作を、ツールチップとコピー済み状態のフィードバック付きで表示します。

プレビュー

状態とバリエーション

アイコンだけのコピー

スウォッチやツールバーなど狭い場所では、コピー後にチェックアイコンへ切り替え、コピー完了の吹き出しを一時表示します。

ラベル付きフィードバック

コードブロックのように余白がある場所では、押す前から操作名を表示し、コピー後に完了ラベルへ切り替えます。

ボタンの面

buttonVariant で面だけを変えます。既定の ghost はツールバーやコードブロックの隅に、outline や secondary は単体で置くときに使います。

ghost
outline
secondary

プロパティ

表は横にスクロールできます
プロパティ初期値説明
valuestring-クリップボードへコピーする文字列です。
copyLabelstring"Copy"コピー前の aria-label とツールチップです。
copiedLabelstring"Copied"コピー後に表示する aria-label とツールチップです。
copyFailedLabelstring"Copy failed"コピー失敗時に表示する aria-label とツールチップです。
copiedDurationnumber5000コピー済みの吹き出し表示を維持する時間です。単位はミリ秒です。
variant"default" | "label""default"狭い場所ではアイコンのみ、広い場所ではコピー済みラベルも表示します。
buttonVariantTooltipButtonProps["variant"]"ghost"ボタン表面の見た目を指定します。

使い方

import { CopyButton } from "@gunjo/ui";

export function InstallCommandCopyButton() {
  const command = "npm install @gunjo/ui";

  return (
    <CopyButton
      value={command}
      copyLabel="コマンドをコピー"
      copiedLabel="コピーしました"
      copyFailedLabel="コピーに失敗しました"
      variant="label"
    />
  );
}

設計の判断

  • ラベルを動詞で書き、結果で入れ替える。資料は「ボタンのラベルは動詞で書く」を挙げています。この部品は copyLabelcopiedLabelcopyFailedLabel の3つを持ち、押した結果でラベルとアイコンを入れ替えます。既定では5秒(copiedDuration)でもとに戻ります。
  • 失敗しても黙らない。クリップボードの API が拒否された場合は、画面外の textarea を使う古いやり方に切り替えます。それでも駄目なら「コピーできません」を出します。押したのに何も起きない、という状態を作らないためです。
  • 結果はツールチップではなく role="status" で知らせる。押した後の吹き出しは読み上げ対象の要素で、そのあいだツールチップは出しません。ツールチップはポインタを乗せている人にしか届かないので、押した結果の知らせには使えないからです。
    一般のボタンの設計は UIXHERO の「ボタン」にあります。

使用コンポーネント

いつ・なぜ使うか(UIXHERO)

「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。