@@ -582,6 +582,28 @@ the host's and the shell cannot follow a path into it.
582582
583583## UI shell
584584
585+ ** What shipped, by paragraph.** The measurements below are long; these are the "As shipped"
586+ paragraphs that say what the player does with them, so a reader after the shell rather than the
587+ numbers can go straight there:
588+
589+ - ** The shell** — [ reskin phase 1] ( #system-font--inter-wins-only-because-fluent-asks-for-it-first )
590+ (system theme, accent and font, the "Decided and shipped" paragraph at the end of the font section)
591+ and [ reskin phase 2] ( #as-shipped-reskin-phase-2--the-window-shell ) : the 440×700 native-decorated
592+ window, the layer stack, the opaque-root and toolbar-inset rules.
593+ - ** The clock** — the "one timer" paragraph under
594+ [ reskin phase 2] ( #as-shipped-reskin-phase-2--the-window-shell ) : ` UiClock ` , the hygiene test that
595+ keeps ` DispatcherTimer ` out, and the elapsed-time progress bar.
596+ - ** The compositions** — [ reskin phase 3] ( #as-shipped-reskin-phase-3--now-playing-welcome-the-backdrop-the-prompt ) :
597+ Now Playing's narrow and wide layouts, Welcome, the blurred-art backdrop and the auto-connect prompt.
598+ - ** The settings card** — [ reskin phase 4] ( #as-shipped-reskin-phase-4--the-settings-card-and-the-stats-window ) ,
599+ first paragraph: the overlay card, its sections, and write-through with no Save.
600+ - ** The Stats window** — [ reskin phase 4] ( #as-shipped-reskin-phase-4--the-settings-card-and-the-stats-window ) ,
601+ "The Stats window": the separate diagnostics window and its refresh clock.
602+ - ** The backdrop** — [ reskin phase 5] ( #as-shipped-reskin-phase-5--the-living-backdrop ) : the two
603+ advertised roles, Ambient Glow, Breathing Art, the software-rendering guard and the measured cost.
604+ - ** The loose ends** — [ reskin phase 6] ( #as-shipped-reskin-phase-6--tray-parity-friendly-labels-the-macos-font ) :
605+ the tray menu at parity with the reference, the friendly picker labels, and the guarded macOS font.
606+
585607What the windowing layer actually does when asked to follow the desktop, and what the living-backdrop
586608effect loop costs. Measured on two dev machines with a throwaway probe kept under
587609` scripts/spike/ShellSpike/ ` so any of it can be re-run:
@@ -889,9 +911,14 @@ already sees, which is what takes the Flatpak from DejaVu Sans to the desktop's
889911portal or no key leaves ` DefaultFamilyName ` null, which is fontconfig's answer as before. The app logs
890912what it ended up with at start-up (` UI font: $Default is …, glyphs from …, fallback face … ` ), which
891913is the ` font ` probe's report without a second binary. Windows leaves the name null on the measurement
892- above; macOS leaves it null on the Helvetica measurement; the table above shows ` .AppleSystemUIFont ` is the
893- name that resolves to the system face and that an unresolvable name kills the process, so the macOS
894- override is a follow-up that ships with a resolve check (` PlatformSelection.MacOS.cs ` ).
914+ above. ** macOS: shipped, guarded** (reskin phase 6). The table above shows ` .AppleSystemUIFont ` is the
915+ name that resolves to the system face and that an unresolvable name kills the process, so
916+ ` PlatformSelection.MacOS.cs ` names it only after ` SKFontManager.Default.MatchFamily ` has returned a
917+ typeface for it — the same font manager Avalonia will ask — and leaves the name null, with a line on
918+ standard error, when it does not. The rule is ` Core/Platform/MacSystemFont.Select ` , a pure function
919+ over a resolver, pinned by ` Sendspin.Tests/MacSystemFontTests ` on both answers without a Mac. The
920+ start-up ` UI font: ` line is how the result is read on the machine: `$Default is .AppleSystemUIFont,
921+ glyphs from System Font` is the guard passing.
895922
896923
897924### Decorations and client-area extension — the hint does nothing under KWin
@@ -1430,3 +1457,29 @@ spike's, and is exactly why the guard exists. The loop itself held 62.5 fps in e
14301457` docs/screenshots/reskin/phase5-glow-{light,dark}.png ` (the window as the user had it, wide) and
14311458` phase5-breathing-dark.png ` ; the settings-card shot ` phase5-settings-backdrop.png ` needs a hand on
14321459the gear and is not in this commit.
1460+
1461+ ### As shipped (reskin phase 6) — tray parity, friendly labels, the macOS font
1462+
1463+ ** The tray menu** (` Services/TrayIconController.cs ` ) carries the Sendspin for Windows items in its
1464+ order, under this app's status line: Play / Pause, Next, Previous, Switch Group, a separator, Mute /
1465+ Unmute, a disabled ` Volume: NN % ` readout, a separator, Show Sendspin Player, Quit. Switch Group is
1466+ there whether or not the footer shows its button, because the menu is where a hidden button's
1467+ function still lives. The two Avalonia constraints in the file's remarks still hold, so state is
1468+ carried in labels — Play / Pause and Mute / Unmute follow the view model, the readout follows
1469+ ` Volume ` — and never in ` IsChecked ` . The transport items bind the view model's commands rather than
1470+ click handlers, which is what greys them all out together while there is no connection
1471+ (` NativeMenuItem ` follows ` CanExecute ` ); Mute goes through a new ` ToggleMuteCommand ` so the footer's
1472+ speaker button and the tray drive the one property. ` Sendspin.Ui.Tests/TrayMenuTests ` builds the
1473+ menu over the headless platform's null tray and reads the headers in order, then flips mute and
1474+ volume on the view model and reads them back.
1475+
1476+ ** The friendly labels.** ` Converters/ConnectionModeLabel.cs ` and ` AutoConnectPolicyLabel.cs ` follow
1477+ ` BackdropModeLabel ` : the picker binds the enum through to the setting and only the item template
1478+ goes through the converter, so "AdvertiseOnly" reads as "Advertise to servers, and let a server
1479+ connect" and "JustOnce" as "Just once". ` Sendspin.Ui.Tests/SettingLabelTests ` pins every member of
1480+ both enums, so a new member fails a test rather than showing raw; ` ConnectionMode.Auto ` , obsolete
1481+ on this SDK line and removed on the next, is the one member allowed to fall through, and the test
1482+ says so. ` EverySettingsComboBoxIsGuarded ` still counts five.
1483+
1484+ ** The macOS font** is the "shipped, guarded" paragraph at the end of the System font section
1485+ above. The one thing this phase could not verify from Linux is that line on a Mac.
0 commit comments