Public Access
Merge branch 'claude/host-connection-top-bar-25d04e'
This commit is contained in:
@@ -332,7 +332,7 @@ search box in the titlebar, and session tabs as pills. Its light theme is not bu
|
|||||||
[`docs/design-import-gaps.md`](docs/design-import-gaps.md) — so the application is dark on both.
|
[`docs/design-import-gaps.md`](docs/design-import-gaps.md) — so the application is dark on both.
|
||||||
|
|
||||||
**A connected phone shows one bar and then the terminal.** The header, the session strip and the bottom
|
**A connected phone shows one bar and then the terminal.** The header, the session strip and the bottom
|
||||||
bar are collapsed while a shell is up, and a single 52-pixel row replaces them: back on the left, the
|
bar are collapsed while a shell is up, and a single 35-pixel row replaces them: back on the left, the
|
||||||
sessions as pills, and a `+` on the right offering the three connections this application can make — a
|
sessions as pills, and a `+` on the right offering the three connections this application can make — a
|
||||||
shell, a host's files over SFTP, or a bucket. The system back gesture does what the arrow does, and lowers
|
shell, a host's files over SFTP, or a bucket. The system back gesture does what the arrow does, and lowers
|
||||||
that menu first if it is open.
|
that menu first if it is open.
|
||||||
|
|||||||
@@ -511,7 +511,7 @@ go at 360dp:
|
|||||||
|
|
||||||
**The surface has since taken the whole screen.** `PhoneShell` collapses the header, the session strip
|
**The surface has since taken the whole screen.** `PhoneShell` collapses the header, the session strip
|
||||||
and the bottom bar while a terminal is showing — one binding on `IsShowingPages` each — and the screen
|
and the bottom bar while a terminal is showing — one binding on `IsShowingPages` each — and the screen
|
||||||
draws a 52-pixel bar in their place: back, the session pills, and a `+` raising a sheet with the three
|
draws a 35-pixel bar in their place: back, the session pills, and a `+` raising a sheet with the three
|
||||||
connections there are. That sheet is the head's first control that could be drawn over the renderer, so
|
connections there are. That sheet is the head's first control that could be drawn over the renderer, so
|
||||||
it collapses it rather than covering it, exactly as the desktop's palette does; whether Android's
|
it collapses it rather than covering it, exactly as the desktop's palette does; whether Android's
|
||||||
WebView actually composites above Avalonia content is still the unverified question recorded below, and
|
WebView actually composites above Avalonia content is still the unverified question recorded below, and
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ the chrome, hosts and terminals, file transfer, the vault, teams, and preference
|
|||||||
> | v2 element | What ships instead |
|
> | v2 element | What ships instead |
|
||||||
> | --- | --- |
|
> | --- | --- |
|
||||||
> | The **FORWARDING** screen: local/remote/dynamic rules, toggles, bytes transferred | **Nothing, said out loud.** `ISshConnection` offers `OpenShellAsync` and nothing else, so there is no tunnel for a rule to run through; `SyncEntityType.PortForward = 9` is still reserved and still unused. The MORE screen carries a paragraph naming the absence, for the reason the desktop keeps TEAMS in its rail. |
|
> | The **FORWARDING** screen: local/remote/dynamic rules, toggles, bytes transferred | **Nothing, said out loud.** `ISshConnection` offers `OpenShellAsync` and nothing else, so there is no tunnel for a rule to run through; `SyncEntityType.PortForward = 9` is still reserved and still unused. The MORE screen carries a paragraph naming the absence, for the reason the desktop keeps TEAMS in its rail. |
|
||||||
> | `23 ms · fwd 5432` on the terminal's connection line | ◆ **The line is gone, and what was real on it moved.** There was never an RTT to draw — SSH.NET measures none — and nothing forwards anything, so what shipped was the account and endpoint actually dialled. In v3 a connected phone draws one 52-pixel bar and then the terminal, so a second 36-pixel row naming the machine is exactly the chrome that surface exists to give back: the address is on the connecting card, where it is read before anything has answered, and the shell's own prompt says it afterwards. The two text-size buttons that shared the line are pinned at the end of the accessory row, outside its scroller, which is what the line was protecting them from. |
|
> | `23 ms · fwd 5432` on the terminal's connection line | ◆ **The line is gone, and what was real on it moved.** There was never an RTT to draw — SSH.NET measures none — and nothing forwards anything, so what shipped was the account and endpoint actually dialled. In v3 a connected phone draws one 35-pixel bar and then the terminal, so a second 36-pixel row naming the machine is exactly the chrome that surface exists to give back: the address is on the connecting card, where it is read before anything has answered, and the shell's own prompt says it afterwards. The two text-size buttons that shared the line are pinned at the end of the accessory row, outside its scroller, which is what the line was protecting them from. |
|
||||||
> | `ED25519` badge and `SHA256:kQ9f…Zw2M` on every keychain card | `Detail`, which is what is genuinely known *about* an item. Unchanged from the first import: no algorithm field, no fingerprint, and computing either means parsing armour the type stores verbatim. |
|
> | `ED25519` badge and `SHA256:kQ9f…Zw2M` on every keychain card | `Detail`, which is what is genuinely known *about* an item. Unchanged from the first import: no algorithm field, no fingerprint, and computing either means parsing armour the type stores verbatim. |
|
||||||
> | An `agent` chip on a key | Omitted. There is no agent of any kind — see the first import's Vault section. |
|
> | An `agent` chip on a key | Omitted. There is no agent of any kind — see the first import's Vault section. |
|
||||||
> | Snippet cards footed with `edge-eu-1 · today 10:58 · exit 0` | The command and its badge. Nothing records where a snippet ran, when, or what it returned; the shell it is typed into never reports back. |
|
> | Snippet cards footed with `edge-eu-1 · today 10:58 · exit 0` | The command and its badge. Nothing records where a snippet ran, when, or what it returned; the shell it is typed into never reports back. |
|
||||||
|
|||||||
@@ -947,7 +947,7 @@ scrolling the pills to either end does not move them.
|
|||||||
With a shell open, scroll the accessory key row to the far left and the far right.
|
With a shell open, scroll the accessory key row to the far left and the far right.
|
||||||
|
|
||||||
**Pass:** `A−` and `A+` stay pinned at the right-hand end throughout, separated from the keys by the
|
**Pass:** `A−` and `A+` stay pinned at the right-hand end throughout, separated from the keys by the
|
||||||
hairline, and both are at least 38 tall. At the smallest and largest sizes the one that can do nothing is
|
hairline, and both are at least 30 tall. At the smallest and largest sizes the one that can do nothing is
|
||||||
visibly disabled rather than silently inert.
|
visibly disabled rather than silently inert.
|
||||||
|
|
||||||
**Failure means:** they have been folded into the scrolling row — which is the arrangement the connection
|
**Failure means:** they have been folded into the scrolling row — which is the arrangement the connection
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
The arithmetic is why. Header 56, strip 46, bar 64, and the terminal's own two rows on top of that: at
|
The arithmetic is why. Header 56, strip 46, bar 64, and the terminal's own two rows on top of that: at
|
||||||
360dp the shell was framed by about a third of the display, all of it about somewhere the user was not.
|
360dp the shell was framed by about a third of the display, all of it about somewhere the user was not.
|
||||||
What takes their place is one 52-pixel bar drawn by the surface itself, carrying back on the left and
|
What takes their place is one 35-pixel bar drawn by the surface itself, carrying back on the left and
|
||||||
the sessions and a + across from it. See TerminalScreen.axaml.
|
the sessions and a + across from it. See TerminalScreen.axaml.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -40,8 +40,12 @@
|
|||||||
|
|
||||||
Both are outside the ScrollViewer deliberately. They are the way out of this surface and the way to
|
Both are outside the ScrollViewer deliberately. They are the way out of this surface and the way to
|
||||||
another host, and a tenth tab must not be able to push either of them off the right-hand edge.
|
another host, and a tenth tab must not be able to push either of them off the right-hand edge.
|
||||||
|
|
||||||
|
35 tall, a third off the 52 it opened at. Every height inside it came down with it — the icon squares
|
||||||
|
to 34, the pills to 30 — because a bar that shrank around controls that did not would only have moved
|
||||||
|
the clipping somewhere harder to see.
|
||||||
-->
|
-->
|
||||||
<Border Grid.Row="0" Height="52" Background="{StaticResource Chrome}"
|
<Border Grid.Row="0" Height="35" Background="{StaticResource Chrome}"
|
||||||
BorderBrush="{StaticResource Border}" BorderThickness="0,0,0,1">
|
BorderBrush="{StaticResource Border}" BorderThickness="0,0,0,1">
|
||||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||||
|
|
||||||
@@ -49,8 +53,12 @@
|
|||||||
Back, and it goes to the page this terminal was opened over rather than to Hosts by name. The
|
Back, and it goes to the page this terminal was opened over rather than to Hosts by name. The
|
||||||
system back gesture already does exactly that — see PhoneShell.axaml.cs — and an arrow that
|
system back gesture already does exactly that — see PhoneShell.axaml.cs — and an arrow that
|
||||||
landed somewhere else would be the second of two answers to one question.
|
landed somewhere else would be the second of two answers to one question.
|
||||||
|
|
||||||
|
Height overridden and width left alone. Button.icon is a 44 square, which is taller than this bar;
|
||||||
|
the 44 that matters is the horizontal one, since nothing in a row of this shape is hard to hit
|
||||||
|
above or below.
|
||||||
-->
|
-->
|
||||||
<Button Grid.Column="0" Classes="icon" Content="←" Margin="4,0,0,0"
|
<Button Grid.Column="0" Classes="icon" Content="←" Height="34" Margin="4,0,0,0"
|
||||||
Command="{Binding ShowScreenCommand}" CommandParameter="{Binding Screen}" />
|
Command="{Binding ShowScreenCommand}" CommandParameter="{Binding Screen}" />
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@@ -67,16 +75,18 @@
|
|||||||
<ItemsControl.ItemTemplate>
|
<ItemsControl.ItemTemplate>
|
||||||
<DataTemplate x:DataType="vm:TerminalTabViewModel">
|
<DataTemplate x:DataType="vm:TerminalTabViewModel">
|
||||||
<!--
|
<!--
|
||||||
44 tall, where the session pills on the shell strip are 34. The difference is the close
|
30 tall, in a bar of 35. It was 44, and the argument for 44 was that a pill you only
|
||||||
cross: a pill you only select can be chip-sized, and a pill containing the control that ends
|
select can be chip-sized while one containing the control that ends a shell cannot — the
|
||||||
a shell cannot. This head's rule is 44 and this is the one control on the phone that is both
|
close cross is the one control on this head that is both destructive and has neither
|
||||||
destructive and has no confirmation and no undo — see CloseTabAsync, which ends the session
|
confirmation nor undo. That argument is now carried by width rather than by height: the
|
||||||
the moment it is pressed.
|
cross keeps its full 44-pixel column, and what it lost is 14 pixels of vertical slack in a
|
||||||
|
row where nothing sits above or below it to be hit by mistake.
|
||||||
-->
|
-->
|
||||||
<Border Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
|
<Border Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
|
||||||
BorderThickness="1" CornerRadius="11" Height="44">
|
BorderThickness="1" CornerRadius="9" Height="30">
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<Button Classes="row" MinHeight="42" Padding="13,0" CornerRadius="11"
|
<Button Classes="row" MinHeight="28" Padding="11,0" CornerRadius="9"
|
||||||
|
VerticalContentAlignment="Center"
|
||||||
Command="{Binding $parent[views:TerminalScreen].((vm:MainWindowViewModel)DataContext).SelectTabCommand}"
|
Command="{Binding $parent[views:TerminalScreen].((vm:MainWindowViewModel)DataContext).SelectTabCommand}"
|
||||||
CommandParameter="{Binding}">
|
CommandParameter="{Binding}">
|
||||||
<StackPanel Orientation="Horizontal" Spacing="7" VerticalAlignment="Center">
|
<StackPanel Orientation="Horizontal" Spacing="7" VerticalAlignment="Center">
|
||||||
@@ -95,13 +105,21 @@
|
|||||||
The hairline down its left edge is not decoration. The two targets are flush inside one
|
The hairline down its left edge is not decoration. The two targets are flush inside one
|
||||||
pill, so without a visible seam there is nothing telling a thumb where "switch to this
|
pill, so without a visible seam there is nothing telling a thumb where "switch to this
|
||||||
shell" stops and "end it" starts.
|
shell" stops and "end it" starts.
|
||||||
|
|
||||||
|
Both alignments are stated, and the vertical one is not decoration either: Button.row
|
||||||
|
sets HorizontalContentAlignment and says nothing about the other axis, so the cross
|
||||||
|
was sitting against the top of its own column rather than in the middle of the pill.
|
||||||
|
It reads as a misprint, which for the control that ends a session is the wrong thing
|
||||||
|
to look like.
|
||||||
-->
|
-->
|
||||||
<Button Classes="row" MinHeight="42" Width="44" Padding="0" CornerRadius="0,11,11,0"
|
<Button Classes="row" MinHeight="28" Width="44" Padding="0" CornerRadius="0,9,9,0"
|
||||||
HorizontalContentAlignment="Center"
|
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
|
||||||
BorderBrush="{StaticResource BorderMid}" BorderThickness="1,0,0,0"
|
BorderBrush="{StaticResource BorderMid}" BorderThickness="1,0,0,0"
|
||||||
Command="{Binding $parent[views:TerminalScreen].((vm:MainWindowViewModel)DataContext).CloseTabCommand}"
|
Command="{Binding $parent[views:TerminalScreen].((vm:MainWindowViewModel)DataContext).CloseTabCommand}"
|
||||||
CommandParameter="{Binding}">
|
CommandParameter="{Binding}">
|
||||||
<TextBlock Text="×" Foreground="{StaticResource TextFaint}" FontSize="14" />
|
<TextBlock Text="×" Foreground="{StaticResource TextFaint}" FontSize="14"
|
||||||
|
HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||||
|
TextAlignment="Center" />
|
||||||
</Button>
|
</Button>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
@@ -121,8 +139,13 @@
|
|||||||
not a claim to make without a screenshot. It is answered here rather than dodged — this is a sheet
|
not a claim to make without a screenshot. It is answered here rather than dodged — this is a sheet
|
||||||
at the bottom of the screen and opening it collapses the renderer outright, exactly as the
|
at the bottom of the screen and opening it collapses the renderer outright, exactly as the
|
||||||
palette does on the desktop. Nothing is drawn over the WebView.
|
palette does on the desktop. Nothing is drawn over the WebView.
|
||||||
|
|
||||||
|
Plain Button.icon, the same as the arrow across from it, rather than the accent variant. The two
|
||||||
|
are a matched pair at either end of one bar — one leaves this surface, one adds to it — and an
|
||||||
|
accented + would rank itself above the way out. The accent fill belongs to the floating + on
|
||||||
|
HOSTS, which is the only action on its screen; this one is not.
|
||||||
-->
|
-->
|
||||||
<Button Grid.Column="2" Classes="icon accent" Content="+" Margin="0,0,4,0"
|
<Button Grid.Column="2" Classes="icon" Content="+" Height="34" Margin="0,0,4,0"
|
||||||
Command="{Binding OpenConnectSheetCommand}" />
|
Command="{Binding OpenConnectSheetCommand}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
@@ -192,7 +215,16 @@
|
|||||||
then release, because holding a modifier while typing is not possible one-thumbed.
|
then release, because holding a modifier while typing is not possible one-thumbed.
|
||||||
-->
|
-->
|
||||||
<!-- Only with a pane to type into: the keys send bytes at a session, and a connecting tab has none. -->
|
<!-- Only with a pane to type into: the keys send bytes at a session, and a connecting tab has none. -->
|
||||||
<Border Grid.Row="2" IsVisible="{Binding IsTerminalShowing}" Height="50">
|
<!--
|
||||||
|
33 tall rather than 50, a third off it like the bar at the top, with the keys inside coming down from
|
||||||
|
38 to 30 for the reason the pills did: a row that shrank around its own contents would clip them.
|
||||||
|
|
||||||
|
The five pixels above it are a gap and not a border. The renderer is a native child view, so nothing
|
||||||
|
Avalonia draws can sit on top of it — a hairline between the two would have to be a row of its own —
|
||||||
|
and a terminal whose last line of output is flush against a row of grey keys reads as one surface
|
||||||
|
that has gone wrong rather than as two that are different things.
|
||||||
|
-->
|
||||||
|
<Border Grid.Row="2" IsVisible="{Binding IsTerminalShowing}" Height="33" Margin="0,5,0,0">
|
||||||
<Grid ColumnDefinitions="*,Auto">
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
|
|
||||||
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto"
|
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto"
|
||||||
@@ -221,11 +253,11 @@
|
|||||||
-->
|
-->
|
||||||
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="5" Margin="8,0,12,0"
|
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="5" Margin="8,0,12,0"
|
||||||
VerticalAlignment="Center">
|
VerticalAlignment="Center">
|
||||||
<Border Width="1" Height="26" Background="{StaticResource Border}" Margin="0,0,3,0"
|
<Border Width="1" Height="18" Background="{StaticResource Border}" Margin="0,0,3,0"
|
||||||
VerticalAlignment="Center" />
|
VerticalAlignment="Center" />
|
||||||
|
|
||||||
<Button Classes="row" MinHeight="38" Height="38" MinWidth="40" Padding="0" CornerRadius="9"
|
<Button Classes="row" MinHeight="30" Height="30" MinWidth="40" Padding="0" CornerRadius="9"
|
||||||
HorizontalContentAlignment="Center"
|
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
|
||||||
Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
|
Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
Command="{Binding ShrinkTerminalFontCommand}"
|
Command="{Binding ShrinkTerminalFontCommand}"
|
||||||
@@ -233,8 +265,8 @@
|
|||||||
<TextBlock Classes="mono" FontSize="13" Text="A−" />
|
<TextBlock Classes="mono" FontSize="13" Text="A−" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button Classes="row" MinHeight="38" Height="38" MinWidth="40" Padding="0" CornerRadius="9"
|
<Button Classes="row" MinHeight="30" Height="30" MinWidth="40" Padding="0" CornerRadius="9"
|
||||||
HorizontalContentAlignment="Center"
|
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
|
||||||
Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
|
Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
Command="{Binding EnlargeTerminalFontCommand}"
|
Command="{Binding EnlargeTerminalFontCommand}"
|
||||||
|
|||||||
@@ -126,10 +126,13 @@ internal sealed partial class TerminalScreen : UserControl
|
|||||||
VerticalAlignment = VerticalAlignment.Center,
|
VerticalAlignment = VerticalAlignment.Center,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 44 wide as well as tall. The design draws them flexed across the width, which at 360dp
|
// 44 wide, and that is the number that matters: the design draws these flexed across the
|
||||||
// with ten keys is 32 pixels each — under every thumb-target guideline there is.
|
// width, which at 360dp with ten keys is 32 pixels each — under every thumb-target
|
||||||
|
// guideline there is. The height came down with the row it sits in, from 38 to 30, and it
|
||||||
|
// costs nothing a width does: the keys are a single row with the terminal above and the
|
||||||
|
// system's gesture bar below, so there is no neighbour a short press can land on instead.
|
||||||
MinWidth = 44,
|
MinWidth = 44,
|
||||||
Height = 38,
|
Height = 30,
|
||||||
Padding = new Thickness(10, 0),
|
Padding = new Thickness(10, 0),
|
||||||
CornerRadius = new CornerRadius(9),
|
CornerRadius = new CornerRadius(9),
|
||||||
Background = Palette("Panel"),
|
Background = Palette("Panel"),
|
||||||
|
|||||||
Reference in New Issue
Block a user