ae8118d7df
The live catalog has advertised preview_url per theme since the store shipped, but the client never fetched it — rows were text-only. The modal now downloads each advertised preview PNG off the main thread (same AsyncComputeTaskPool + Tokio pattern as the catalog fetch and avatar image), decodes it into an Image asset, and renders a thumbnail sized by the theme's own card_aspect at the head of the row. Previews pop in as they arrive and are cached for the session, so reopening the store is instant. Failures log and leave the row text-only; the decode path is skipped entirely under MinimalPlugins (no Assets<Image>). solitaire_data grows ThemeStoreClient::fetch_preview with a 512 KB cap (previews carry no checksum — decorative only). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>