ci / docker (push) Successful in 17s
- swipe sideways to browse (track follows the finger, FLIP settle), flick up/down to vote Tinder-style with ghost fly-off and the next photo zooming in behind; votes and navigation commit synchronously on release — animations are pure decoration, so closing or keypresses mid-animation can't drop or duplicate an action - two fingers pinch-zoom the photo (springs back, never votes) - voting the last photo fades the modal out over the gallery - gesture engine extracted to useSwipe: per-move motion via direct DOM writes (no React render per touchmove), named threshold constants - touch devices: selection checkmarks always visible, nav arrows yield to swiping, finger-sized vote/rating targets, safe-area padding