Repository navigation
[Component Audit] ContextMenu: make pointer and touch evidence trustworthy - #7691
Merged
cixzhang merged 4 commits intoOct 19, 2026
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
AI review status for this pull request.
|
Contributor
PR Analysis Report
|
cixzhang
force-pushed
the
night-watch-component-audit/ContextMenu/2026-10-19
branch
from
October 19, 2026 10:53
303c6e9 to
40140f0
Compare
cixzhang
deleted the
night-watch-component-audit/ContextMenu/2026-10-19
branch
October 19, 2026 12:17
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
User impact
Developers can now trust ContextMenu's docs and browser evidence: the docs describe the two mutually exclusive content modes, and the review story opens the pointer menu at its real trigger instead of at page origin. The exact-head evidence covers pointer and touch presentations across themes, RTL, selectable states, and narrow screens without changing component runtime behavior or public API.
Audit result
core/ContextMenu4d200b246cd04f35399afd13f1d15bd596437bbfbcb6130def046671741c9216258018ba5cb2144c1.16.6Current authority applied:
architecture:component-theming-surface,architecture:interaction-modality,architecture:layer-runtime,architecture:public-component-api,family:overlay-dismissal,spec:AST-020, plus WCAG 2.2 A/AA.component:ContextMenuis draft and is used as observational context only.Findings and remediations
architecture:interaction-modalityINV4: a long press can open the menu and then close it as the finger lifts, removing the touch path. The separate objective fix is #7308; this audit does not duplicate it.module:DropdownMenu/useMenuPressAR1 and FR2: a pointer-opened menu focuses and highlights the first row before the pointer moves. The separate objective fix is #7303; this audit does not duplicate it.architecture:public-component-apiconsumer-doc projection:ContextMenu.doc.mjsmarkeditemsunconditionally required even though the public TypeScript union requires exactly one ofitemsandmenuContent. Both entries now state the exclusive choice; the[docs]Changeset publishes the correction.Component audit score
context-menusurfaces; Neutral and Butter light/dark framesExact-head browser evidence
CI run · 18-frame artifact
bcb6130.FR5 evidence inventory
The closed inventory starts from
ContextMenu/index.ts, the discriminated data/compound types, consumer docs, source branches, tests, and stories. It covers:context-menutarget on pointer/touch surfaces and delegated DropdownMenu, BottomSheet, and List ownership.Equivalent DropdownMenu/List/BottomSheet-owned rendering is delegated to those component owners rather than rescored as ContextMenu implementation. The retained long-press and pointer-open gaps are explicit above; no inventory row disappears because it is unresolved.
Needs Review
No new product decision is introduced. The retained findings already have separate objective fixes. The draft component record remains non-authoritative and is not amended by this audit.
FR10 eligibility report
{ "version": 1, "component": "core/ContextMenu", "mode": "nightly", "rubricVersion": "1.16.6", "repositoryBase": "4d200b246cd04f35399afd13f1d15bd596437bbf", "repositoryHead": "bcb6130def046671741c9216258018ba5cb2144c", "componentContract": {"id": "component:ContextMenu", "authority": "draft", "backfillInThisPr": false}, "inventory": {"closed": true, "renderedFrames": 18, "axeViolations": 0}, "remediations": [ {"id": "exclusive-content-mode-doc", "kind": "doc-drift", "evidence": ["public TypeScript union", "doc tests", "Changeset"]}, {"id": "trigger-relative-story", "kind": "evidence-fix", "evidence": ["real right-click frames", "LTR/RTL pointer-edge assertions"]} ], "unresolved": {"objective": ["#7303", "#7308"], "manual": []}, "approvals": {"specOwner": "success; no knowledge records changed", "privateExactHeadSelfReview": "clean after PR-body refresh"}, "checks": "exact-head CI running; merge only when every context is green", "verdict": "manual-merge-eligible-when-green", "reasons": ["spec:AST-029 FR11 auto-merge inactive", "one retained pre-existing BLOCK does not worsen in this PR"] }Scope and verification