simulator-screen.tsx forwards pointer-down but stores only one active pointer and does not release it on unmount. A second pointer-down overwrites the first id, so its later up/cancel is ignored; pointer-down can also overlap a synthetic wheel gesture whose idle timer releases the newer id. The daemon retains the unmatched touch until an explicit up, leaving input stuck after multi-pointer, wheel-to-pointer, or section/device-switch interactions. Finish/cancel an active gesture before replacement and release it on cancellation/unmount.
simulator-screen.tsx forwards pointer-down but stores only one active pointer and does not release it on unmount. A second pointer-down overwrites the first id, so its later up/cancel is ignored; pointer-down can also overlap a synthetic wheel gesture whose idle timer releases the newer id. The daemon retains the unmatched touch until an explicit up, leaving input stuck after multi-pointer, wheel-to-pointer, or section/device-switch interactions. Finish/cancel an active gesture before replacement and release it on cancellation/unmount.