Center search bar on full toolbar width, not leftover space
Details
The search pill was placed in Grid Column 1 (*) between the title
(Auto) and actions (Auto). Since different plugins have different
title/action widths, the * column's center shifted per plugin.
Fix: span the search pill across all 3 columns (ColumnSpan=3) with
HorizontalAlignment.Center so it centers on the full toolbar width.
Title and actions render on top in their Auto columns. The search bar
now stays dead-center across all plugins.
Center search pill in PluginToolbar using proper column definitions
Details
The toolbar row used a Grid with no column definitions, causing all children
to overlap in a single cell. Title (Left), search (Center), and actions
(Right) relied on HorizontalAlignment alone, which centers the search pill
relative to the full grid width rather than the space between title and
actions. Switch to ColumnDefinitions="Auto,*,Auto" so the search pill
centers within the remaining space between title and actions.
Center toasts on plugin content area, unify dismiss button style
Details
Move ToastContainer from the root Panel (centered on entire window)
into the Grid.Column=1 content area Panel so toasts center on the
plugin view regardless of sidebar state.
Dismiss button: match the type icon's layout — 16x16 panel, centered
vertically, symmetric margin (10,0,12,0 mirroring 12,0,10,0), same
StrokeThickness=2. Both icon and dismiss are now vertically centered
instead of top-aligned.
Add toast entrance/exit animations
Details
Entrance: slide down from -40px with BounceEaseOut easing (0.4s) for a
subtle bounce effect. Exit: slide up -30px + fade out (0.3s) before
removal from collection.
ToastService now raises DismissRequested so the container can animate
out before the toast is removed. Manual dismiss clicks, action button
clicks, and auto-dismiss timer all use the same animated path. A
HashSet tracks in-flight dismissals to prevent double-dismiss races.
Collapse empty toast label to prevent gap above message
Details
Hide the FriendlyLabel TextBlock when empty so the StackPanel
spacing doesn't push the message text down.
Get notified about new releases