Skip to content

fix(ui): BranchCheckoutDropdown をポータル化し下端でフリップする (#1363)#1376

Merged
Kewton merged 2 commits into
developfrom
fix/1363-branch-dropdown-portal
Jul 17, 2026
Merged

fix(ui): BranchCheckoutDropdown をポータル化し下端でフリップする (#1363)#1376
Kewton merged 2 commits into
developfrom
fix/1363-branch-dropdown-portal

Conversation

@Kewton

@Kewton Kewton commented Jul 17, 2026

Copy link
Copy Markdown
Owner

概要

Closes #1363

Git ペインのブランチ切替ドロップダウンが absolute left-0 top-full z-20 mt-1 min-w-[12rem] max-h-64 overflow-y-auto で、ポータル未使用・フリップ無し・z-index が低いという3つの問題を抱えていた。

変更内容

# 問題 対応
1 Git ペインの overflow-y-auto スクロール枠でクリップされうる createPortal(..., document.body)fixed として描画
2 top-full から下方向へ最大 256px、フリップ無し → ペイン下部で下端見切れ 下に収まらなければトリガーの上へフリップspaceBelow を実測)
3 z-20 が低く他のオーバーレイに埋もれる 適切な z-index へ引き上げ

あわせて両軸をビューポート内に clamp する。

テスト

tests/unit/components/git/BranchCheckoutDropdown.test.tsx を新規追加。

品質チェック(exit code 実測)

項目 EXIT 結果
npm run lint 0 Pass
npx tsc --noEmit 0 Pass
CI=true npm run test:unit 0 Pass(587 files / 9954 tests・Errors なし)
npm run build 0 Pass

🤖 Generated with Claude Code

ブランチ checkout メニューは `absolute left-0 top-full z-20` でコンポーネント
自身の subtree 内に描画されており、3つの問題を同時に抱えていた。

1. 祖先による切り取り: Git ペインは `overflow-y-auto` のスクロールコンテナで
   あり、その外へ張り出すメニューは z-index に関係なくクリップされる
2. 下端はみ出し: `top-full` から常に下方向へ開きフリップが無いため、最大 256px
   (`max-h-64`) のメニューがトリガー位置次第でビューポート下端を突き抜け、
   末尾のブランチが選択できない
3. 低い stacking: `z-20` はペイン内の他のオーバーレイに負けうる

メニューを `createPortal(..., document.body)` で body 直下の `fixed` 要素として
描画し、表示時に `getBoundingClientRect()` でトリガーとメニューの実寸を測って、
下に入りきらず かつ 上の余白の方が大きいときのみ上方向へフリップする(通常の
下開きは維持)。上下・左右とも 8px マージンでビューポート内へ clamp し、
メニューがビューポートより大きい場合は開始辺 (top / left) 側を優先して到達可能に
する。z-index はオーバーレイ相当 (`z-50`) へ引き上げた。

ポータル化によりメニューは Git ペインのスクロールに追従しなくなるため、
`scroll` (capture: true) と `resize` で再測位してトリガーへのアンカーを保つ。
座標確定までは画面外へ退避させ (0,0) への一瞬の描画を防ぐ。ハンドラ・
data-testid・onCheckout 契約は不変。

回帰テストは jsdom に レイアウトエンジンが無いため getBoundingClientRect を
data-testid で判別してスタブし、ポータル先・下開き・上フリップ・両軸 clamp・
スクロール追従・z-index を pin する(修正前のコードでは 9 件中 7 件が失敗し、
残る 2 件は挙動非変更を担保するもの)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Kewton Kewton added the bug Something isn't working label Jul 17, 2026
@Kewton
Kewton merged commit 70366e2 into develop Jul 17, 2026
9 checks passed
@Kewton
Kewton deleted the fix/1363-branch-dropdown-portal branch July 17, 2026 15:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant