Fix context menu drop shadow clipped by popup window bounds
Details
The BoxShadow on MenuFlyoutPresenter and ContextMenu was invisible
because the Popup native window sizes exactly to its child, clipping
any shadow that extends outside the Border bounds.
Override the control templates to wrap the LayoutRoot Border in a Panel
with margin (12,6,12,22) matching the shadow extent (blur=24 offset-y=8).
This inflates the popup window, giving the shadow room to render. The
BoxShadow is now set directly on the template Border instead of via a
separate style selector.
Add fade-in animation to context menus and menu flyouts
Details
MenuFlyoutPresenter and ContextMenu now have a subtle 120ms open
animation: fade from opacity 0 to 1 with a -4px Y translate slide-in,
using CubicEaseOut easing. The animation runs each time the popup
enters the visual tree (i.e., each open).
Drop shadows were already defined (0 8 24 0 #40000000, 0 2 6 0
#28000000) — this adds the missing entrance transition.
Add Sign In button to update modal for expired sessions
Details
When the update download fails due to an expired token and refresh also
fails, the modal now shows a "Sign In" button that triggers the OAuth
PKCE flow directly from the update dialog. On successful auth, tokens
are persisted and the user can immediately retry the download without
navigating to Settings.
- Added SignInCommand to UpdateViewModel with full OAuth PKCE flow
- Updated UpdateModal.axaml auth notice: replaced "go to Settings" text
with an inline Sign In button + "Waiting for browser..." state
- Added IsAuthenticating property for button state management
Add client-side token refresh fallback for update downloads
Details
When the access token is rejected during update download, the client now
silently attempts to refresh it via /api/auth/refresh using the stored
refresh token. On success, new tokens are persisted and the download
retries. On failure, the access token is cleared and the UI shows
"Session expired — please sign in again" instead of a generic error.
New: PrivStackApiClient.RefreshAccessTokenAsync() + RefreshTokenResponse DTO.
Fix info panel hover zone blocking plugin content clicks
Details
The info-tab-hover-zone Border used a 36px-wide transparent background
with IsHitTestVisible=True at ZIndex=10, creating an invisible click
barrier across the entire right edge of the content area. This blocked
clicks on plugin UI elements positioned near the right edge (e.g., the
settings cog in Tasks).
Fix: Remove the wide transparent hit area. The tab button is now always
slightly visible (opacity 0.15) and becomes fully visible on hover of
the button itself. The parent border no longer has a background or
forced hit-test, so pointer events pass through to the plugin content
below.
Get notified about new releases