Add OffScreenMargin compensation for macOS content overflow
Details
If OffScreenMargin (window shadow area) has non-zero bottom value,
apply it as bottom margin on the main content Grid. On macOS, the
layout area can extend into the shadow region, causing plugin
ScrollViewers to overflow the visible window boundary.
Add layout diagnostics + ContentControl stretch + dynamic title bar height
Details
Added diagnostic logging on window open to capture actual
WindowDecorationMargin and OffScreenMargin values — this will reveal
if the macOS platform reports a different title bar height than our
hardcoded 28px (e.g., 38px on notch displays), causing content to
overflow the window bottom.
Also added explicit HorizontalContentAlignment and
VerticalContentAlignment="Stretch" on the plugin ContentControl to
ensure hosted views fill the available space.
If WindowDecorationMargin.Top differs from 28, the title bar spacer
row and border height are dynamically adjusted.
Fix content overflow: replace DockPanel with Grid for explicit height
Details
The DockPanel fill-child layout was not correctly constraining content
height with ExtendClientAreaToDecorationsHint, causing plugin views
(most visible on Dashboard Subsystems tab) to overflow the window
boundary by approximately the title bar height.
Replaced the root DockPanel with a Grid using explicit RowDefinitions
(28px title bar, Auto license banner, star content row). Grid star rows
provide deterministic height constraints independent of measurement
order, ensuring the content area fills exactly the visible space below
the title bar.
Fix Subsystems tab scroll: match Overview tab layout pattern
Details
The Subsystems tab used Border > ScrollViewer which broke scrolling.
The Overview tab uses a bare ScrollViewer directly in Grid.Row="2"
which works correctly. Matched that pattern:
- Removed Border wrapper around ScrollViewer
- ScrollViewer directly in Grid.Row="2" with IsVisible binding
- Padding="24,0,24,32" matching Overview tab exactly
Fix Unknown subsystem entries and scroll cutoff at bottom
Details
Two issues:
1. "Unknown" group with 5 entries: Plugin SDK calls via TrackedSdkProxy
triggered GetOrCreateState() before DashboardPlugin.CreateViewModelCore
registered the plugin subsystems. The fallback created entries with
DisplayName="Unknown", Category="Unknown".
Fix: GetOrCreateState now infers display name and category from the
subsystem ID pattern. "plugin.privstack.notes" → DisplayName="Notes",
Category="Plugin". Non-plugin IDs get Category="Other" with the raw
ID as name. Register() now uses AddOrUpdate so explicit registration
from DashboardPlugin overwrites auto-created entries with the
authoritative PluginMetadata.Name.
2. Bottom scroll cutoff: Increased ScrollViewer bottom padding from 80
to 120 to clear the macOS dock + app status bar.
Get notified about new releases