Repository navigation
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
AI review status for this pull request.
|
|
/approve-spec 0dbf6f3 |
PR Analysis Report🔎 Preview ·
|
| Component | Size | LoC |
|---|---|---|
| lab/Comments | 307.9 kB (+91 B) · 2.5 kB CSS (0) | — |
| lab/CommentPin | 52.9 kB (+88 B) · 1.2 kB CSS (0) | — |
| DropdownMenuSubMenu | 64.9 kB (+83 B) · 9.4 kB CSS (0) | — |
110 more components
| Component | Size | LoC |
|---|---|---|
| SideNavHeading | 67.1 kB (+82 B) · 10.7 kB CSS (0) | — |
| ChatComposer | 68.7 kB (+81 B) · 11.3 kB CSS (0) | — |
| AvatarGroupOverflow | 44.7 kB (+80 B) · 5.5 kB CSS (0) | — |
| lab/CommentThread | 302.7 kB (+80 B) · 2.4 kB CSS (0) | — |
| Carousel | 60.9 kB (+79 B) · 10.4 kB CSS (0) | — |
| DropdownMenu | 87.6 kB (+79 B) · 16.8 kB CSS (0) | — |
| Popover | 79.9 kB (+79 B) · 13.5 kB CSS (0) | — |
| TableSelectionToolbar | 61.6 kB (+79 B) · 12.5 kB CSS (0) | — |
| Thumbnail | 56.4 kB (+79 B) · 11.0 kB CSS (0) | — |
| MoreMenu | 87.8 kB (+78 B) · 16.8 kB CSS (0) | — |
| Toolbar | 39.8 kB (+78 B) · 7.9 kB CSS (0) | — |
| TopNavHeading | 66.6 kB (+78 B) · 10.5 kB CSS (0) | — |
| lab/ListInput | 96.6 kB (+78 B) · 1.6 kB CSS (0) | — |
| DateTimeInput | 199.4 kB (+77 B) · 18.2 kB CSS (0) | — |
| Typeahead | 74.7 kB (+77 B) · 12.2 kB CSS (0) | — |
| lab/CommentComposer | 139.2 kB (+77 B) · 1.9 kB CSS (0) | — |
| AppShell | 82.0 kB (+76 B) · 12.9 kB CSS (0) | — |
| MobileNav | 62.2 kB (+76 B) · 10.0 kB CSS (0) | — |
| Selector | 94.0 kB (+76 B) · 16.9 kB CSS (0) | — |
| Slider | 102.0 kB (+76 B) · 8.7 kB CSS (0) | — |
| lab/EmojiPicker | 81.6 kB (+76 B) · 751 B CSS (0) | — |
| Banner | 54.1 kB (+75 B) · 9.9 kB CSS (0) | — |
| BreadcrumbItem | 76.2 kB (+75 B) · 11.5 kB CSS (0) | — |
| Lightbox | 103.3 kB (+75 B) · 9.9 kB CSS (0) | — |
| Link | 49.0 kB (+75 B) · 6.9 kB CSS (0) | — |
| Calendar | 63.0 kB (+74 B) · 10.0 kB CSS (0) | — |
| DateInput | 177.1 kB (+74 B) · 16.5 kB CSS (0) | — |
| ToggleButton | 52.9 kB (+74 B) · 9.5 kB CSS (0) | — |
| TopNavMegaMenu | 61.4 kB (+74 B) · 11.2 kB CSS (0) | — |
| lab/DiffViewer | 78.4 kB (+74 B) · 2.1 kB CSS (0) | — |
| Button | 52.0 kB (+73 B) · 9.4 kB CSS (0) | — |
| InfoTip | 43.5 kB (+73 B) · 5.3 kB CSS (0) | — |
| MobileNavToggle | 52.4 kB (+73 B) · 9.4 kB CSS (0) | — |
| TimeInput | 153.8 kB (+73 B) · 15.6 kB CSS (0) | — |
| Tooltip | 26.1 kB (+73 B) · 4.3 kB CSS (0) | — |
| DrawerHeader | 55.1 kB (+72 B) · 12.3 kB CSS (0) | — |
| SideNavCollapseButton | 52.9 kB (+72 B) · 9.5 kB CSS (0) | — |
| Stepper | 53.7 kB (+72 B) · 9.6 kB CSS (0) | — |
| TabList | 40.4 kB (+72 B) · 6.4 kB CSS (0) | — |
| TabMenu | 63.5 kB (+72 B) · 10.5 kB CSS (0) | — |
| lab/SelectableCardGroup | 60.0 kB (+72 B) · 162 B CSS (0) | — |
| lab/TransferListSelector | 98.3 kB (+72 B) · 1.9 kB CSS (0) | — |
| richtext/RichTextEditor | 291.3 kB (+72 B) · 2.6 kB CSS (0) | — |
| ChatLayout | 55.3 kB (+71 B) · 9.9 kB CSS (0) | — |
| ChatSendButton | 52.5 kB (+71 B) · 9.4 kB CSS (0) | — |
| CheckboxList | 54.5 kB (+71 B) · 7.9 kB CSS (0) | — |
| IconButton | 52.1 kB (+71 B) · 9.4 kB CSS (0) | — |
| Pagination | 104.1 kB (+71 B) · 17.3 kB CSS (0) | — |
| Table | 100.8 kB (+71 B) · 17.3 kB CSS (0) | — |
| Avatar | 39.7 kB (+70 B) · 5.5 kB CSS (0) | — |
| BaseTypeahead | 62.3 kB (+70 B) · 10.4 kB CSS (0) | — |
| DateRangeInput | 87.0 kB (+70 B) · 12.2 kB CSS (0) | — |
| richtext/RichTextEditorToolbar | 245.2 kB (+70 B) · 454 B CSS (0) | — |
| ChatDictationButton | 52.6 kB (+69 B) · 9.5 kB CSS (0) | — |
| CodeBlock | 66.8 kB (+69 B) · 10.7 kB CSS (0) | — |
| HoverCard | 24.6 kB (+69 B) · 4.3 kB CSS (0) | — |
| MultiSelector | 89.5 kB (+69 B) · 16.4 kB CSS (0) | — |
| SegmentedControl | 89.7 kB (+69 B) · 6.8 kB CSS (0) | — |
| SideNavItem | 62.0 kB (+69 B) · 10.5 kB CSS (0) | — |
| StatusDot | 27.8 kB (+69 B) · 5.3 kB CSS (0) | — |
| TableCell | 92.5 kB (+69 B) · 17.0 kB CSS (0) | — |
| TopNav | 63.8 kB (+69 B) · 10.3 kB CSS (0) | — |
| TopNavMenu | 66.3 kB (+69 B) · 10.6 kB CSS (0) | — |
| richtext/RichTextView | 271.5 kB (+69 B) · 2.3 kB CSS (0) | — |
| charts/ChartTooltip | 158.0 kB (+68 B) · 423 B CSS (0) | — |
| FileInput | 64.5 kB (+68 B) · 10.7 kB CSS (0) | — |
| Markdown | 163.1 kB (+68 B) · 19.6 kB CSS (0) | — |
| NumberInput | 67.1 kB (+68 B) · 11.1 kB CSS (0) | — |
| lab/ChatReactionBar | 99.0 kB (+68 B) · 1.1 kB CSS (0) | — |
| lab/TourStep | 86.2 kB (+68 B) · 590 B CSS (0) | — |
| lab/TransferList | 91.3 kB (+68 B) · 1.7 kB CSS (0) | — |
| AlertDialog | 96.2 kB (+67 B) · 13.8 kB CSS (0) | — |
| AvatarGroup | 42.4 kB (+67 B) · 5.6 kB CSS (0) | — |
| ChatComposerInput | 66.7 kB (+67 B) · 10.7 kB CSS (0) | — |
| ChatLayoutScrollButton | 52.5 kB (+67 B) · 9.6 kB CSS (0) | — |
| DialogHeader | 54.8 kB (+67 B) · 10.9 kB CSS (0) | — |
| RadioListItem | 63.0 kB (+67 B) · 9.8 kB CSS (0) | — |
| SideNav | 81.7 kB (+67 B) · 10.8 kB CSS (0) | — |
| TableHeaderCell | 92.1 kB (+67 B) · 16.8 kB CSS (0) | — |
| TextArea | 58.1 kB (+67 B) · 9.2 kB CSS (0) | — |
| lab/ChatEmojiPicker | 97.9 kB (+67 B) · 773 B CSS (0) | — |
| BottomSheet | 63.1 kB (+66 B) · 7.5 kB CSS (0) | — |
| ChatComposerTokenElement | 66.7 kB (+66 B) · 10.7 kB CSS (0) | — |
| FieldLabel | 47.4 kB (+66 B) · 5.6 kB CSS (0) | — |
| Switch | 96.6 kB (+66 B) · 9.8 kB CSS (0) | — |
| Toast | 89.6 kB (+66 B) · 9.7 kB CSS (0) | — |
| Tokenizer | 86.1 kB (+66 B) · 18.1 kB CSS (0) | — |
| CheckboxInput | 60.1 kB (+64 B) · 9.1 kB CSS (0) | — |
| ContextMenu | 91.4 kB (+64 B) · 16.6 kB CSS (0) | — |
| InputGroup | 52.3 kB (+64 B) · 7.8 kB CSS (0) | — |
| lab/Schedule | 100.0 kB (+64 B) · 3.9 kB CSS (0) | — |
| charts/Chart | 180.5 kB (+63 B) · 494 B CSS (0) | — |
| CheckboxListItem | 66.1 kB (+63 B) · 10.9 kB CSS (0) | — |
| ComplexSelector | 66.2 kB (+63 B) · 11.4 kB CSS (0) | — |
| PowerSearch | 275.2 kB (+63 B) · 23.2 kB CSS (0) | — |
| ListItem | 65.1 kB (+59 B) · 10.9 kB CSS (0) | — |
| TextInput | 63.1 kB (+58 B) · 10.9 kB CSS (0) | — |
| Field | 50.7 kB (+57 B) · 7.2 kB CSS (0) | — |
| RadioList | 52.1 kB (+57 B) · 7.2 kB CSS (0) | — |
| CommandPalette | 59.7 kB (+1 B) · 12.4 kB CSS (0) | — |
| ChatMessageList | 23.9 kB (0) · 6.9 kB CSS (0) | — |
| ChatToolCalls | 27.8 kB (0) · 8.3 kB CSS (0) | — |
| CommandPaletteInput | 27.9 kB (0) · 7.5 kB CSS (0) | — |
| Heading | 8.2 kB (0) · 5.3 kB CSS (0) | — |
| Spinner | 20.5 kB (0) · 6.1 kB CSS (0) | — |
| Text | 7.6 kB (0) · 5.3 kB CSS (0) | — |
| Timer | 9.7 kB (0) · 5.9 kB CSS (0) | — |
| ProgressBar | 11.5 kB (−1 B) · 6.2 kB CSS (0) | — |
| charts/ChartLegend | 35.8 kB (−2 B) · 224 B CSS (0) | — |
| Timestamp | 23.2 kB (−2 B) · 9.7 kB CSS (0) | — |
Package size: @astryxdesign/core 6.82 MB packed (+888 B); no new dependencies.
API changes: none in this pull request
Committed API report behind this build: cli 19 rows, core 24 rows; run pnpm api:report.
Not run on this PR: add ci:run-visual, ci:run-a11y or ci:run-rtl to run them.
Generated by PR Enrichment workflow | View full report
There was a problem hiding this comment.
Requesting changes: the fix restores the keyboard height in the Safari focus pan it targets, but the new root-height floor makes a zoomed-out page report a keyboard that is not there.
layoutViewportHeight(packages/core/src/utils/layoutViewport.ts:49-52) compares the root's unscaled client height with the scaledinnerHeight * scalereading, so a page with nowidth=device-widthviewport or a fixedwidth=1024viewport now reads a 984–1,246 px keyboard with none shown (0 before), against AST-099 FR2; apply the floor only where the units match (for example at a visual-viewport scale of 1) and add a no-keyboard test for a zoomed-out page.- The ride formula in
packages/core/src/keyboard/README.md(line 96) still computes the keyboard's top asinnerHeight − height, which is now 40 px during Safari's focus pan instead of the 377 px the hook uses, so it should readlayoutViewportHeight(window) − height. - The Android claims (
resizes-contentstill reading 0, Chrome's toolbar-hidden height kept) and the scroll-clamp change rest on unit fixtures with assumed root heights, while AST-099 DEC-3 asks for emulator evidence for Android claims, so please add emulator readings (Chrome with Gboard and Firefox for Android) and a Simulator reading of the clamp state at the fixed head.
The four red-first unit cases and the Simulator capture show the focus-pan fix itself.
[Automated review]
0dbf6f3 to
00122d3
Compare
There was a problem hiding this comment.
Still requesting changes: the scale-1 gate restores the keyboard height during Safari's focus pan, but it lets a fixed-width page wider than the screen read a keyboard that is not there, and the Android readings the keyboard record requires are missing.
layoutViewportHeight(packages/core/src/utils/layoutViewport.ts:52-56) takes the root's client height whenever the scale is 1 andinnerHeightequals the visual viewport's height, so awidth=1024, initial-scale=1, user-scalable=no(orminimum-scale=1) page with no keyboard reads a 1,246 px keyboard in Chromium's Pixel 7 emulation where it read 0 before, against AST-099 FR2; also require the root to be as wide as the visual viewport, and add a no-keyboard test for a wider layout at scale 1.- The new branch also runs on Android, but the change has no emulator evidence, which AST-099's Platform support and DEC-3 require at the exact head before merge; please add keyboard-height readings in Chrome with Gboard (default and
resizes-content) and in Firefox for Android at the fixed head.
The red-first pan tests and the Simulator capture show the focus-pan fix itself.
[Automated review]
00122d3 to
280bac1
Compare
|
/approve-spec 280bac1 |
There was a problem hiding this comment.
Requesting changes: the scale-1 root floor now restores the keyboard height during Safari's focus pan and keeps a layout wider than the screen at no keyboard, but the Android emulator readings the keyboard record requires at this head are not on the pull request.
- The new branch in
layoutViewportHeight(packages/core/src/utils/layoutViewport.ts:54-61) also runs on Android, and AST-099's Platform support and DEC-3 make emulator evidence at the exact head a merge gate, so please post here the readings the description attributes to another run:innerHeight, the root's client height, the visual viewport and the module's keyboard height, keyboard up and down, in Chrome with Gboard (default andresizes-content) and in Firefox for Android.
The red-first pan tests, the new wide-layout tests and the Simulator capture cover the iOS fix itself.
[Automated review]
| expect(layoutViewportHeight(win)).toBe(377); | ||
| }); | ||
|
|
||
| it('keeps innerHeight where it is taller than the root, as in Chrome on Android with its toolbar hidden', () => { |
There was a problem hiding this comment.
This case and the resizes-content case above encode Android readings from assumed root heights. AST-099's Platform support makes emulator evidence at the exact head a merge gate, so please post the emulator's own readings at this head on the pull request: Chrome with Gboard (default and resizes-content) and Firefox for Android, keyboard up and down.
…pans to a focused field
While Safari on iOS 26.2 pans the page to a focused field near the bottom,
it reports innerHeight as the visual viewport's height (377 of 714 with
the keyboard up). layoutViewportHeight read innerHeight, so the keyboard
module measured 0, as if no keyboard were up, against AST-099 FR2 ("a page
pan is never a smaller keyboard"). The root's client height keeps the
layout viewport's height. At a visual-viewport scale of 1, where
innerHeight equals the visual viewport's height and the root is as wide
as the visual viewport, layoutViewportHeight now takes the larger of the
two. Everywhere else it is unchanged: a zoomed-out page's scaled
innerHeight and the root's unscaled height are in different units, a
layout wider than the screen gives a root taller than the screen, and the
scroll clamp reads as before.
The README's ride formula now takes the keyboard's top from
layoutViewportHeight(window), not innerHeight.
280bac1 to
86c74e8
Compare
There was a problem hiding this comment.
Requesting changes: the scale-1 root floor restores the keyboard height during Safari's pan to a focused field and keeps zoomed-out and wider-than-screen layouts at no keyboard, but the Android emulator readings the keyboard record requires at the exact head are still not on the pull request.
- The new branch in
layoutViewportHeight(packages/core/src/utils/layoutViewport.ts:54-61) also runs on Android, and AST-099's Platform support makes emulator evidence at the exact head a merge gate, so please post here the readings the description attributes to another run (innerHeight, the root's client height, the visual viewport and the module's keyboard height, keyboard up and down) in Chrome with Gboard, default andresizes-content, and in Firefox for Android.
The red-first pan tests and the Simulator capture cover the iOS fix itself.
[Automated review]
|
The readings at this head are now in the description's Testing section. They come from the Android 16 emulator: Chrome 133 with Gboard, default and
The root's client height equals |
|
I'll run a full review to re-check this with your note. |
There was a problem hiding this comment.
Approving: the scale-1 root floor in layoutViewportHeight restores the whole keyboard height during Safari's pan to a focused field and keeps zoomed-out and wider-than-screen layouts at no keyboard, and the Android emulator readings at this head now cover Chrome with Gboard (default and resizes-content) and Firefox for Android.
Approved pending CI: CI has not run on this head yet, because its branch is in a fork; a maintainer adds the ci:run label so CI runs.
[Automated review]
|
/approve-spec 76289f2 |
There was a problem hiding this comment.
Requesting changes: the scale-1 root floor in layoutViewportHeight still restores the whole keyboard height during Safari's pan to a focused field and keeps zoomed-out and wider-than-screen pages at no keyboard, and CI passes on this head, but the merge from main needs the Android emulator readings taken again.
- Regression: merging main moved the head after the Android emulator readings were taken, and AST-099's Platform support requires them at the exact head now that the merged docked ride, reveal and room checks read
layoutViewportHeight, so please re-take the Chrome-with-Gboard (default andresizes-content) and Firefox for Android readings, keyboard up and down, with the three animation and device profiles, on a build of this head, and refresh the Testing section, which still describes the earlier rebase.
[Automated review]
Stack: #9983 → #8217
Merge group: #9983, #8217
User impact
While Safari on iOS pans the page to a focused field near the bottom, the keyboard module measured no keyboard, so readers such as
useMobileKeyboard's recovery check took it as down. During that pan Safari reportsinnerHeightas the visual viewport's height (377 of 714 on iOS 26.2).Problem and solution fit
layoutViewportHeightreadinnerHeight, but the root's client height keeps the layout viewport's 714. At a visual-viewport scale of 1, whereinnerHeightequals the visual viewport's height and the root is as wide as the visual viewport, taking the larger of the two restores the keyboard's height. Elsewhere nothing changes: a zoomed-out page's scaledinnerHeightand unscaled root differ in units, a layout wider than the screen has a taller root, and the scroll clamp reads as on main.Expected behavior and authority
spec:AST-099FR2: "A page pan or a visual-viewport offset is a pan to put back (FR4), never a smaller keyboard." The FR2 verification row now names Safari's pan to a focused field and the Simulator.Smallest restoration
layoutViewportHeightreturns the larger of its current value and the root's client height (the body's in quirks mode), in that one state. The README's ride formula now useslayoutViewportHeight(window). No API change.Evidence
The module's own reading on a page Safari pans (a local probe story, not in the diff), iOS 26.2 Simulator, hostname masked:
innerHeight377, root 714, visual viewport 377 panned 337: the module reads 0 (2 takes).innerHeightin every reading, so the floor returns main's value.layoutViewport.test.tsandkeyboardHeight.test.tspan cases, red on main.Open PRs on these files: #9776 touches other hunks of the keyboard module; #9777 adds
layoutViewport.tsfrom an older base and takes this fix when it rebases.Scope
Writing rubric results
R1 narration: none (the row states what verifies FR2). R2 research: none. R3 evidence: the row names its tests and the Simulator, no change. R4 rejected alternatives: none. R5 change references: none. R6 open questions: none.
Testing
layoutViewport.ts, the 2 pan cases fail (one per test file); with the change all pass. The wide-layout, zoomed-out and scroll-clamp cases pass on main and here; the wide-layout cases fail on the previous head (a 1,105 px keyboard with none shown).vitest --project uikeyboard module andlayoutViewport: 74/74. Core units: 21,147 of 21,151 pass; the other 4, inSwitch.focusRing.source-build.test.mjsandRadioListItem.press.source-build.test.mjs, fail on main too (a fresh install has no@babel/preset-reactat the root).CI=true) 0 errors; Prettier;pnpm check:knowledge.Android emulator readings at this head (CSS px; a local probe page, not in the diff, reads the module built from this head; Android 16
BE2A.250530.026.D1, Chrome 133.0.6943.137 with Gboard 15.1.08, Firefox 159.0.1; a field at the page's bottom, tapped, then Back):innerHeightresizes-contentresizes-contentresizes-contentresizes-contentresizes-content,innerHeightequals the visual viewport's height at scale 1 with the keyboard up, so the new branch runs; the root shrinks with them, so it returns the same value as main.