diff --git a/apps/staged/src/lib/features/diff/DiffModal.svelte b/apps/staged/src/lib/features/diff/DiffModal.svelte index f0f4d34f..e97ec697 100644 --- a/apps/staged/src/lib/features/diff/DiffModal.svelte +++ b/apps/staged/src/lib/features/diff/DiffModal.svelte @@ -214,6 +214,9 @@ // Reset review state — the $effect will recreate it once the new commitSha resolves reviewHandle = null; + // Reset so the sidebar-order effect picks the first file after reload + initialSelectionApplied = false; + // Switch diff context (reloads file list) try { await diffViewer.switchContext(newScope, newCommitSha); @@ -740,6 +743,23 @@ : [...flattenTreeFiles(needsReviewTree), ...flattenTreeFiles(reviewedTree)] ); + // Once files finish loading, override the initial selection with the first + // file in sidebar order so the viewer and sidebar stay in sync. + // For non-readonly reviews, also wait for reviewedPaths to load so the + // needs-review / reviewed split is accurate before picking the first file. + let initialSelectionApplied = false; + $effect(() => { + if ( + !diffViewer.state.loading && + orderedFiles.length > 0 && + !initialSelectionApplied && + (readonly || !reviewHandle || !reviewHandle.state.loading) + ) { + initialSelectionApplied = true; + diffViewer.selectFile(orderedFiles[0].path); + } + }); + // ========================================================================== // Sidebar interactions // ==========================================================================