diff --git a/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj b/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj index 4e6911414..0eeaf7945 100644 --- a/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj +++ b/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj @@ -161,7 +161,7 @@ - + diff --git a/src/UniGetUI.Avalonia/Views/Controls/InfoBar.axaml b/src/UniGetUI.Avalonia/Views/Controls/InfoBar.axaml index a4f33a00a..e068b8328 100644 --- a/src/UniGetUI.Avalonia/Views/Controls/InfoBar.axaml +++ b/src/UniGetUI.Avalonia/Views/Controls/InfoBar.axaml @@ -27,7 +27,10 @@ _border.CornerRadius = value; } + // Base (unfocused) thickness as assigned by the consumer. Grouped cards use a + // partial thickness like "1,0,1,1" to share a divider with the card above; we + // must remember it so we can restore it when focus leaves. + private Thickness _baseBorderThickness = new(1); + public new Thickness BorderThickness { get => _border.BorderThickness; - set => _border.BorderThickness = value; + set + { + _baseBorderThickness = value; + // While focused the border is forced complete (see GotFocus); don't clobber it. + if (!_border.Classes.Contains("settings-card-focused")) + _border.BorderThickness = value; + } + } + + // A focused card needs a border on all four sides, even when its base thickness omits + // the top (grouped cards). The accent focus style can't supply this: BorderThickness is + // a local value on _border, which wins over the style setter — so we set it here instead. + private static Thickness FocusedBorderThickness(Thickness baseThickness) + { + double t = Math.Max(Math.Max(baseThickness.Left, baseThickness.Right), + Math.Max(baseThickness.Top, baseThickness.Bottom)); + return new Thickness(Math.Max(t, 1)); } // ── Constructor ──────────────────────────────────────────────────────── @@ -216,8 +237,17 @@ public SettingsCard() PointerPressed += OnPointerPressed; KeyDown += OnKeyDown; - GotFocus += (_, _) => { if (_isClickEnabled) _border.Classes.Add("settings-card-focused"); }; - LostFocus += (_, _) => _border.Classes.Remove("settings-card-focused"); + GotFocus += (_, _) => + { + if (!_isClickEnabled) return; + _border.Classes.Add("settings-card-focused"); + _border.BorderThickness = FocusedBorderThickness(_baseBorderThickness); + }; + LostFocus += (_, _) => + { + _border.Classes.Remove("settings-card-focused"); + _border.BorderThickness = _baseBorderThickness; + }; SyncAutomationProperties(); } diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml.cs index dd0b43daf..c12270c43 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml.cs @@ -158,7 +158,6 @@ private void ApplyLayoutForCurrentSize() MainGrid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star); ScreenshotsBorder.Height = _vm.HasScreenshots ? 320 : 150; - InstallOptionsExpander.IsExpanded = true; } else { @@ -169,7 +168,6 @@ private void ApplyLayoutForCurrentSize() MainGrid.ColumnDefinitions[1].Width = new GridLength(0); ScreenshotsBorder.Height = _vm.HasScreenshots ? 225 : 130; - InstallOptionsExpander.IsExpanded = false; } } diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml b/src/UniGetUI.Avalonia/Views/MainWindow.axaml index acdd530a8..e3c97175c 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml @@ -22,7 +22,7 @@ via styles (opacity) so the .focus-within setter wins over the base. -->