diff --git a/docs/manual-checks.md b/docs/manual-checks.md
index 1aa2226..97d69da 100644
--- a/docs/manual-checks.md
+++ b/docs/manual-checks.md
@@ -580,3 +580,114 @@ Repeat 6.1 and 6.3 with the endpoint blank, a real region, and path-style **off*
**Pass:** it lists. This is the path that exercises `RegionEndpoint.GetBySystemName` and virtual-host
addressing, neither of which MinIO covers.
+
+---
+
+## Phase 7 — Connecting without waiting, and the host list's pointer
+
+Connecting no longer holds the vault while it happens: a tab appears at once and the handshake runs behind
+it. The state machine around that is covered in `ShellFlowTests` — the tab, the card, the two kinds of
+failure, two connections at once — and the card itself is measured. What is left needs a real window: a
+native drag, a real menu popup, and a host that takes its time answering.
+
+### 7.1 The window stays usable while a connection is being made · **the point of the change**
+
+Connect to something that will take a while — an address that is routable but silent, so the handshake sits
+there rather than failing at once (a firewalled IP is ideal; `10.255.255.1` will do). While it runs: click
+around the host list, open KEYS, edit something, connect to a second host.
+
+**Pass:** everything works. The strip shows a tab named for the host with `connecting…` beside it, and the
+terminal area shows the host, the address it is dialling, and the same word.
+
+**Failure means:** the connect has ended up back inside `RunAsync`'s busy gate, which is the one thing
+`VaultViewModel.ConnectAsync` must never be put inside again.
+
+### 7.2 Navigating away during a connection unlights the tab
+
+While 7.1's connection is still running, click KEYS.
+
+**Pass:** the tab stays in the strip and stops being marked as the active one. No accent bar along its top
+edge while a page is showing.
+
+**Failure means:** the tab is bound to `IsSelected` again rather than to `IsShowing`, and the strip is
+claiming to be what the window is showing when it is not.
+
+### 7.3 A refusal ends up in the tab, not only in the status line
+
+Connect to a host with the wrong password, and navigate to PREFS before it answers.
+
+**Pass:** the tab goes grey and carries the refusal; selecting it shows the reason in the middle of the
+window with a CLOSE TAB button. Closing it returns to the page underneath.
+
+**Failure means:** a connection that failed while the user was elsewhere has left no trace anywhere they
+would look.
+
+### 7.4 An unknown host key still wins the window
+
+Connect to a host whose key is not yet approved.
+
+**Pass:** no tab is left behind, and the window is on HOSTS with the fingerprint prompt. Approving it
+connects and gives the tab a pane. This is 1.5 with the tab rework underneath it.
+
+### 7.5 Giving up on a connection, and what arrives afterwards
+
+Start 7.1's slow connection and press GIVE UP (or the tab's cross) while it is still trying.
+
+**Pass:** the tab goes at once. If the host does eventually answer, a tab appears for the session that
+opened — it is a real shell, and one running with nothing naming it would be worse than one that comes
+back.
+
+### 7.6 Dragging a host into a group · **least covered, like all drag and drop**
+
+Make two groups and file a host into one. Drag a host row onto another group's heading; onto a host row
+inside another group; and onto UNGROUPED.
+
+**Pass:** the row under the pointer washes accent while the pointer is over it, the cursor shows a move
+rather than a refusal, and the drop files the host — it moves under that heading and the counts on both
+headings change. Dropping onto its own group's heading is refused while still in the air.
+
+**Failure means:** headless Avalonia cannot synthesise a platform drag, so nothing about this gesture is
+automated. The write it performs is: `MovingAHostToAGroup_FilesItAndLeavesItSelected`.
+
+### 7.7 A click still selects, and a double click still connects
+
+Click host rows; drag one a few pixels without releasing; double-click one.
+
+**Pass:** a click selects, a small movement starts nothing, and a double click connects.
+
+**Failure means:** the 5-pixel threshold in `HostSidebar.axaml.cs` is not doing its job — the same failure
+as 2.16 on the other screen, and here it would make the list unusable.
+
+### 7.8 The highlight clears after a drag that goes nowhere
+
+Drag a host over a heading and release outside the list, or press Escape mid-drag.
+
+**Pass:** the wash goes away.
+
+### 7.9 The right-click menu acts on the row under the pointer
+
+With host A selected, right-click host B and choose Delete.
+
+**Pass:** the question names **B**. Then right-click a group heading.
+
+**Pass:** no menu opens at all, and the host selection has not moved.
+
+**Failure means:** a menu acting on the selection rather than on the row under the pointer deletes the wrong
+machine. `HostSidebarTests` covers both halves headlessly, so this is a confirmation that a real popup
+behaves as the headless one did.
+
+### 7.10 Clicking a host in the palette connects
+
+Ctrl+K, then click a result with the mouse rather than pressing Enter.
+
+**Pass:** the palette closes and the connection starts.
+
+### 7.11 A host or a bucket made now can be picked on FILES now
+
+With the files screen's picker open on an empty or short list, go to HOSTS and add a host — or to KEYS and
+add a bucket — then come back.
+
+**Pass:** the new one is in the picker, without locking and unlocking.
+
+**Failure means:** the screen has gone back to copying the vault's lists once at unlock. Covered by
+`TheTransfersScreen_FollowsTheVaultsHostList`; this is the version of it with a real picker in front of it.
diff --git a/src/DodoSSH.Client.Android/Views/PhoneShell.axaml b/src/DodoSSH.Client.Android/Views/PhoneShell.axaml
index 9a645f7..3e23d2e 100644
--- a/src/DodoSSH.Client.Android/Views/PhoneShell.axaml
+++ b/src/DodoSSH.Client.Android/Views/PhoneShell.axaml
@@ -77,7 +77,13 @@
-
+
+
-
+
+
@@ -143,7 +156,7 @@
The terminal is a surface rather than a page — see ShellSurface — so this one does not go
through ShowScreen. Its own command is on the shell.
-->
-
-
+
+
@@ -81,12 +83,33 @@
-
+
+
+
+
+
+
+
+
@@ -96,8 +119,9 @@
path, or reach the previous command. Ctrl and Alt latch — pressed once they apply to the next key and
then release, because holding a modifier while typing is not possible one-thumbed.
-->
+
+ BorderThickness="0,1,0,0" IsVisible="{Binding IsTerminalShowing}">
diff --git a/src/DodoSSH.Client.App/App.axaml b/src/DodoSSH.Client.App/App.axaml
index 321f146..985b678 100644
--- a/src/DodoSSH.Client.App/App.axaml
+++ b/src/DodoSSH.Client.App/App.axaml
@@ -452,6 +452,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/DodoSSH.Client.App/Views/ConnectingCard.axaml.cs b/src/DodoSSH.Client.App/Views/ConnectingCard.axaml.cs
new file mode 100644
index 0000000..c45ca1f
--- /dev/null
+++ b/src/DodoSSH.Client.App/Views/ConnectingCard.axaml.cs
@@ -0,0 +1,13 @@
+using Avalonia.Controls;
+
+namespace DodoSSH.Client.App.Views;
+
+/// What the terminal's rectangle holds while the selected tab has no pane.
+///
+/// No code of its own: everything it shows is the selected tab's, and the one button it carries is the
+/// shell's own close command. See the markup for why it exists at all.
+///
+internal sealed partial class ConnectingCard : UserControl
+{
+ public ConnectingCard() => InitializeComponent();
+}
diff --git a/src/DodoSSH.Client.App/Views/HostSidebar.axaml b/src/DodoSSH.Client.App/Views/HostSidebar.axaml
index 04eeb2d..c72f6a5 100644
--- a/src/DodoSSH.Client.App/Views/HostSidebar.axaml
+++ b/src/DodoSSH.Client.App/Views/HostSidebar.axaml
@@ -66,10 +66,33 @@
nothing focused and the keystrokes going nowhere.
-->
+
+
+
+
+
+
+
+
+
+
+
+
+ Text="↑ ↓ to choose · ENTER or click to connect · ESC to close" />
diff --git a/src/DodoSSH.Client.App/Views/QuickConnect.axaml.cs b/src/DodoSSH.Client.App/Views/QuickConnect.axaml.cs
index 6aa8085..5913483 100644
--- a/src/DodoSSH.Client.App/Views/QuickConnect.axaml.cs
+++ b/src/DodoSSH.Client.App/Views/QuickConnect.axaml.cs
@@ -33,6 +33,12 @@ internal sealed partial class QuickConnect : UserControl
// before a bubbling handler here ever ran. The palette owns them while it is open, so it says so at
// the point on the route where nothing else has had a chance yet.
AddHandler(KeyDownEvent, OnPaletteKey, RoutingStrategies.Tunnel);
+
+ // A click on a result connects to it, which is the pointer's version of what Enter already does.
+ // Tapped rather than PointerPressed: a press has not chosen anything yet — it is also the start of a
+ // drag across the list — and the ListBox has moved its own selection by the time a tap completes,
+ // which is what makes the handler below a matter of reading the selection rather than hit-testing.
+ Results.Tapped += OnResultTapped;
}
/// The box, so the caret can be put in it the moment the palette opens.
@@ -157,6 +163,27 @@ internal sealed partial class QuickConnect : UserControl
private void OnPaletteKey(object? sender, KeyEventArgs e) => HandleKey(e);
+ ///
+ /// Connects to the result that was clicked.
+ ///
+ ///
+ /// Goes through the shell's own command rather than reading the row out of the event, so the pointer and
+ /// the keyboard take exactly the same path: the palette closes, the hosts screen is put back in case the
+ /// connection has a question to ask, and the vault's connect command makes every refusal it already
+ /// makes. Fire-and-forget, as the sidebar's double-click is — the command reports its own failures onto
+ /// the status line and into the tab it opens.
+ ///
+ private void OnResultTapped(object? sender, TappedEventArgs e)
+ {
+ if (Shell is not { IsSearching: true, SelectedSearchResult: not null } shell)
+ {
+ return;
+ }
+
+ e.Handled = true;
+ _ = shell.ConnectToSearchResultCommand.ExecuteAsync(null);
+ }
+
///
/// Only a press on the wash itself. Presses on the card bubble through here as well, and closing on those
/// would make the palette impossible to click into.
diff --git a/src/DodoSSH.Client.App/Views/TerminalTabs.axaml b/src/DodoSSH.Client.App/Views/TerminalTabs.axaml
index 70d28b4..b727bee 100644
--- a/src/DodoSSH.Client.App/Views/TerminalTabs.axaml
+++ b/src/DodoSSH.Client.App/Views/TerminalTabs.axaml
@@ -56,23 +56,39 @@
event handled — so a left press on the cross does not also select the tab. It deliberately
does not handle any other button, which is exactly what lets a middle press bubble out of
the cross and reach the handler below.
+
+ Marked active on IsShowing rather than on IsSelected, which are not the same question. The
+ selection survives navigating away — that is what makes the strip a way back to a terminal —
+ so a tab lit while preferences filled the window would be a second "you are here" mark
+ pointing at something nobody can see. See TerminalTabViewModel.IsShowing.
-->