Skip to content

[Bug]: Android: composer @ picker cannot be scrolled, so results past the fourth are unreachable #15658

Description

@tris203

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/mobile

Steps to reproduce

  1. On Android, open a thread and focus the composer.
  2. Type @ plus a query that returns more rows than fit in the picker, e.g. @Rev in a project with several matching threads and files.
  3. Try to scroll the picker by swiping up inside it.

Expected behavior

The list scrolls, so rows below the fold can be reached.

Actual behavior

Nothing moves. The picker is capped at 180px, the fifth row is cut off at the bottom edge, and everything beneath it is unreachable. Tapping a visible row still works.

Impact

Major degradation or frequent failure. Only the first four results can be picked. With @, up to five thread matches are listed ahead of files, so a short query can leave no file reachable at all.

Version or commit

main @ 4ee6bfd

Environment

Android 16 emulator (Pixel), T3 Code Dev client built from the commit above. Originally noticed in the installed mobile app. iOS not tested.

Screenshots

After swiping up inside the picker; it is unchanged, with the fifth row still clipped:

Composer picker with the fifth row clipped after a swipe

Suspected cause (not confirmed)

ThreadComposer.tsx renders the popover in a wrapper that sits outside its parent's bounds:

<View className="absolute inset-x-0 bottom-full z-10 mb-2">
  <ComposerCommandPopover ... />

On Android, native touch dispatch does not deliver touches to children outside their parent's bounds, so the ScrollView inside ComposerCommandPopover never sees the drag, while React Native's own hit testing still resolves Pressable taps on the rows. That matches what I see: taps work, scrolling does not, and the picker rows are absent from the Android accessibility tree. I have not verified this by changing the layout.

If that is right, it is not specific to @: the same popover serves / commands, $ skills and # pull requests, and NewTaskDraftScreen uses it too. I only tested @ in an existing thread.

Workaround

Type more of the name so the wanted row is in the first four.

Activity

  1. juliusmarminge commented on Oct 4, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Triage

    Thanks for the careful report, @tris203. The taps-work-but-scrolling-doesn't detail and the accessibility tree observation lined up with what's in the code.

    What I found

    Your suspected cause matches main at 4ee6bfd50e.

    • In an open thread, ThreadComposer.tsx renders the picker in <View className="absolute inset-x-0 bottom-full z-10 mb-2">, which places it entirely above its relative parent. That parent is only as tall as the composer surface, so the popover sits outside its bounds. The menu is a ScrollView capped at max-h-[180px], which is why you see about four rows and a clipped fifth.
    • Taps still reach the Pressable rows through React Native's hit test, but the drag is a native ScrollView gesture and never arrives. The rows missing from the Android accessibility tree fit the same out-of-bounds layout, since nothing in the component marks them inaccessible.
    • This isn't limited to @. /, $, and # in an open thread use the same wrapper. NewTaskDraftScreen renders the popover in normal flow (mb-2), so it probably doesn't happen there. iOS is unconfirmed.

    This is separate from #15659 (the "Files" heading) and #15156 (the picker closing on a space).

    Likely fix area

    • Put the picker inside a parent whose bounds actually contain it. OverlayPortal is the existing Android path for menus that need to escape the composer.
    • Padding composerOverlayRef in ThreadDetailScreen.tsx probably isn't the way to do it, because that view's height also sets the thread list's bottom inset, so extra padding would lift the conversation.

    A maintainer will decide on the fix direction.

  2. added
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions