`<wa-copy-button>` のツールチップ依存を廃止し、stable へ昇格

shoelace-style/webawesome

<wa-copy-button> コンポーネントがツールチップ依存を取り除いた組み込みフィードバックポップアップへと刷新され、experimental から stable に昇格しました。この変更により、デフォルトトリガーとカスタムトリガーの両方で一貫したフィードバックが機能するようになっています。

背景

従来の実装では、コピー操作のフィードバック表示を <wa-tooltip> コンポーネントに直接依存していたため、カスタムトリガーではフィードバックが機能しないという根本的な制約がありました。

PR の説明によれば、「ツールチップ版はカスタムトリガーと連動しておらず、連動させることもできなかった」とあります。カスタムトリガーのサポートは直前の変更で追加された機能であり、その設計と整合するフィードバック機構が求められていました。

この制約を解消するため、ツールチップコンポーネントへの依存を切り離し、ツールチップのデザイントークンを流用しながらも独立したアニメーションを持つ専用のフィードバックポップアップとして再実装されています。

技術的な変更

copy-button.ts の内部構造が大きく再設計され、カスタムトリガーへのツールチップ紐付けロジックと、専用の CSS パーツが追加されました。

@query('wa-tooltip') による直接参照は廃止され、@query('wa-tooltip[part="feedback"]') という shadowTooltip プロパティに置き換えられています。また、@query('slot:not([name])') による defaultSlot の参照が追加され、カスタムトリガーの検出(hasCustomTrigger ステート)や liveAnnouncement によるアクセシビリティ対応が導入されています。内部的には INTERNAL_TOOLTIP_SLOTASSIGNED_ID_PROP の2つの定数が追加され、カスタムトリガーへの ID 自動付与と内部スロット管理を担います。

CSS パーツの公開インターフェースも変更されています:

  • 削除: tooltip__basetooltip__base__popuptooltip__base__arrowtooltip__body
  • 追加: feedback(内部 <wa-tooltip> 要素全体を指すパート)

スタイル面では copy-button.styles.ts においてボタンサイズの指定が padding: 0.5em から height: calc(var(--wa-form-control-height) * 0.8) + aspect-ratio: 1 に変更され、フォームコントロールの高さトークンを基準とした正方形のボタンサイズに統一されました。また success-iconerror-icon スロットへのカラー指定がスタイルシートから削除されており、アイコンの色付けは別の手段(フィードバックポップアップ内)に移管されています。

テストファイル copy-button.test.ts では、以前は button-name ルールの axe アクセシビリティ違反を回避するため ignoredRules = ['button-name'] としていた箇所が空配列に戻されており、アクセシビリティ上の問題が解消されたことが示されています。新たに追加されたテストでは、カスタムトリガーへの ID 自動付与・既存 ID の保持・ツールチップの full デフォルト値などが検証されています。

ドキュメントのカスタムトリガー説明も更新されており、変更前後のメッセージが対照的です:

変更前:

When using a custom trigger, the default tooltip and icon feedback won't be shown.

変更後:

Custom triggers automatically receive the same tooltip and copy feedback as the default trigger — no extra wiring required.

設計判断

<wa-tooltip> との依存関係を維持しつつ、その制御を内部に閉じ込めるアーキテクチャが採用されました。

フィードバック表示にはツールチップのデザイントークンが流用されており、視覚的な一貫性は保たれています。一方でアニメーションは独自実装とされており、PR の説明でも「ツールチップのスタイルはトークンを共有するが、実際のツールチップコンポーネントのスタイルは共有しない。アニメーションは独自のものだ」と明言されています。これにより、ツールチップコンポーネントの変更がコピーボタンのフィードバック挙動に波及するリスクを抑えています。

カスタムトリガーへのフィードバック自動適用にあたっては、without-tooltip 属性によるオプトアウトも用意されています。これはデフォルト安全(ゼロ設定で動作)かつエスケープハッチ付きという設計で、後方互換性への配慮と新機能の利便性を両立しています。また、tooltip-placement 属性と tooltip__* CSS パーツが削除されて feedback-placementfeedback パートに置き換えられており、フィードバック機構の名称変更によって概念の刷新が明示されています。

まとめ

この変更は、カスタムトリガーのサポートという新機能の追加を契機に、フィードバック機構の根本から再設計した内容です。tooltip__* パーツの削除は破壊的変更ですが、experimental ステータスのうちに刷新を完了したことで、stable 昇格後のインターフェース安定性を確保しています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
a6d56ae7

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術的変更・設計判断(各論)→まとめ(結論)という理想的な3部構成が明確に守られています。各セクションの役割も適切です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

PR番号へのGitHubリンク記法が正しく使用されています。その他のカスタムMarkdown構文は使用されていませんが、問題ありません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

コンポーネントの内部実装、CSSパーツ、アクセシビリティテストなど、専門知識を持つエンジニアを対象とした適切な技術レベルと表現で書かれています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

セクション内構成、トピックセンテンスの先頭配置、1段落1トピックの原則が徹底されており、非常に構造的で読みやすい文章になっています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用・言及されているコード変更(ts, styles.ts, test.ts, mdファイル)は、提供されたDiff情報と完全に一致しており、正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「デザイントークン」「CSSパーツ」「shadow DOM」「liveAnnouncement」などの技術用語が、文脈に沿って正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Diffで示されたコード変更の意図や影響について、技術的に正確かつ論理的に説明できています。例えば、テストの`ignoredRules`の変更からアクセシビリティ改善を読み取るなど、的確な解説です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張は、PRのタイトル、Description、またはDiff内のコードやドキュメント変更によって裏付けられており、ハルシネーションは一切見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2343)やファイル名、コンポーネント名、属性名などの固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「`<wa-copy-button>` のツールチップ依存を廃止し、stable へ昇格」は、PRの主題「Update copy button feedback and make stable」を的確に反映しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に記載のないバージョンサポート情報やリリース日程などの外部知識は含まれておらず、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「直前の変更で追加された機能」という時間表現は、PR Descriptionの「recently added」と一致しており、正確です。