diff --git a/src/ClaudeDo.Ui/Design/IslandStyles.axaml b/src/ClaudeDo.Ui/Design/IslandStyles.axaml
index 6fc6c2f..20e7db1 100644
--- a/src/ClaudeDo.Ui/Design/IslandStyles.axaml
+++ b/src/ClaudeDo.Ui/Design/IslandStyles.axaml
@@ -414,7 +414,7 @@
diff --git a/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs b/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs
index a0f30aa..962450d 100644
--- a/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs
+++ b/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs
@@ -1,9 +1,11 @@
+using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Layout;
using Avalonia.Media;
+using Avalonia.Threading;
using Avalonia.VisualTree;
using ClaudeDo.Ui.ViewModels.Islands;
using ClaudeDo.Ui.ViewModels.Modals;
@@ -36,10 +38,26 @@ public partial class TasksIslandView : UserControl
// ShowDialog completes once the window is closed (CloseAction or OS close).
};
vm.ConfirmAsync = ShowConfirmAsync;
+ vm.SelectionChanged += (_, _) => ScrollSelectedIntoView();
}
};
}
+ // Bring the selected row into view — the task list is a plain ItemsControl with no
+ // built-in selection scrolling, so a programmatic select (e.g. Mission Control's
+ // "Open in app") would otherwise highlight a row that stays off-screen.
+ private void ScrollSelectedIntoView()
+ {
+ if (DataContext is not TasksIslandViewModel vm || vm.SelectedTask is not { } target) return;
+ Dispatcher.UIThread.Post(() =>
+ {
+ var match = this.GetVisualDescendants()
+ .OfType