Skip to content

feat(ChatLayout): dragging the conversation to the composer dismisses the keyboard - #8217

Open
vjeux wants to merge 9 commits into
meta:mainfrom
vjeux:uikit/c08-keyboard-dismiss
Open

vjeux wants to merge 9 commits into
meta:mainfrom
vjeux:uikit/c08-keyboard-dismiss

Conversation

@vjeux

@vjeux vjeux commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Stack: #9983 → #8217
Merge group: #9983, #8217

Review only this PR's change: vjeux/astryx@86c74e8...1fd9e0e, vjeux/astryx@6fd4c28...680bf29 and vjeux/astryx@cc668a0...8a7df57. Main merges sit between and after; one joins two spec:AST-094 FR36 edits.

User need

In iOS Messages, dragging the conversation to the field, or swiping down on the input bar, puts the keyboard away. ChatLayout kept it up.

Problem and solution fit

A watcher pan on the root lets the transcript scroll. With a software keyboard up, the field blurs when a touch or pen drag reaches the composer's top. The dock container then bounces once on springs.keyboard, from the finger's speed, at most the composer's bottom padding, unless motion is reduced. The composer, frosted layer and scroll-to-bottom button share that transform.

A drag down from the composer blurs it too, unless a long press began it (caret loupe). While the keyboard is up, the gesture system's page hold cancels one-finger drags that start on the composer, so nothing scrolls under it. Its own scrollers, a pinch and a zoomed page stay the browser's.

Current specification

  • component:ChatLayout FR10 and DEC-1, rewritten.
  • Owner decision, Nov 5 2026 (Cindy, card 76b): dismiss when the drag reaches the composer, with a brief spring bounce and no follow-the-finger cue. The composer and the scroll-to-bottom button move together.
  • Specs decision, Nov 5 2026: a drag that starts on the composer closes the keyboard and never scrolls content under it.
  • Specs decisions, Nov 5–6 2026: spec:AST-094 FR36 and FR37 except ChatLayout's two keyboard dismissals; FR19 lists the composer's hold.

Public delta and caller burden

No new prop or type. The follow code goes (composerFollow.ts, its armed cue, the animator): −9.8 kB gzip.

Design and alternatives

  • Dismissing at the lift with an armed follow: rejected in DEC-1.
  • Claiming the composer drag: its touch-action blocks pinch-zoom.

Evidence

iOS 26.2 Simulator, "Full AI Chat", HID drags:

  • A drag down the conversation blurred the field at the composer, 0.4 to 1.6 s before the lift.
  • A drag down from the composer blurred it within 0.3 s, the transcript still. A press-and-hold caret drag kept the keyboard.
  • In every traced frame, the composer stayed 44 px below the button.

Scope

  • One capability is added.
  • Unrelated fixes, cleanup, and policy changes were removed or split.
  • Consumer docs, focused tests, and migration evidence ship with the feature.
  • Public text and artifacts contain no internal Meta context.

Writing rubric results

component:ChatLayout: R4, DEC-1's two one-line rejections; others none. spec:AST-094 FR19, FR36, FR37 and FR43 lines and spec:AST-099 paths: R1–R6 none.

Testing

Behavior module: ChatLayout transcript dismissal (transcriptDismiss.ts)

ChatLayout's import, bytes (core build, esbuild, minified, React and StyleX external), both on main 3bd058c:

follow code (1fd9e0e, import updated) this change (680bf29)
minified 281,788 254,428
gzip 91,202 81,421

