ツールバーのトップレベルに取り消し線・下線ボタンを移動

basecamp/lexxy

取り消し線(Strikethrough)と下線(Underline)のボタンが、フォーマットドロップダウンメニューの中から外れ、ツールバーの最上位に直接配置されるようになりました。これにより、多くのテキストエディタで標準的な位置とされるトップレベルから、これらの書式設定に即座にアクセスできます。

背景

取り消し線と下線は、多くのテキストエディタでトップレベルのツールバーに配置される標準的なフォーマットオプションです。これまでのlexxyでは、これらのボタンは「format」ドロップダウンの中に格納されており、アクセスするには一度ドロップダウンを開く手順が必要でした。

PR本文では「これらはほとんどのテキストエディタでトップレベルに期待されるフォーマットオプションである」と明示されており、ユーザー体験の観点からデフォルトの配置を見直す判断が行われています。なお、不要な場合はCSSで非表示にできる逃げ道も用意されており、採用側の柔軟性が確保されています。

技術的な変更

変更の中心は src/elements/toolbar.js の2箇所で、HTMLテンプレートとpressed-state(ボタンの押下状態)の追跡ロジックがそれぞれ更新されています。

HTMLテンプレートの変更: bold・italicボタンの直後に、新たに2つのボタンが追加されました。

<button class="lexxy-editor__toolbar-button" type="button" name="strikethrough" data-command="strikethrough" title="Strikethrough">
  ${ToolbarIcons.strikethrough}
</button>

<button class="lexxy-editor__toolbar-button lexxy-editor__toolbar-group-end" type="button" name="underline" data-command="underline" title="Underline">
  ${ToolbarIcons.underline}
</button>

underlineボタンには lexxy-editor__toolbar-group-end クラスが付与されており、bold・italic・strikethrough・underlineをひとつのビジュアルグループとして扱う意図が読み取れます。同時に、ドロップダウン内からstrikethrough・underlineのボタン定義と、それに続くセパレーター(<div class="lexxy-editor__toolbar-separator">)が削除されました。

pressed-stateロジックの変更: ボタンの移動に合わせて、#setButtonPressed の呼び出し順序と「format」ボタンの条件式が更新されました。

// 変更前
this.#setButtonPressed("format", isInHeading || isStrikethrough || isUnderline)
this.#setButtonPressed("paragraph", !isInHeading)
// ...
this.#setButtonPressed("strikethrough", isStrikethrough)
this.#setButtonPressed("underline", isUnderline)

// 変更後
this.#setButtonPressed("strikethrough", isStrikethrough)
this.#setButtonPressed("underline", isUnderline)

this.#setButtonPressed("format", isInHeading)
this.#setButtonPressed("paragraph", !isInHeading)

strikethrough・underlineのpressed-state更新がbold・italicの直後に移動し、「format」ボタンのpressed条件が isInHeading のみに簡略化されています。以前は isStrikethrough || isUnderline の状態もformatボタンの押下状態に反映されていましたが、これらがトップレベルで独立したボタンになったため、その考慮が不要になりました。

テストの変更: test/browser/helpers/toolbar.js では、FORMAT_DROPDOWN_COMMANDS セットから "strikethrough""underline" が除外されました。また test/test_helpers/editor_handler.rbtoggle_command メソッドが更新され、コマンドがオーバーフローメニュー内にある場合は先にドロップダウントリガーをクリックしてから対象ボタンをクリックする処理が追加されています。これにより、ボタンの配置場所によらず toggle_command が正しく動作するようになっています。

設計判断

CSSによる非表示を逃げ道として明示的に提供する設計が採用されました。PR本文では以下のCSSスニペットが添えられており、採用側がボタンを表示したくない場合の対処法が文書化されています。

lexxy-toolbar {
  button[data-command="strikethrough"] { display: none; }
  button[data-command="underline"] { display: none; }
}

また、PR本文では「ツールバー設定を追加してこれらのボタンを動的に制御できるようにする」という今後の方針が言及されています。今回の変更はその前段階として、まずデフォルト配置を標準的な位置に修正したものです。

さらに、toggle_command のRubyヘルパーが「ボタンがオーバーフローメニュー内にあるかどうか」を自動判定する実装に更新された点は注目に値します。ツールバーのボタン配置が変わってもテストの記述を変更せずに済む抽象化であり、将来的なツールバー構成の変更に対してテストコードが耐性を持つ設計になっています。

まとめ

取り消し線・下線ボタンのトップレベル配置への移動は、一般的なテキストエディタの慣習に合わせたUXの改善です。ボタン移動に伴うpressed-stateロジックの簡略化と、テストヘルパーのボタン位置非依存化が一体的に行われており、今後のツールバー設定機能追加に向けた基盤整備も兼ねた変更といえます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
700bd2e7

この記事は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リンク記法の正確性

ファイル名付きシンタックスハイライト(`javascript:src/elements/toolbar.js`)およびPRへのリンク記法(`[PR #1066](URL)`)がガイドラインに準拠して正しく使用されています。

対象読者への適合性 ✓ PASS

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

コードの変更点や設計思想に焦点を当てており、専門知識を持つエンジニアという対象読者に完全に適合しています。冗長な説明はなく、要点が的確にまとめられています。

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

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

各セクション、各パラグラフがトピックセンテンスで始まっており、構成が非常に明瞭です。1段落1トピックの原則も守られており、可読性が高いです。

Diff内容との照合 ✓ PASS

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

記事内で引用されているHTML、JavaScript、CSSのコードブロックは、提供されたDiff情報およびPR Descriptionの内容と完全に一致しており、正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「pressed-state」や「HTMLテンプレート」などの技術用語が、文脈に沿って正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

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

ボタン移動に伴うpressed-stateロジックの簡略化や、テストヘルパーの堅牢化に関する説明は、Diffの内容と一致しており、技術的に正確です。

事実の突合 ✓ PASS

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

記事内の主張はすべてPRのDescriptionやDiffから裏付けが取れます。「将来的にツールバー設定を追加する」といった言及もPR本文に基づいており、ハルシネーションは一切見られません。

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

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

PR番号(#1066)やファイルパス(`src/elements/toolbar.js`など)が正確に記載されています。

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

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

記事タイトル「ツールバーのトップレベルに取り消し線・下線ボタンを移動」は、PRのタイトル「Top Level Strikethrough and Underline」と内容を正確に反映しています。

外部知識の正確性 ✓ PASS

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

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

時間表現の正確性 ✓ PASS

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

PR本文で言及されている将来の方針(「We'll add a toolbar configuration...」)を「今後の...」と正確な時間表現で記述しており、歪曲はありません。