Repository navigation
Mobile: grow the composer smoothly up to five lines, then scroll - #1886
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JrDYoWwyZq8wZicrR3aQFB
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 54 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JrDYoWwyZq8wZicrR3aQFB
…xing its height On iOS Fabric a TextInput with a fixed height stops reporting a larger contentSize, so the composer stuck at about two lines. The field now takes its content height as a minimum and five lines as a maximum. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JrDYoWwyZq8wZicrR3aQFB
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Batch QA — head aa3e9ab (on
|
| Step | Result |
|---|---|
| 1. 1 → 7 lines: grows to 5 lines, then scrolls inside (light + dark) | ✅ pass |
| 2. Typing video lines 1–7 | ✅ recorded locally; stepwise growth, no jumps/flicker seen |
| 3. Dictation | untested on the Simulator (check on a real iPhone) |
| 4. Send shrinks back to one line | ✅ pass |
Note: the previous head f4d3045 failed step 1 together with #1889 (pill stuck at ~2 lines); aa3e9ab fixes that.







Requested by Vain · project thread
Before: the mobile chat composer jumped to its new height with each new line and capped at about five and a half lines (
touch * 3).After: like Slack, the composer grows one line at a time up to five lines and then scrolls inside the field. Each height change slides over 160 ms on the UI thread, the same for typed text and dictated text, and shrinks the same way after sending.
How: the pill is now a Reanimated
Animated.Viewwhose height follows its content. The content sits in an inner view anchored to the bottom; itsonLayout(which fires only when the height changes, not on every keystroke) sets a shared value withwithTiming, so no React render runs per animation frame. Typing and dictation both reach the field throughvalue, so both take the same path. The five-line cap iscomposerFieldHeightindictation.ts, with a unit test. Reduce Motion follows the system setting. DESIGN.md's motion list now names the composer, andmotion.composeris a new token.Evidence (web export, isolated Host, 390 × 844)
Pill height by line count:
1: 50, 2: 108, 3: 130, 4: 152, 5: 174, 6: 174, 7: 174(line 2 adds the button row when the field stacks). Per-frame heights while line 3 → 4 animates:130.2, 131.2, 133.2, 136.2, 140, 144.3, 147.7, 150.1, 151.5, 152(eased, no jump). Light and dark screenshots at 1, 3, 5 and 7 lines are in the project thread; native screenshots and a recording are queued on the shared Simulator and will follow as a comment.Human QA
Checks:
pnpm --filter @botharness/mobile typecheck, mobile vitest (278 passed),pnpm lint,pnpm format:check. JavaScript-only change; the installed dev build reloads through Metro.🤖 Generated with Claude Code
https://claude.ai/code/session_01JrDYoWwyZq8wZicrR3aQFB