The animator, the rubber band and the follow module leave.

  • Red-first: on a build of 1fd9e0e, the browser spec's 4 crossing and composer cases fail in Chromium (2 of 2 runs) and in WebKit. On a build of 39a9502, the pinch case fails in both engines: every two-finger move was cancelled. On a build of d19cf69's code, the drifting-strip case fails in both engines (Chromium 2 of 2): every move went through.
  • The bounce case samples the dock's animation paused at each frame. WebKit reads a running animation at each call, and a starved page paints few frames. Under CPU load in the WebKit container, the per-frame version failed 7 of 80 runs; this one passed 40 of 40.
  • At this head, the Chat interaction specs: Chromium 14/14; WebKit in the CI profile (--cpus=4, CI=1, LP_NUM_THREADS=4, 1 worker) 13 passed, 1 skipped (pen, Chromium-only). Before the last merge of main: 3 runs each, the same.
  • Units: transcriptDismiss.test.ts 32/32, ChatLayoutTranscriptDismiss.test.tsx 23/23, composerBounce.test.ts 5/5, dragAxes 2/2. The theme-mark case fails on 9d66f5f's source, and two strip cases on d19cf69's. Two cases cover a node made in another window; each fails with instanceof in place of isNode or isElement.
  • On today's main, 955564d's code fails Core's typecheck (isNodeTarget is gone) and its Storybook build. This head passes both.
  • Mutants, each caught. A dismissal at the lift fails 11 units and two Chromium cases. A bounce on the composer alone fails the button case. Without the page hold, 4 units and both composer drags in Chromium fail. Without the composer pan, the drag down fails. A bounce at twice the finger's speed fails 3 units. Ignoring composer scrollers fails 2 units and the strip case. Dropping the long-press exception, the zoom check or the keyboard check fails 1 unit each. Counting a drift as the strip's axis fails 2 units and the drifting case.
  • iOS 26.2 Simulator at a87cb24: a drag from the composer blurred the field at 246 ms with the transcript still; a 1 s press in a two-line draft, then a slow drag down, kept the keyboard, and the caret moved.
  • At this head: test:ui 22,133 and test:node 16,974 passed; Chat accessibility specs 39/39. Core tsc, ESLint, pnpm review:pre and the repo checks (sync:exports:check, verify-exports, check:repo, check:token-docs, check:motion-roles, check:changesets, check:knowledge) pass.
  • Preview at this head: https://astryx-ahyjlui39-fbopensource.vercel.app/storybook/iframe.html?id=core-chatlayout--full-ai-chat&viewMode=story

@vercel

vercel Bot commented Oct 24, 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 6, 2026 10:35pm UTC

Request Review

@astracat-bot

astracat-bot Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

AI review status for this pull request.

Review status Updated
🟢 Reviewed (for maintainers only) Nov 6, 2026, 10:50 PM UTC

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Oct 24, 2026
@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

PR Analysis Report

🔎 Preview · 3a38f3b

Storybook · Sandbox · built from this PR's head

Modified components

