Skip to content

docs(DropdownMenu): FR22 notes the still-mouse shield gap - #10148

Merged
cixzhang merged 4 commits into
meta:mainfrom
vjeux:docs/c19-dropdownmenu-fr22-still-mouse-gap
Nov 5, 2026
Merged

cixzhang merged 4 commits into
meta:mainfrom
vjeux:docs/c19-dropdownmenu-fr22-still-mouse-gap

Conversation

@vjeux

@vjeux vjeux commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Exact decision needed

Whether component:DropdownMenu records the still-mouse behavior that spec:AST-094 records for DropdownMenu.

Existing authority searched

  • spec:AST-094's Current-state impact, which fix(DropdownMenu): on a phone or a tablet, a tap while the menu enters is ignored, as on iOS #8458 extended to DropdownMenu: after a finger, the first press of a mouse that has not moved since lands on the entering presentation's shield and does nothing, where FR35 keeps today's behavior for a mouse (DEC-16).
  • component:DropdownMenu FR22, where a mouse holds nothing.
  • The shared input hold (Layer/inputHold.ts): only a mouse that moves with no button down lowers the shields.
  • Open pull requests editing DropdownMenu.spec.md: none edits these lines.

Decision

  • FR22 gains the record's FR-row note: "Implementation gap: after a finger, a still mouse's first press lands on the entering menu's shield and does nothing (spec:AST-094 FR35)."
  • Current-state impact lists it as a known defect against FR22's touch-only scope, and the summary table's readiness row names it, as for the record's other gaps.

Rejected alternatives

  • A requirement instead of a gap note: spec:AST-094 records the behavior as a deviation, since FR35 keeps today's behavior for a mouse (DEC-16).
  • Leaving FR22 as it is: it would stay silent on that deviation.

Claim scope and non-goals

Only a still mouse's first press after a finger, during that entrance. How a mouse opens the menu, the coarse-pointer scope and the timing are unchanged.

Evidence and implementation relationship

No code change: since #8458, DropdownMenu holds its entrance through the shared input hold, which behaves this way today.

Writing rubric results

  • R1 narration: none.
  • R2 research in the record: none.
  • R3 evidence naming a change: none.
  • R4 rejected alternatives over one line or outside a decision: none in the record.
  • R5 pull request or issue references remaining: none in the record.
  • R6 ruled open questions still listing options: none.

Scope

  • This PR contains specification records only.
  • It records observable behavior and preserves equivalent internal implementations.
  • Any named internal mechanism is intentionally public, names its dependent caller/system, and explains why an equivalent implementation would not satisfy the contract.
  • Verification states the evidence layer and failure signal without prescribing CI job/workflow topology.
  • It records one intentional durable decision, not a rescue for a separable tagalong.
  • The canonical knowledge owner, affected current claims, and overlapping open work are named; any ownership collision is resolved or called out for human decision.
  • Adjacent API, visual, accessibility, composition, and implementation facts remain outside scope unless this exact decision depends on them.
  • Public text and artifacts contain no internal Meta context.

Validation

  • pnpm check:knowledge
  • Prettier
  • git diff --check

FR22's row keeps its width, so no other row of the table changes.

`spec:AST-094` records that after a finger, the first press of a mouse
that has not moved since lands on the entering presentation's shield
and does nothing, where FR35 keeps today's behavior for a mouse. meta#8458
brought DropdownMenu under that, and FR22 now notes it as an
implementation gap.
@vercel

vercel Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
astryx Ready Ready Preview Nov 5, 2026 8:19pm UTC

Request Review

@astracat-bot

astracat-bot Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

AI review status for this pull request.

Review status Updated
🟢 Reviewed (for maintainers only) Nov 5, 2026, 8:20 PM UTC

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Nov 5, 2026
@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026
@cixzhang

cixzhang commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

/approve-spec a291c55

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes requested: the new FR22 note is accurate and matches the touch-presentations spec, but the record's own current-state summary does not list it yet.

  • Add the still-mouse gap to the record's Current-state impact list (docs/specs/components/DropdownMenu/DropdownMenu.spec.md, lines 369–385) and to the gap list in the Compatibility/readiness row (line 48), as the record does for its FR8, FR21, FR3 and FR17 gaps, so that summary no longer presents FR22's mouse clause as met.

The note itself checks out against the shared input hold: after a finger, a mouse press that comes before any mouse move lands on the entering menu's shield.

[Automated review]

