Skip to content

Detail view quality-of-life: tag wrap, dot/bottom swipe, R-18 blur fade

jedmund requested to merge jedmund/sao-paulo-v11 into main

Created by: jedmund

Summary

Four small fixes stacked into one PR.

  • Fix tag overflow below the metadata card. FlowLayout was sizing each pill with .unspecified, returning Text's full single-line width — long translated tags could overflow the row, and the VStack's reported height didn't include the real laid-out rows, so the card's rounded background ended before the last tags. FlowLayout now proposes concrete widths so pills wrap inside their capsule, clamps widths so nothing exceeds the row, and reports accurate total height.

  • Dot swipe → jump to next/prev post. UIPageControl picked up horizontal UISwipeGestureRecognizers that fire the same delegate hooks as the pager's edge overscroll, so users don't have to paginate through every image of a multi-image post to move in the feed.

  • Bottom-inset swipe for single-image posts. Promoted the gesture from the page control to a transparent bottomSwipeCatcher that fills the whole bottom inset strip, so single-image posts (where the page control is hidden) get the same "swipe anywhere below the image to traverse the feed" affordance. The page control is back to isUserInteractionEnabled = false and hit-testing routes cleanly to the catcher.

  • R-18 blur eases in after hero-pop. On dismiss, the source cell's isInFlight clears and the blur used to snap from 0 to 30pt in a single frame. A new blurProgress @State on IllustFeedCell flips to 0 on the true → false transition and eases back to 1 with a small delay — image settles first, blur + badge fade in after.

Test plan

  • Open a post with many tags including long translated ones — every tag sits inside the metadata card's rounded background
  • Multi-image post: swipe left/right over the dot indicators → jumps to next/prev post regardless of current image index
  • Single-image post: swipe in the strip below the image → same next/prev feed traversal
  • Swipe within the image's pager still pages images (multi) or traverses feed (single) as before
  • Dismiss an R-18 post back to the grid → source cell shows the image first, then blur + badge fade in ~0.3s later
  • Scroll a new R-18 cell into view → blur shows immediately (no fade on cold render)
  • Dismiss a non-R-18 post → no visible artifact from the blur-fade logic

🤖 Generated with Claude Code

Merge request reports

Loading