Repaint the phone's chrome, radii and accent to the v5 vocabulary

This commit is contained in:
jaap-jan committed 2026-08-08 15:22:04 +02:00
1 parent ca48e18b57
commit b931a06998
12 files changed
+168 -45

No files matched your search

@@ -178,7 +178,7 @@
<ScrollViewer Grid.Row="3" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"
IsVisible="{Binding IsConnected}" Margin="0,0,0,4">
<StackPanel Orientation="Horizontal" Spacing="4" Margin="14,0" VerticalAlignment="Center">
<Button Classes="row" MinHeight="36" Padding="9,0" CornerRadius="9"
<Button Classes="row" MinHeight="36" Padding="9,0" CornerRadius="10"
Command="{Binding RemoteUpCommand}">
<TextBlock Classes="mono" FontSize="12" Text="↑" Foreground="{StaticResource AccentText}" />
</Button>
@@ -188,7 +188,7 @@
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:CrumbViewModel">
<Button Classes="row" MinHeight="36" Padding="7,0" CornerRadius="9"
<Button Classes="row" MinHeight="36" Padding="7,0" CornerRadius="10"
Command="{Binding $parent[views:FilesScreen].((vm:TransfersViewModel)DataContext).GoRemoteCommand}"
CommandParameter="{Binding Path}">
<TextBlock Classes="detail" FontSize="11" Text="{Binding Name}" />
@@ -265,7 +265,8 @@
</Panel>
<!-- ============ what to do with the chosen entry ============ -->
<Border Grid.Row="5" IsVisible="{Binding IsConnected}" Background="{StaticResource Chrome}"
<!-- DeepChrome rather than Chrome, since v5 — see the remark on PhoneShell's vault header. -->
<Border Grid.Row="5" IsVisible="{Binding IsConnected}" Background="{StaticResource DeepChrome}"
BorderBrush="{StaticResource Border}" BorderThickness="0,1,0,0" Padding="12,10">
<StackPanel Spacing="9">
@@ -29,7 +29,9 @@
of "edit these six". The three that stay are the ones a count makes better rather than worse.
-->
<Border Background="{StaticResource Chrome}" BorderBrush="{StaticResource Border}"
<!-- DeepChrome rather than Chrome, since v5: this bar takes the vault header's own place, so it takes
the vault header's own surface too — see the remark on that header in PhoneShell.axaml. -->
<Border Background="{StaticResource DeepChrome}" BorderBrush="{StaticResource Border}"
BorderThickness="0,0,0,1" Padding="6,0" Height="56">
<Grid ColumnDefinitions="Auto,*,Auto,Auto">
@@ -68,7 +68,7 @@
of a selection and ticking it is a thing this screen supports rather than merely survives.
-->
<Border Grid.Row="0" Margin="14,10,14,4" Background="{StaticResource Field}"
BorderBrush="{StaticResource BorderMid}" BorderThickness="1" CornerRadius="11" Height="44">
BorderBrush="{StaticResource BorderMid}" BorderThickness="1" CornerRadius="10" Height="44">
<Grid ColumnDefinitions="Auto,*">
<TextBlock Grid.Column="0" Text="⌕" Foreground="{StaticResource TextFaint}" FontSize="13"
Margin="13,0,0,0" VerticalAlignment="Center" />
@@ -974,7 +974,10 @@
<Grid IsVisible="{Binding IsEditing}" RowDefinitions="Auto,*"
Background="{StaticResource Canvas}">
<Border Grid.Row="0" Background="{StaticResource Chrome}" BorderBrush="{StaticResource Border}"
<!-- DeepChrome rather than Chrome, since v5: "its header carries what the surrounding chrome no longer
can" below is still true, and now the header itself carries the darker chrome the rest of this
head's frame does — see the remark on PhoneShell's vault header. -->
<Border Grid.Row="0" Background="{StaticResource DeepChrome}" BorderBrush="{StaticResource Border}"
BorderThickness="0,0,0,1" Padding="6,0" Height="56">
<Grid ColumnDefinitions="Auto,*,Auto">
<Button Grid.Column="0" Classes="icon" Content="←" Command="{Binding CancelEditCommand}"
@@ -91,8 +91,8 @@
Not Border.card, and neither are its two counterparts on HOSTS and FILES: that class is a panel,
and this is a warning, so the background and the border are the warn pair rather than the chrome
one. What it does take is the radius the v2 ladder gives anything card-sized, which is what the
other two already draw.
one. What it does take is the radius the ladder gives anything card-sized — 12, unchanged from v2
to v5 — which is what the other two already draw.
-->
<Border IsVisible="{Binding HasLiveSessions}" Margin="0,22,0,0"
Background="{StaticResource WarnWash}" BorderBrush="{StaticResource WarnSoft}"
@@ -36,6 +36,18 @@
The .railentry styles live in this file because they are this control's own shape and nothing else wears
them; every colour in them is resolved from Theme/Palette.axaml by key, which is the rule that matters —
a rail that named its own blues is how a fifth surface colour ends up in the application.
── DEEP CHROME, SINCE v5 ───────────────────────────────────────────────────────────────────────────────
This rail's own surface moves from Sidebar to DeepChrome in this pass, matching the desktop's NavRail —
which is exactly what this control is standing in for on a wide phone, and which took the same v5b move
itself: Palette.axaml's own remark on DeepChrome names "the rail down the side" as one of the five things
that colour is for. Sidebar stays what a card sits on; this is the frame the cards sit inside, the same
distinction PhoneShell's header, strip and bottom bar are drawing at the same time.
The hover fill moves too, from Panel to Track — and Track rather than Hover, because Palette.axaml's own
remark on Track names "the rail row a pointer sits over" as one of the three things that colour is for,
literally. Panel was never named for this; it read close enough that nobody had gone looking for the
seam, which is exactly the kind of gap Track exists to close.
-->
<UserControl.Styles>
@@ -54,7 +66,7 @@
</Style>
<Style Selector="Button.railentry:pointerover /template/ ContentPresenter">
<Setter Property="Background" Value="{StaticResource Panel}" />
<Setter Property="Background" Value="{StaticResource Track}" />
</Style>
<Style Selector="Button.railentry.active /template/ ContentPresenter">
@@ -96,7 +108,7 @@
</Style>
</UserControl.Styles>
<Border Width="188" Background="{StaticResource Sidebar}"
<Border Width="188" Background="{StaticResource DeepChrome}"
BorderBrush="{StaticResource Border}" BorderThickness="0,0,1,0">
<!--
@@ -97,7 +97,16 @@
the surface. See PhoneShell.ShowsVaultHeader.
-->
<Panel Grid.Row="0" IsVisible="{Binding $parent[views:PhoneShell].ShowsVaultHeader}">
<Border Background="{StaticResource Chrome}" BorderBrush="{StaticResource Border}"
<!--
◆ DeepChrome rather than Chrome, since v5. The desktop's own titlebar and nav rail made the same
move in v5b — one step darker than Chrome, #0B0B14 against #10111E, so the frame reads as what
holds the glass rather than as another pane of it — and this header is the phone's equivalent
furniture: it is what the desktop's titlebar is, on the surface that has no window to carry one.
HostActionBar, which takes this header's own place while hosts are selected, and the editor's
header in HostsScreen, which the header stands down for, both move with it for the same reason;
see the remark on each.
-->
<Border Background="{StaticResource DeepChrome}" BorderBrush="{StaticResource Border}"
BorderThickness="0,0,0,1" Padding="14,0" Height="56">
<Grid ColumnDefinitions="Auto,*,Auto,Auto">
@@ -288,7 +297,10 @@
PhoneShell.ShowsShellStrip, which is where that "and" is made, Avalonia's bindings having none.
-->
<Panel Grid.Row="2" IsVisible="{Binding $parent[views:PhoneShell].ShowsShellStrip}">
<Border IsVisible="{Binding HasTabs}" Background="{StaticResource Sidebar}"
<!-- DeepChrome rather than Sidebar, since v5, joining the header and the bar above and below it:
the strip is chrome the same way they are — a frame around the screen rather than a pane of
it — and Sidebar is what a card sits on, which this row is not. -->
<Border IsVisible="{Binding HasTabs}" Background="{StaticResource DeepChrome}"
BorderBrush="{StaticResource Border}" BorderThickness="0,1,0,0" Height="46">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
<ItemsControl ItemsSource="{Binding Tabs}" Margin="12,0" VerticalAlignment="Center">
@@ -297,7 +309,7 @@
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:TerminalTabViewModel">
<Button Classes="row" MinHeight="34" Padding="13,0" CornerRadius="9"
<Button Classes="row" MinHeight="34" Padding="13,0" CornerRadius="10"
Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
BorderThickness="1"
Command="{Binding $parent[views:PhoneShell].((vm:MainWindowViewModel)DataContext).SelectTabCommand}"
@@ -341,8 +353,10 @@
shape of everything else already behind the hub. What is left is the two halves of using this
application, and the drawer holding the rest.
-->
<!-- DeepChrome rather than Chrome, since v5 — see the remark on the vault header, above, which this
bar is the foot of the same frame the header is the top of. -->
<Border Grid.Row="3" IsVisible="{Binding $parent[views:PhoneShell].ShowsBottomBar}"
Background="{StaticResource Chrome}" BorderBrush="{StaticResource Border}"
Background="{StaticResource DeepChrome}" BorderBrush="{StaticResource Border}"
BorderThickness="0,1,0,0" Height="64">
<Grid ColumnDefinitions="*,*,*">
@@ -36,8 +36,16 @@
good way to read a code and a bad way to copy one: a user who cannot select it will photograph the
screen, and that is a worse home for it than their clipboard.
-->
<!--
◆ CornerRadius 12, not 6. Its padding, 14,13, is Border.card's own — this box was already drawn to a
card's proportions, in every dimension but the corner — so under v2's ladder 6 was an outlier this
file never explained. It is worse than unexplained now: v5's ladder gives 6 to a chip, and a
full-width box holding the one secret this whole screen exists to show is not a chip wearing a
card's padding by coincidence. 12 is what a card-shaped box gets on this ladder, and this one always
was one.
-->
<Border Margin="0,20,0,0" Background="{StaticResource Field}" BorderBrush="{StaticResource BorderMid}"
BorderThickness="1" CornerRadius="6" Padding="14,13">
BorderThickness="1" CornerRadius="12" Padding="14,13">
<SelectableTextBlock Text="{Binding RecoveryCode}"
FontFamily="{StaticResource MonoFont}" FontSize="14"
Foreground="{StaticResource Accent}"
@@ -20,9 +20,17 @@
<StackPanel Spacing="10" HorizontalAlignment="Center" Margin="0,48,0,36">
<!--
Filled rather than outlined since v2, the same mark the header, the desktop titlebar and the
launcher icon carry. The radius is not picked: the mark runs 6 at 20 and 8 at 26, which is a
third of a unit per unit of tile and lands on 14 at 44 — and 14 is a rung of Phone.axaml's
ladder, the one for a block of monospaced output, which is what this is.
launcher icon carry. The radius is not picked: the mark runs 6 at 20 and 8 at 26, a third of a
unit per unit of tile, and lands on 14 at 44.
◆ That used to be a rung of Phone.axaml's own ladder too — 14, the one for a block of monospaced
output, which this glyph reads as — and the coincidence was worth a sentence: one fewer number
the ladder had to introduce. It is a coincidence no longer. v5's ladder moves output to 12 and
never reaches 14 at all, so the mark's own 6/8/14 progression stands on its own now rather than
borrowing a card- or output-shaped justification — a self-contained proportion for a badge that
answers to nothing but its own three sizes. Left at 14 rather than moved to 12 with everything
else: the ladder governs content surfaces, and this is a mark, sized off its own tile rather than
off what it holds.
-->
<Border Width="44" Height="44" CornerRadius="14" Background="{StaticResource Accent}"
HorizontalAlignment="Center">
@@ -156,8 +156,12 @@
</Border>
</StackPanel>
<!-- The command, on the surface every block of monospace in this design is drawn on. -->
<Border Classes="output" CornerRadius="9" Padding="11,9">
<!-- The command, on the surface every block of monospace in this design is drawn on.
No radius override any more: it diverged from Border.output's own 14 under v2 for a
smaller card-nested block, and now that the style's own value has moved to 12 there is
no gap left worth a second number for — it takes the class's, like every other output
block on this head. -->
<Border Classes="output" Padding="11,9">
<TextBlock Classes="mono" FontSize="11" Text="{Binding Preview}"
Foreground="{StaticResource Text}" TextTrimming="CharacterEllipsis" />
</Border>
@@ -174,8 +178,12 @@
second column to put it in. Both buttons name the terminal — "TYPE INTO pg-primary" — because on a
phone the tab strip may be scrolled away and "whatever is in the terminal receives this" is not a
sentence anybody should have to guess the subject of.
DeepChrome rather than Chrome, since v5: this bar is chrome furniture in the same sense the bottom
nav bar it sits above is — a raised strip of frame rather than a pane of content — and joins the same
DeepChrome decision PhoneShell's header, strip and bar made. See the remark there.
-->
<Border Grid.Row="4" IsVisible="{Binding HasSelection}" Background="{StaticResource Chrome}"
<Border Grid.Row="4" IsVisible="{Binding HasSelection}" Background="{StaticResource DeepChrome}"
BorderBrush="{StaticResource Border}" BorderThickness="0,1,0,0" Padding="14,12"
IsEnabled="{Binding !IsEditing}">
<StackPanel Spacing="9">
@@ -49,7 +49,10 @@
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="35" Background="{StaticResource Chrome}"
<!-- DeepChrome rather than Chrome, since v5: this bar is what the vault header, the strip and the
bottom bar collapse into while a shell is showing, so it takes their surface along with their
job — see the remark on the header in PhoneShell.axaml. -->
<Border Grid.Row="0" Height="35" Background="{StaticResource DeepChrome}"
BorderBrush="{StaticResource Border}" BorderThickness="0,0,0,1">
<Grid ColumnDefinitions="Auto,*,Auto">
@@ -87,9 +90,9 @@
row where nothing sits above or below it to be hit by mistake.
-->
<Border Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
BorderThickness="1" CornerRadius="9" Height="30">
BorderThickness="1" CornerRadius="10" Height="30">
<StackPanel Orientation="Horizontal">
<Button Classes="row" MinHeight="28" Padding="11,0" CornerRadius="9"
<Button Classes="row" MinHeight="28" Padding="11,0" CornerRadius="10"
VerticalContentAlignment="Center"
Command="{Binding $parent[views:TerminalScreen].((vm:MainWindowViewModel)DataContext).SelectTabCommand}"
CommandParameter="{Binding}">
@@ -116,7 +119,7 @@
It reads as a misprint, which for the control that ends a session is the wrong thing
to look like.
-->
<Button Classes="row" MinHeight="28" Width="44" Padding="0" CornerRadius="0,9,9,0"
<Button Classes="row" MinHeight="28" Width="44" Padding="0" CornerRadius="0,10,10,0"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
BorderBrush="{StaticResource BorderMid}" BorderThickness="1,0,0,0"
Command="{Binding $parent[views:TerminalScreen].((vm:MainWindowViewModel)DataContext).CloseTabCommand}"
@@ -362,7 +365,7 @@
<Border Width="1" Height="18" Background="{StaticResource Border}" Margin="0,0,3,0"
VerticalAlignment="Center" />
<Button Classes="row" MinHeight="30" Height="30" MinWidth="40" Padding="0" CornerRadius="9"
<Button Classes="row" MinHeight="30" Height="30" MinWidth="40" Padding="0" CornerRadius="10"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
BorderThickness="1" Focusable="False"
@@ -371,7 +374,7 @@
<TextBlock Classes="mono" FontSize="13" Text="A−" />
</Button>
<Button Classes="row" MinHeight="30" Height="30" MinWidth="40" Padding="0" CornerRadius="9"
<Button Classes="row" MinHeight="30" Height="30" MinWidth="40" Padding="0" CornerRadius="10"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
Background="{StaticResource Panel}" BorderBrush="{StaticResource BorderMid}"
BorderThickness="1" Focusable="False"
@@ -336,9 +336,11 @@
the thing the whole screen is about — a member can only be selected under one, so choosing who is the
only half left to make.
-->
<!-- DeepChrome rather than Chrome, since v5 — the same raised-bar decision SnippetsScreen and
FilesScreen make for their own selection bars; see the remark on PhoneShell's vault header. -->
<Border Grid.Row="4"
IsVisible="{Binding SelectedMember, Converter={x:Static ObjectConverters.IsNotNull}}"
Background="{StaticResource Chrome}" BorderBrush="{StaticResource Border}"
Background="{StaticResource DeepChrome}" BorderBrush="{StaticResource Border}"
BorderThickness="0,1,0,0" Padding="14,12">
<StackPanel Spacing="9">