Fix SafeHtmlLabel crash: cannot InvalidateVisual during render pass
Details
Remove InvalidateVisual() from the catch block — Avalonia throws
if a visual is invalidated during an active render pass. The
compositor will naturally re-render on the next frame without it.
Unify Tasks toolbar sizing to match ThemedDropdown Compact variant
Details
All toolbar controls now use consistent Compact sizing:
- Font: ThemeFontSizeXsSm (12px) everywhere (was ThemeFontSizeSm/13px
on project row, mixed elsewhere)
- Padding: 8,6 on all ComboBoxes, buttons, toggles (was 12,6 / 10,6 /
missing on filter ComboBoxes)
- CornerRadius: ThemeRadiusSm (6px) on all controls (was ThemeRadiusXs)
- VerticalAlignment=Center on all elements for proper row alignment
Also changed right-side filter WrapPanel to a horizontal StackPanel
with consistent Spacing="8" to eliminate the per-item margin hacks
(Margin="0,0,12,4") that caused uneven spacing.
Stop firing update checks when API is unreachable
Details
After 2 consecutive network failures (timeout, HTTP error, DNS
failure), the auto-update timer skips further checks instead of
burning 15 seconds on a doomed request each cycle. The counter
resets automatically when the API responds successfully.
Manual "Check for updates" always resets the backoff and fires
regardless, so the user can always retry.
Fix ComboBox bindings showing Avalonia.Controls.ComboBoxItem as text
Details
GitHub Sync: The project picker state was missing an error message
display, so GraphQL errors were silently swallowed. Added error
TextBlock and improved the auto-fetch catch to surface the error.
The SyncDirection ComboBox used ComboBoxItem wrappers with
SelectedItem bound to a string — replaced with x:String items.
Also normalize corrupted SyncDirection values on load.
Settings Overlay: Same ComboBoxItem binding bug on StatusCategory,
FieldType, and RuleTriggerType dropdowns. Replaced with ItemsSource
+ SelectedValueBinding + DisplayMemberBinding pattern using static
KeyValuePair arrays in the ViewModel.
Downgrade update check network failures from ERROR to WARNING
Details
When the cloud is offline (or the API is unreachable), the auto-update
timer fires repeatedly and logs a full ERROR stack trace for each
15-second timeout. These are expected connectivity failures, not bugs.
Split the catch block: HttpRequestException, TaskCanceledException,
and TimeoutException now log a one-line WARNING without the stack
trace. Actual unexpected errors (e.g., JSON parse, null ref) still
log at ERROR level and fire the UpdateError event.
Get notified about new releases