Eliminate sidebar icon flash, add item-card hover lift v1.39.1
Details
Fix the hover flash on sidebar nav icons and add hover lift to list items.
Sidebar flash root cause: two competing background transitions firing simultaneously
on pointer enter. The explicit `Button.nav-item:pointerover /template/ ContentPresenter`
style snapped the ContentPresenter background to ThemeNavHoverBrush immediately (no
transition) while the Button's own BrushTransition was still interpolating over 0.12s.
The instantaneous ContentPresenter repaint behind the icons was the flash. Additionally,
`Button.nav-item:pointerover Border.nav-icon-bubble` was transitioning the bubble to
ThemeNavHoverBrush (the same color as the button background), creating a double-transition
artifact on the composited layers. Both of those styles are removed — the Button's
BrushTransition on Background is the sole source of hover feedback, which is clean and
flicker-free.
New Border.item-card style in PrivStackTheme: lift-only hover effect for list items.
On pointer-over it applies translateY(-1px) via TransformOperationsTransition (200ms
CubicEaseOut) and deepens the BoxShadow from none to a two-layer shadow — same feel
as the card hover lift on dashboard stat-cards but at a smaller 1px travel distance
appropriate for compact list items. No background color change (items keep
ThemeSurfaceElevatedBrush throughout).
Resolve build errors and warnings from design system overhaul
Details
Three issues introduced by the v1.38.0 design system commit:
1. BoxShadow on Button (AVLN2000/AVLN2200) — removed invalid BoxShadow setter
from Button.view-toggle.active in both ViewToggleGroup.axaml (local style)
and PrivStackTheme.axaml (global style). BoxShadow is only valid on Border
and Panel-derived controls in Avalonia, not Button. The active segment is
visually distinguished by ThemeSurfaceElevatedBrush + SemiBold alone.
2. async void with [RelayCommand] (MVVMTK0039) — changed GoNext() return type
from async void to async Task in SetupWizardViewModel.cs so the generated
RelayCommand can properly await and surface exceptions.
3. Unused c_int import in privstack-ffi/src/cloud/mod.rs — this was reverted
in the companion Rust commit; the import is required for the android_log
constants added in that commit.
Embedded CA bundle + android_log infrastructure for cloud sync
Details
Switch S3 transport from rustls-native-certs to an embedded Mozilla CA bundle
(cacert.pem baked in at compile time via include_bytes!) so the AWS SDK can
establish TLS connections on Android where root CAs live in a non-standard
path (/system/etc/security/cacerts/) that rustls-native-certs does not
discover, causing a panic or empty trust store.
Changes:
- Add aws-smithy-http-client with rustls-ring feature; build a custom
HttpClient in S3Transport::build_client() that loads the embedded PEM
bundle into a TrustStore rather than relying on the host OS CA store.
- Switch reqwest to rustls-tls-webpki-roots (statically linked Mozilla roots)
for the API client to avoid the same problem on the HTTP side.
- Add android_log() helper in privstack-ffi/src/cloud/mod.rs that routes
INFO/ERROR messages to __android_log_write on Android and eprintln! on all
other platforms. All cloud_err() calls now use it instead of bare eprintln!.
- Add step-by-step android_log instrumentation inside
privstack_cloudsync_enter_passphrase (list_workspaces, user_id,
get_credentials, S3 download, deserialise+decrypt) so Android logcat shows
exactly which step fails during keypair loading.
- Bump workspace version 1.12.1 → 1.12.2.
Fix graph node colors not respecting active theme (v1.37.1)
Details
NeuronGraphControl.GetNodeBrush() looked up ThemeNodeXxxBrush resource
keys for 10 extended entity types (tag, company, contact_group, snippet,
rss, project, deal, transaction, credential, file), but none of the 7
theme files defined those keys. The fallback hardcoded hex colors were
always used instead, causing mismatched bright colors (e.g. cyan #06B6D4
snippets) on light themes like Sage where they looked jarring.
Added ThemeNodeXxxBrush blocks to all 7 themes:
Dark themes (DarkTheme, EmberTheme, SlateTheme) — vivid/saturated colors
optimized for near-black graph backgrounds:
Tag #9CA3AF · Company #F97316 · ContactGroup #A855F7
Snippet #06B6D4 · RSS #FB923C · Project #84CC16
Deal #EAB308 · Transaction #EC4899 · Credential #EF4444 · File #64748B
Light themes (LightTheme, AzureTheme, LavenderTheme, SageTheme) — muted
mid-tone variants that remain distinct and readable on near-white
graph backgrounds without appearing garish:
Tag #718096 · Company #DD6B20 · ContactGroup #7B2FC0
Snippet #0E7490 · RSS #C05621 · Project #4D7C0F
Deal #B45309 · Transaction #BE185D · Credential #B91C1C · File #475569
All 10 keys are now resolved via the DynamicResource lookup path rather
than the hardcoded fallback, ensuring graph node colors switch correctly
when the user changes themes at runtime.
Get notified about new releases