Component Size LoC Visual · A11y · RTL
ChatLayout 🔴 83.8 kB (+28.5 kB) · 9.9 kB CSS (0) — ✗ · ✓ · —
ChatComposer 68.7 kB (+81 B) · 11.3 kB CSS (0) — ✗ · ✓ · —
ChatSendButton 52.5 kB (+71 B) · 9.4 kB CSS (0) — ✗ · ✓ · —
125 more components
Component Size LoC Visual · A11y · RTL
ChatDictationButton 52.6 kB (+69 B) · 9.5 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) — ✗ · ✓ · —
ChatComposerTokenElement 66.7 kB (+66 B) · 10.7 kB CSS (0) — ✗ · ✓ · —
ChatComposerDrawer 17.7 kB (0) · 4.7 kB CSS (0) — ✗ · ✓ · —
ChatMessage 16.8 kB (0) · 3.7 kB CSS (0) — ✗ · ✓ · ✓
ChatMessageBubble 7.2 kB (0) · 3.7 kB CSS (0) — ✗ · ✓ · ✓
ChatMessageList 23.9 kB (0) · 6.9 kB CSS (0) — ✗ · ✓ · —
ChatMessageMetadata 19.9 kB (0) · 4.1 kB CSS (0) — ✗ · ✓ · —
ChatSystemMessage 7.0 kB (0) · 3.8 kB CSS (0) — ✗ · ✓ · —
ChatTokenizedText 7.2 kB (0) · 4.0 kB CSS (0) — ✗ · ✓ · —
ChatToolCalls 27.8 kB (0) · 8.3 kB CSS (0) — ✗ · ✓ · —
Chat — — ✗ · ✓ · —
lab/Comments 309.4 kB (+1.6 kB) · 2.5 kB CSS (0) — — · — · —
lab/CommentComposer 139.3 kB (+204 B) · 1.9 kB CSS (0) — — · — · —
Slider 102.0 kB (+102 B) · 8.7 kB CSS (0) — — · — · —
DateTimeInput 199.4 kB (+98 B) · 18.2 kB CSS (0) — — · — · —
DateInput 177.1 kB (+93 B) · 16.5 kB CSS (0) — — · — · —
Lightbox 103.3 kB (+91 B) · 9.9 kB CSS (0) — — · — · —
SegmentedControl 89.8 kB (+90 B) · 6.8 kB CSS (0) — — · — · —
lab/CommentPin 52.9 kB (+88 B) · 1.2 kB CSS (0) — — · — · —
Switch 96.6 kB (+86 B) · 9.8 kB CSS (0) — — · — · —
Toast 89.7 kB (+86 B) · 9.7 kB CSS (0) — — · — · —
DropdownMenuSubMenu 64.9 kB (+83 B) · 9.4 kB CSS (0) — — · — · —
SideNavHeading 67.1 kB (+82 B) · 10.7 kB CSS (0) — — · — · —
AvatarGroupOverflow 44.7 kB (+80 B) · 5.5 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) — — · — · —
lab/Schedule 100.0 kB (+79 B) · 3.9 kB CSS (0) — — · — · —
MoreMenu 87.8 kB (+78 B) · 16.8 kB CSS (0) — — · — · —
TimeInput 153.8 kB (+78 B) · 15.6 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) — — · — · —
Typeahead 74.7 kB (+77 B) · 12.2 kB CSS (0) — — · — · —
AlertDialog 96.3 kB (+76 B) · 13.8 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) — — · — · —
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) — — · — · —
Link 49.0 kB (+75 B) · 6.9 kB CSS (0) — — · — · —
Calendar 63.0 kB (+74 B) · 10.0 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) — — · — · —
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) — — · — · —
CheckboxList 54.5 kB (+71 B) · 7.9 kB CSS (0) — — · — · —
DateRangeInput 87.0 kB (+71 B) · 12.2 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) — — · — · —
richtext/RichTextEditorToolbar 245.2 kB (+70 B) · 454 B 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) — — · — · —
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) — — · — · —
AvatarGroup 42.4 kB (+67 B) · 5.6 kB CSS (0) — — · — · —
DialogHeader 54.8 kB (+67 B) · 10.9 kB CSS (0) — — · — · —
Drawer 46.2 kB (+67 B) · 8.2 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) — — · — · —
FieldLabel 47.4 kB (+66 B) · 5.6 kB CSS (0) — — · — · —
Tokenizer 86.1 kB (+66 B) · 18.1 kB CSS (0) — — · — · —
PowerSearch 275.2 kB (+65 B) · 23.2 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) — — · — · —
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) — — · — · —
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) — — · — · —
lab/PageControl 71.8 kB (+32 B) · 709 B CSS (0) — — · — · —
lab/NavigationScreen 78.5 kB (+28 B) · 1.5 kB CSS (0) — — · — · —
lab/NavigationStack 78.5 kB (+28 B) · 1.5 kB CSS (0) — — · — · —
ButtonGroup 40.1 kB (+17 B) · 3.7 kB CSS (0) — — · — · —
CommandPalette 59.7 kB (+1 B) · 12.4 kB CSS (0) — — · — · —
BottomSheetSwitcher 17.5 kB (0) · 3.4 kB CSS (0) — — · — · —
CommandPaletteInput 27.9 kB (0) · 7.5 kB CSS (0) — — · — · —
Dialog 22.7 kB (0) · 6.7 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) — — · — · —
lab/CommentThread 302.5 kB (−110 B) · 2.4 kB CSS (0) — — · — · —
chat — — — · ✓ · —
Visual changes: 4 snapshots in 1 component

