Render cloud images on web from their remote URL (#181)

* Render cloud strategy images from their URL on web

Opening a cloud strategy with an image on web threw: ImageWidget
dereferenced the null storageDirectory and called File.existsSync, and
hydration asked the media cache to write files.

One resolver now decides where an image's bytes come from:
strategyImageSourceProvider returns LocalImageFile, RemoteImageUrl,
ImageLoading or ImageFailed. The file lookup sits behind a conditional
import (lib/services/local_image_file*.dart); the web stub never finds a
file, so web always paints from the cloud URL. The placed image widget,
its full-screen overlay, the lineup carousel, the lineup media editor
and the lineup panel thumbnail all render from it, and the media cache
does nothing on a platform without image files.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Check image files on every build and paint lineup tiles as Images

Review found two problems in the image resolver:

- The cached provider only looked on disk again when the storage
  folder, remote asset, or first cache membership changed, so a file
  written or removed while an image was on screen stayed stale.
  watchStrategyImageSource now runs from each widget build, checks the
  disk every time as before, and rebuilds on any media cache change.
- The lineup media editor painted tiles with a DecorationImage, which
  cannot draw the web <img> fallback. Tiles now hold a clipped Image.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
ee96bb57faDara Adedeji committed on 9/25/2026, 7:15:50 AM· committed by GitHubparentfbf9ff3
10 files changedLine totals unavailable