@メンションポップオーバーが右端ではみ出す問題を修正

basecamp/lexxy

@mentions ポップオーバーが画面右端付近でトリガーされた際にビューポートからはみ出す問題を、CSS 1行の追加で修正しました。

背景

@mentions メニューは、入力カーソルが右端に近い位置にある場合、ポップオーバーが右方向にオーバーフローしてビューポート外にはみ出すことがありました。エディタが画面の右寄りに配置されていたり、ビューポートが狭い場合に発生しやすい問題です。

ポップオーバーの右端クリッピングには既に data-clipped-at-right 属性による制御が実装されており、inset-inline-end: 1ch で右端への吸い付け位置は調整されていました。しかしポップオーバー自体の 最大幅が制限されていなかったため、コンテンツ幅が大きい場合に左方向へはみ出す形でオーバーフローが発生していました。

技術的な変更

app/assets/stylesheets/lexxy-editor.css&[data-clipped-at-right] ブロックに max-inline-size の指定を1行追加しました。

変更前:

&[data-clipped-at-right] {
  inset-inline-start: unset;
  inset-inline-end: 1ch;
}

変更後:

&[data-clipped-at-right] {
  inset-inline-start: unset;
  inset-inline-end: 1ch;
  max-inline-size: calc(100% - 1ch);
}

max-inline-size: calc(100% - 1ch)100% はポップオーバーのオフセット親要素(エディタ本体)の幅を基準にします。inset-inline-end: 1ch で右端から 1ch のマージンを確保しているため、左端にも同量のマージンを残すよう calc(100% - 1ch) で最大幅を制約しています。これにより、ポップオーバーの幅がエディタ幅を超えることなく、ビューポート内に収まるようになります。

テスト側では test/browser/tests/prompts/mentions.test.js に回帰テストが追加されました。ビューポートを 400×600px、エディタ幅を 150px の右寄せに設定し、@ を入力してポップオーバーを表示させた後、getBoundingClientRect() で取得した leftright がそれぞれ 0 以上・400 以下であることを検証します。

設計判断

論理プロパティ(inline-size / inset-inline-* を一貫して使用している点が注目されます。max-width ではなく max-inline-size を選んでいることで、横書き・縦書きや RTL レイアウトへの対応を維持しています。既存の inset-inline-start / inset-inline-end による制御と統一されたアプローチです。

また、1ch という単位を inset-inline-endcalc(100% - 1ch) の両方で使用することで、右端マージンと最大幅の計算が常に一致する設計になっています。マージン値を変更する場合も1箇所の修正で済むわけではありませんが、視覚的な対称性と意図の明確さを優先した選択といえます。

まとめ

CSS の論理プロパティを一貫して活用しつつ、max-inline-size の1行追加という最小限の変更でビューポートオーバーフローを解消しています。回帰テストも同時に追加されており、狭いビューポートや右寄せレイアウトでの再発を防ぐ体制が整いました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
268a7170

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)→背景・技術的変更・設計判断(各論)→まとめ(結論)という「総論→各論→結論」の構成が記事全体で明確に適用されており、非常に分かりやすいです。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```css:ファイルパス)とPR番号のリンク記法([#913](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

CSSの論理プロパティやテストコードの解説など、専門知識を持つエンジニアを対象とした適切な技術レベルで書かれています。

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

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

各セクションが総論→各論の構成になっており、各段落がトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られていて読みやすいです。

Diff内容との照合 ✓ PASS

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

CSSのコード変更箇所(変更前・変更後)およびテストコードに関する説明が、提供されたDiff情報と完全に一致しており、正確に引用されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`max-inline-size`や`inset-inline-end`などの論理プロパティ、`ビューポート`、`オフセット親要素`といった技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

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

`max-inline-size`がオフセット親要素の幅を基準にすることや、`calc()`関数を用いた幅計算のロジックなど、技術的な説明が正確かつ論理的です。

事実の突合 ✓ PASS

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

記事内のすべての主張(問題点、修正方法、テスト内容)がPRのTitle, Description, Diff情報によって裏付けられており、ハルシネーションは検出されませんでした。

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

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

PR番号(#913)、テストコード内のビューポートサイズ(400x600px)やエディタ幅(150px)などの数値・固有名詞がすべて正確です。

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

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

記事のタイトル「@メンションポップオーバーが右端ではみ出す問題を修正」は、PRのタイトル「Fix @mentions menu rendering out of bounds near right edge」の内容を正確に反映しています。

外部知識の正確性 ✓ PASS

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

記事の内容はPR情報と、それを解説するための一般的なCSS知識に留まっており、PRに記載のないバージョン情報やリリース予定などの外部知識の捏造はありません。

時間表現の正確性 ✓ PASS

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

「修正しました」のように過去の事実として記述されており、PRの時間表現と一致しています。不正確な時間表現はありません。