ツールバーのトップレベルに取り消し線・下線ボタンを移動
取り消し線(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.rb の toggle_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ロジックの簡略化と、テストヘルパーのボタン位置非依存化が一体的に行われており、今後のツールバー設定機能追加に向けた基盤整備も兼ねた変更といえます。