A change is a question for the reviewer, not a failure.

Component · story Before After Diff
Chat · Default (neutral, dark) before frame after frame diff frame
Chat · Default (neutral, light) before frame after frame diff frame
Chat · Clipping (neutral, dark) before frame after frame diff frame
Chat · Clipping (neutral, light) before frame after frame diff frame

Package size: @astryxdesign/core 6.83 MB packed (+11.1 kB); 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.

Touched components checked; add ci:run-visual, ci:run-a11y or ci:run-rtl to run the full suites.


Generated by PR Enrichment workflow | View full report

@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.

Approval waits on an owner decision: no current spec covers ChatLayout's new keyboardDismissMode prop or its default-on 'interactive' dismissal. An engineering owner needs to provide or identify the governing spec, meaning whether ChatLayout ships the prop and which default it uses, and record it by commenting /approve-spec <full head SHA> on this pull request; the author can do this if they are an engineering owner. Independently of that decision, these changes are needed:

  • The diff includes four open predecessor pull requests (#8045, #8067, #8074, #8176), about 27,000 authored lines, so please land them through their own reviews and rebase this branch down to its ChatLayout commit.
  • 'onDrag' blurs the composer even when no software keyboard is shown, unlike 'interactive', so please gate it on the keyboard being up and add a test.
  • The new draft spec:AST-094 needs its own owner ruling in the pull request that introduces it, and its FR7 cites spec:AST-090, which is not in the repository.

[Automated review]

@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.

Approval waits on an owner decision: no current spec covers ChatLayout's new keyboardDismissMode prop or its default-on 'interactive' dismissal. An engineering owner needs to provide or identify the governing spec, meaning whether ChatLayout ships the prop and which default it uses, and record it by commenting /approve-spec <full head SHA> on this pull request; the author may do so if they are an engineering owner. Independently of that decision, these changes are needed:

  • The diff includes four open predecessor pull requests (#8045, #8067, #8074, #8176), about 27,000 authored lines, so please land them through their own reviews and rebase this branch down to its ChatLayout commit.
  • 'onDrag' blurs the composer even when no software keyboard is shown, unlike 'interactive', so please gate it on the keyboard being up and add a test for that case.
  • The new draft spec:AST-094 needs its own owner ruling in the pull request that introduces it, and its FR7 cites spec:AST-090, which is not in the repository.
  • docsZh in ChatLayout.doc.mjs has no keyboardDismissMode entry and does not mention the new default.

[Automated review]

@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.

Approval waits on an owner decision: no current spec covers ChatLayout's new keyboardDismissMode prop or its default-on 'interactive' dismissal. An engineering owner needs to provide or identify the governing spec, meaning whether ChatLayout ships the prop and which default it uses, and record it by commenting /approve-spec <full head SHA> on this pull request; the author may do so if they are an engineering owner. Independently of that decision, these changes are needed:

  • The diff includes six open predecessor pull requests (#8045, #8067, #8074, #8176, #8258, #8287), about 29,800 authored lines, so please land them through their own reviews and rebase this branch down to its ChatLayout commit.
  • 'onDrag' blurs the composer even when no software keyboard is shown, unlike 'interactive', so please gate it on the keyboard being up and add a test for that case.
  • The draft spec:AST-094 needs its own owner ruling in the pull request that introduces it: its FR7 cites spec:AST-090, which is not in the repository, and its FR4 rules out the theme-tunable touch motion that #8258 adds.
  • docsZh in ChatLayout.doc.mjs has no keyboardDismissMode entry and does not mention the new default.

[Automated review]

@cixzhang

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf.

Parts of this PR re-implement behavior that already exists, or is being specified, as a shared part of core. Converging keeps one implementation per behavior:

  • Commit or spring back on release. core/src/keyboard/keyboardDismiss.ts:72 decides on its own whether a release finishes or springs back. A shared release rule is being specified (AST-057 FR5 covers row swipe today); avoid a component-specific threshold model.

This is about where the behavior lives, not about the PR's intent.

@vjeux

vjeux commented Oct 24, 2026

Copy link
Copy Markdown
Contributor Author

Agreed: one implementation.

  • Commit or spring back on release: the dismissal will take its decision from the shared release rule once that rule is specified, with no threshold model of its own. In the next push it reads the keyboard height from the shared keyboard module (AST-099).

vjeux added a commit to vjeux/astryx that referenced this pull request Oct 25, 2026
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 25, 2026
@vjeux
vjeux force-pushed the uikit/c08-keyboard-dismiss branch from edc7843 to cd49b1b Compare October 25, 2026 01:51
@vjeux

vjeux commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

Pushed in cd49b1b: the dismissal reads the shared height from the keyboard module, stacked on #8176.

@vjeux

vjeux commented Nov 5, 2026

Copy link
Copy Markdown
Contributor Author

The identical line Stack: #9983 → #8217 now heads both descriptions. FR10 and DEC-1 are unchanged at 1fd9e0e. The changes since 97e4115 are the two Misses, the docs wording and one dropped comment.

@cixzhang

cixzhang commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 1fd9e0e

@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.

Both pull requests in this stack are approved, pending CI.

#9983: approve. The layout-viewport floor restores the keyboard height while Safari pans to a focused field (spec:AST-099 FR2), and the Android emulator readings at this head cover Chrome with Gboard and Firefox.

#8217: approve. FR10, DEC-1 and the spec:AST-094 FR43 entry carry an engineering owner's approval for this head, the earlier fixes are in (shared helpers, release-note scope, stack line), and the drag, the composer's follow and the Reduce Motion cue behave as FR10 says in a Chromium check.

Whole stack: pass. Merged onto main, it typechecks and its unit tests pass.

A pull request lands only when it and every pull request below it are approved. Approved pending CI: CI has not run on these heads yet; once #8217 is ready for review, a maintainer adds the ci:run label to both so CI runs.

Non-blocking: a test asserting that the composer's spring-back starts from the release speed would pin spec:AST-094 FR38.

[Automated review]

@vjeux

vjeux commented Nov 5, 2026

Copy link
Copy Markdown
Contributor Author

Noted: the test that pins the spring-back to the release speed (spec:AST-094 FR38) will come with the next version this PR needs, or in a follow-up. That keeps this head's approvals and card check in place.

@github-actions github-actions Bot added needs:spec-owner-review Current knowledge records await owner approval and removed needs:design-review Affects visuals — Design should review labels Nov 6, 2026
@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 39a9502

@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 on #8217; #9983 is approved.

#9983: approve. The keyboard height now reads the whole keyboard while Safari pans to a focused field, restoring spec:AST-099 FR2, and nothing has changed since its approval.

#8217: request changes. The rewritten FR10, DEC-1 and the spec:AST-094 FR36 and FR43 edits carry an engineering owner's approval for this head, but the composer's scroll hold needs these fixes:

  • A two-finger pinch that starts on the composer has every move cancelled while the keyboard is up, so the page cannot be zoomed from there, which spec:AST-094 FR10 requires to stay the browser's; cancel only while exactly one finger is down (transcriptDismiss.ts:278-285).
  • The hold cancels the moves of touches no recognizer owns, from the first move, through a blocking listener beside a pan that never claims, which spec:AST-094 FR19 does not allow; add the case to FR19's exceptions for approval, or let the composer drag claim its touch (transcriptDismiss.ts:291-296).
  • holdComposerScroll and isInComposerScroller copy the gesture system's page hold (gestures/pageHold.ts) and scroll test (gestures/nativeScroll.ts); extend holdPageScroll to take the composer's decision and delete the copy (transcriptDismiss.ts:168-304).
  • The crossing dismissal keeps the keyboard down when the finger moves back up before the lift, which spec:AST-094 FR37 still forbids because the new FR36 exception names FR36 alone; extend the exception to FR37.

Whole stack: fails on #8217's fixes, and a pull request lands only when it and every pull request below it are approved; CI has not run on either draft head yet.

[Automated review]

@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec d19cf69

@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 on #8217; #9983 is approved.

#9983: approve. The keyboard height reads the whole keyboard while Safari pans to a focused field, restoring spec:AST-099 FR2.

#8217: request changes. The rewritten FR10, DEC-1 and spec:AST-094 edits carry an engineering owner's approval for this head, and straight drags behave as FR10 says, but two fixes remain:

  • A drag that starts on a sideways-scrolling strip in the composer and drifts sideways at all is not held, because canElementScroll counts any nonzero x travel, so the conversation scrolls under the keyboard (40 px for a 120 px drag up with 8 px of drift in Chromium) against FR10's "MUST NOT scroll content"; count an axis only when its travel is at least half the other's, as the gesture system's scroll probe does, and add a drifting-strip case (transcriptDismiss.ts:188-204).
  • On main, spec:AST-094 FR19 already reads "five exceptions" after a toast's swipe was added, so this head's composer exception leaves six under "five" once merged; rebase and say "six" in FR19 and in the FR18–FR22 verification row (spec.md:411, :955).

Whole stack: fails on #8217's two fixes; it merges cleanly onto main, where the changed suites and the core typecheck pass. A pull request lands only when it and every pull request below it are approved, and CI has not run on either draft head yet.

[Automated review]

@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 9d66f5f

@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 on #8217; #9983 is approved.

#9983: approve. The keyboard height reads the whole keyboard while Safari pans to a focused field, restoring spec:AST-099 FR2.

#8217: request changes. The record edits carry an engineering owner's approval for this head, and the drifting-strip hold and the FR19 count from the last review are fixed. Two shared-path fixes remain:

  • Miss: bounceComposer skips the bounce only on the system Reduce Motion setting, while Core's Reduced Motion policy (reducedMotionFade, and the animator) also honours a theme's reduced-motion mark, so once a theme can reduce motion for everyone the chat dock would keep bouncing; decide it with reducedMotionFade(dock, {touchRelease: true}), or one shared predicate if that import is too heavy (composerBounce.ts:41-46).
  • scrollsInComposer restates createNativeScrollProbe's half-travel axis rule instead of calling it; export that filter from gestures/nativeScroll.ts and use it in both places (transcriptDismiss.ts:194-198).

Whole stack: fails on #8217's two fixes; the changed suites pass on this head. A pull request lands only when it and every pull request below it are approved, and CI has not run on either draft head yet.

[Automated review]

@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 955564d

@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 on #8217; #9983 is approved.

#9983: approve. It restores spec:AST-099 FR2: the keyboard height now reads the whole keyboard while Safari pans the page to a focused field, and its tests also pass on today's main.

#8217: request changes. The record changes carry an engineering owner's approval for this head, and one blocking finding remains:

  • Regression: transcriptDismiss.ts:29 imports isNodeTarget, which main removed in #10224, so once merged with main Core's typecheck fails (TS2305) and every touch drag throws isNodeTarget is not a function; merge main and use isNode from utils/nodeType (and isElement/isNode at lines 202 and 293).

Whole stack: blocked by that fix; a pull request in this stack lands only when it and every pull request below it are approved, and CI has not run on this draft head yet.

[Automated review]

vjeux added 2 commits November 6, 2026 02:05
A drag down the conversation now blurs the field the moment it reaches
the composer. The dock container then gives one small bounce on the
keyboard's spring, started at the finger's speed, so the composer, the
frosted layer and the scroll-to-bottom button move as one. A drag down
that starts on the composer dismisses the keyboard too, and while the
keyboard is up no drag on the composer scrolls the page. The follow
code and its armed cue are gone.
@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 4c00682

@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 on #8217; #9983 is approved pending CI.

#9983: approve. It restores spec:AST-099 FR2, so the keyboard height reads the whole keyboard while Safari pans to a focused field; its checks wait for a maintainer to add the ci:run label so CI runs.

#8217: request changes. The record changes carry an engineering owner's approval for this head; one blocking finding remains:

  • Miss: transcriptDismiss.ts:105-110 (isFinished) and :264 restate the gesture system's isTerminal and isActive (gestures/GestureRecognizer.ts:159-165); call those instead, drop isFinished, and add the import to the gesture-import list that ChatLayoutTranscriptDismiss.test.tsx pins.

Whole stack: a pull request in this stack lands only when it and every pull request below it are approved, and CI has not run on #8217's draft head yet.

[Automated review]

The transcript dismissal read a pan's state with checks of its own. It
now calls the gesture system's isTerminal and isActive. The unit test
that pins its gesture imports lists GestureRecognizer.
@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 680bf29

@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 either head yet.

#9983: approve. It restores spec:AST-099 FR2, so the keyboard height reads the whole keyboard while Safari pans to a focused field. Its checks wait for a maintainer to add the ci:run label so CI runs.

#8217: approve. The record changes carry an engineering owner's approval for this head, and the dismissal now calls the gesture system's isActive and isTerminal, which settles the last blocking finding. CI runs once the pull request leaves draft and a maintainer adds the ci:run label.

Whole stack: passes. A pull request in this stack lands only when it and every pull request below it are approved, and both still need their CI to pass.

One optional cleanup: the comment above focusedEditable in transcriptDismiss.ts restates its body and can go.

[Automated review]

# Conflicts:
#	docs/specs/AST-094-touch-presentations/spec.md
@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec cc668a0

@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 on #8217; #9983 is approved.

#9983: approve. It restores spec:AST-099 FR2, so the keyboard height reads the whole keyboard while Safari pans to a focused field, and its checks pass.

#8217: request changes. The record edits carry an engineering owner's approval for this head, and the dismissal's tests pass; one record fix remains:

  • Miss: spec:AST-094 FR36 and FR37's new exceptions (docs/specs/AST-094-touch-presentations/spec.md:676-678 and :687-689) name only ChatLayout's transcript drag, while component:ChatLayout FR10 makes a drag down from the composer dismiss the keyboard as soon as it passes the pan's 10 px hysteresis (packages/core/src/Chat/transcriptDismiss.ts:260-267), so once merged the two records contradict each other; widen both exceptions to ChatLayout's keyboard dismissals (or make the composer swipe decide at the lift) and record a fresh /approve-spec for that head.

Whole stack: fails on that finding. A pull request in this stack lands only when it and every pull request below it are approved.

Optional: the comment above focusedEditable in transcriptDismiss.ts restates its body and can go.

[Automated review]

vjeux added 3 commits November 6, 2026 10:45
Both exceptions named only the transcript drag. A drag down that starts
on the composer dismisses the keyboard too, once it moves, so both
exceptions now name ChatLayout's keyboard dismissals.
@cixzhang

cixzhang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

/approve-spec 3a38f3b

@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.

Both pull requests in this stack are approved.

#9983: approve. It restores spec:AST-099 FR2, so the keyboard height reads the whole keyboard while Safari pans to a focused field; after the merge of main its tests pass beside the keyboard module's new cases, and its checks pass.

#8217: approve. The record edits carry an engineering owner's approval for this head, spec:AST-094 FR36 and FR37 now name both of ChatLayout's keyboard dismissals, and the drag-to-dismiss tests pass in Chromium and WebKit.

Whole stack: passes. A pull request in this stack lands only when it and every pull request below it are approved.

[Automated review]

This branch was successfully deployed

1 active deployment
Preview — 3a38f3bb Deployed Nov 6, 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