| FR20 | With `header` or `footer` on a sub-menu (`DropdownMenuSubMenu`), its surface is a modal dialog named by its row (AR7), holding the header, the sub-menu's `role="menu"` (rows only), then the footer. It sits in a host `DropdownMenu` renders beside its menu, never inside a menu; under a root with no such host (`ContextMenu`) the sub-menu shows its rows alone. On a fine pointer the dialog is the flyout; on a compact touch display, the drilled-in view, which replaces the root's menu and regions until popped. A region keeps its own keys and presses. The rows are one Tab stop: Tab and Shift+Tab walk the header's controls, the rows, then the footer's, and wrap; from a deeper flyout, that flyout closes and the walk goes on from the rows. An open lands as for any sub-menu (FR11, FR12), not on a region. Escape in the dialog, outside an IME composition and unless a control there handled it, returns focus to the row and leaves the root open. A pointer leaving the flyout keeps it open until focus leaves, and it closes with the flyout holding its row. Without either prop nothing changes. | Current behavior; FR15; AR5 |
| FR21 | Under a finger, in the touch modes (`presentation` not pinned to `'popover'`), the pointer menu MUST grow out of the Trigger button on the theme's entrance duration and easing tokens and collapse back into it on the theme's exit duration and easing (`spec:AST-094` FR7, FR31, FR45), and MUST close as a pan that starts outside it begins (FR32); a pinned `'popover'` keeps the layer's own entrance. A pan dismissal is the menu's own close: focus that was in the menu returns to the Trigger button, whose `aria-expanded` turns false. A mouse keeps the layer's own entrance and exit. Implementation gap: the menu keeps the layer's own entrance and exit under a finger too, and has no pan-outside dismissal of its own. | `spec:AST-094` FR31, FR32; `family:overlay-dismissal` AV6 |
| FR22 | Under a finger, in the touch modes, where the primary pointer is coarse (a phone or a tablet), a tap or a drag that lands while the pointer menu enters MUST reach nothing: it closes nothing, scrolls nothing, moves no focus and clicks nothing (`spec:AST-094` FR35). The finger that opened the menu still picks the row it lifts on (FR8). Keys and assistive technology stay live. A mouse, a pinned `'popover'` and a finger where the primary pointer is fine (a touchscreen laptop) hold nothing, as for `component:Drawer`. | `spec:AST-094` FR35; `architecture:layer-runtime` |
| FR22 | Under a finger, in the touch modes, where the primary pointer is coarse (a phone or a tablet), a tap or a drag that lands while the pointer menu enters MUST reach nothing: it closes nothing, scrolls nothing, moves no focus and clicks nothing (`spec:AST-094` FR35). The finger that opened the menu still picks the row it lifts on (FR8). Keys and assistive technology stay live. A mouse, a pinned `'popover'` and a finger where the primary pointer is fine (a touchscreen laptop) hold nothing, as for `component:Drawer`. Implementation gap: after a finger, a still mouse's first press lands on the entering menu's shield and does nothing (`spec:AST-094` FR35). | `spec:AST-094` FR35; `architecture:layer-runtime` |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This gap also needs a bullet under Current-state impact (lines 369–385) and a mention in the Compatibility/readiness row (line 48), as the record does for its FR8, FR21, FR3 and FR17 gaps.

The record's Current-state impact gains the still-mouse gap that FR22
notes, and the readiness row of the summary table names it, so the
summary no longer reads FR22's mouse clause as met.
@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026
@cixzhang

cixzhang commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

/approve-spec a2c6018

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved pending CI: CI has not run on this head yet.

The FR22 implementation-gap note matches the touch-presentations spec's current record for DropdownMenu, and the still-mouse gap is now listed under Current-state impact and in the Compatibility/readiness row, as the earlier review asked.

  • Next step: mark the pull request ready for review, and a maintainer adds the ci:run label so CI runs on this fork branch.

[Automated review]

@vjeux
vjeux marked this pull request as ready for review November 5, 2026 19:40
@vjeux
vjeux marked this pull request as draft November 5, 2026 19:46
The Current-state impact entry for the still-mouse gap now reads as a
known defect against FR22's touch-only scope, with its fix: a press
whose own pointerType is mouse passes the shield.
@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026
@cixzhang

cixzhang commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 27a9fb9

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes requested: the still-mouse gap itself matches the touch-presentations spec, but the latest commit adds a cause and a planned fix to the record's Current-state impact entry.

  • In docs/specs/components/DropdownMenu/DropdownMenu.spec.md lines 379–380, remove "(a side effect of the press-ignore rule); the fix lets a press whose own pointerType is mouse pass the shield", because a record describes the system in the present tense without implementation steps (architecture:knowledge-contracts, rubric item R1), no record defines a "press-ignore rule", and the fix does not exist yet.

After that edit, update R1 in the writing rubric results; the spec gate then needs an engineering owner's /approve-spec <full head SHA> for the new head.

[Automated review]

Comment on lines +379 to +380
against FR22's touch-only scope (a side effect of the press-ignore rule); the
fix lets a press whose own pointerType is mouse pass the shield.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This cause and fix describe the implementation and a planned change, not the system: architecture:knowledge-contracts asks a record to describe the system in the present tense without implementation steps (rubric item R1), and no record defines a "press-ignore rule". Ending the bullet at "…against FR22's touch-only scope." keeps the gap and drops both.

The Current-state impact entry keeps the known defect against FR22's
touch-only scope, without a cause or a planned change.
@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026
@cixzhang

cixzhang commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 2f01337

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Nov 5, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved pending CI: CI has not run on this head yet. It starts once the pull request is marked ready for review and a maintainer adds the ci:run label.

The FR22 implementation-gap note, its Current-state impact entry and the readiness-row mention match the touch-presentations spec's current record of DropdownMenu's still-mouse gap, and the cause and planned-fix wording from the previous round is gone.

  • Non-blocking: #8870 adds a different FR22 row (Tab closing every open level) to this record from an older base, so one of the two will need another number when it rebases.

[Automated review]

@vjeux
vjeux marked this pull request as ready for review November 5, 2026 20:30
@cixzhang cixzhang added the ci:run A maintainer lets this outside contributor's pull request run CI (AST-030 FR17) label Nov 5, 2026
@cixzhang
cixzhang marked this pull request as draft November 5, 2026 20:35
@cixzhang
cixzhang marked this pull request as ready for review November 5, 2026 20:36
@cixzhang
cixzhang merged commit 8c5de42 into meta:main Nov 5, 2026
147 of 152 checks passed
@vjeux
vjeux deleted the docs/c19-dropdownmenu-fr22-still-mouse-gap branch November 5, 2026 23:47

This branch was successfully deployed

1 active deployment
Preview — 2f01337b Deployed Nov 5, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:run A maintainer lets this outside contributor's pull request run CI (AST-030 FR17) CLA Signed This label is managed by the Meta Open Source bot.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants