This repository has no description

Open comments over the card instead of pushing the gallery detail master

A feed card and the gallery detail screen render the same GalleryCard, so tapping through from a feed showed you what you were already looking at, one navigation later. iOS never makes that push: onNavigate in GalleryCardView is only the fallback for a missing onCommentTap, and every feed passes one. The feed, the hashtag feed and search now do the same — the comment button opens a sheet over the card, and nothing in a feed reaches the detail screen. It stays as the destination for deep links, notifications and the profile grid, where a thumbnail is all you have. GalleryCommentsViewModel backs the sheet for a gallery that has no detail screen behind it. The subject switches under one live view model as you open one card after another, the way StoryCommentsViewModel already worked, rather than each gallery getting an instance that outlives its sheet. It reports the thread size back so a card's count matches what the sheet just showed. Losing the push meant the card had to carry what the detail screen did. A photo tap now reveals its alt text over the photo, with the ALT badge iOS shows, since the tap that opens it is otherwise invisible; without a description the tap does nothing rather than flashing an empty panel. Your own gallery gets the delete entry in the overflow, and report is hidden there — it offered both before. Search results also gained the favorite toggle: SearchScreen never passed onFavoriteToggle and SearchViewModel had no toggleFavorite, so the heart was decorative, which mattered little while the card was a doorway to the detail screen and matters now that it is the whole view. Comment failures are shown inside the sheet rather than by the host. A snackbar raised behind a modal sheet is a message nobody reads; the story viewer wasn't even trying, dropping its comment errors on the floor. The feed's disk cache is now written back on every local change. Favoriting updated memory and the server but never the cache, so a cold start rendered the pre-favorite state and only corrected itself when the refresh landed — on a phone, 285ms of empty heart, and permanently if the refresh fails, since refreshIfStale then holds off for five minutes. That is why a gallery could read as unfavorited in the feed and favorited in its detail at the same time. Comment counts and deletes are filed the same way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>