Fix RSS feed refresh not detecting new articles
Details
Root cause: deduplication used URL-only comparison, but feeds where
all entries share the same link (e.g., changelog feeds pointing to
/changelog) would reject every article after the first as a "duplicate".
Fix: add EntryId field to RssArticle populated from the Atom <id> or
RSS <guid> element. Dedup now checks entry ID first (globally unique
per spec), falling back to URL comparison for feeds without entry IDs.
Pre-build backlink index at startup
Details
Adds BacklinkService.PreBuildIndexAsync() and calls it during the
deferred background services block in App.axaml.cs. This eliminates
the ~700ms cold-start delay when the user first clicks an item with
the Info Panel open, since the cross-plugin backlink index is already
warm by the time they interact.
The existing SemaphoreSlim guard in EnsureIndexBuiltAsync ensures
concurrent calls (from a user click racing the startup pre-build)
are safe. If the pre-build fails, the index falls back to lazy
initialization on first query (existing behavior).
Fix feed selector dropdown showing empty
Details
MenuFlyout.Opening event doesn't fire when wired via XAML attribute
because MenuFlyout is not a Control in the visual tree — it's an
AvaloniaObject attached via Button.Flyout. Wire the event in the
constructor instead, where we can directly access the flyout instance.
Fix RSS article list panel resize behavior
Details
Use proper ColumnDefinition with pixel width (340, min 280, max 600)
instead of Auto column with Border.Width — GridSplitter cannot resize
Auto columns. Add hover styling and resize cursor to the splitter for
a visible drag handle.
Fix empty feed selector dropdown
Details
The flyout was being populated via a Button.Click handler, but the
MenuFlyout renders before Click fires. Switch to the flyout's
Opening event so items are populated before the flyout is displayed.
Get notified about new releases