fix(app): clarify marketplace app actions

JO
1mo ago
+471-220

The app-detail toolbar used a settings gear for an action that opens the app's home page, and its icon buttons had no tooltips. This changes Open to an arrow-free browser-window icon, adds existing localized action names, and gives each button a 48px tap target around the existing circular treatment. Missing marketplace thumbnails now use an image-unavailable placeholder instead of an app-error symbol.

Chat tooltips normalize app names like the detail summary, and the toolbar keeps an 8px trailing inset as available actions change. The page retains its existing navigation, availability checks, chat loading behavior, and iOS share anchor. The toolbar and thumbnail are small production widgets exercised directly by hermetic tests; no new translation keys or runtime packages were added. The already-locked cache manager is declared as a direct test dependency to drive its real image stream without network or disk access.

Related to #3886. The proposed bounty remains unconfirmed; this PR does not assume assignment or payment.

Validation on pinned Flutter 3.44.5 / Dart 3.12.2:

  • cd app && bash test.sh: 1,885 passed, five existing skips; includes seven new widget tests for all actions/48px targets at 320px, semantic tooltips, chat loading, share origin, Spanish labels, encoded app names, loading-state spacing, and the real image failure stream with glyph-centering geometry.
  • cd app && bash scripts/analyze_ratchet.sh: passed with no baseline changes.
  • dart format --line-length 120 <changed Dart files> and git diff --check: passed.
  • make preflight and post-commit scripts/pr-preflight --pr-body-file: all 14 selected checks passed, including failure-class validation and the repository source-graph ratchet.
  • Normal pre-push gate passed, including Flutter generated-output verification; no tracked generated files changed.

Before/after screenshots render the actual components with fixture state at 320px and 390px; the before toolbar is extracted from the upstream source with inert fixture callbacks. This is isolated component evidence, not an authenticated marketplace or real iOS share-sheet run.

Failure-Class: none

Product invariants affected

none

Isolated UI evidence

At 390px; real production component rendering with fixture state:

Before (upstream presentation)After
Before: gear for Open and warning thumbnailAfter: browser icon for Open and missing-image thumbnail
320px layout, Open tooltip, and disabled loading action All five actions fit a 320px viewport Localized Open tooltip on the browser-window action Chat loading indicator with other actions still available