Use compact search input size in lists, popovers, and emoji picker#96499
Conversation
Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com>
|
🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
… context Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com>
|
Fixed the failing Root cause: This PR added a Fix: Spread Notes
|
|
@MelvinBot the placeholder text color is incorrect, it should use textSupporting from our theme colors. Can you please update? |
|
The only failing check is PR Author Checklist / checklist, which reports:
Every other check is passing ( There's no code fix to push here — this check fails because the PR Author Checklist boxes in the description aren't ticked. That's a human checklist meant to confirm a person actually verified each item (testing on all platforms, screenshots, offline behavior, etc.), so I won't check those boxes on your behalf. To clear it, the checklist items in the PR body need to be reviewed and checked off by a human author/reviewer once the corresponding work is done. Note the PR still needs cross-platform QA (Android/iOS native + mWeb) and the |
Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com>
|
Done — updated the placeholder to use Applied to all three compact search inputs this PR touches:
|
|
Still the same situation — the only failing check is PR Author Checklist / checklist:
The latest commit ( There's nothing for me to push a code fix for. This check is gated on the human PR Author Checklist boxes in the description being ticked, which confirm a person verified each item (cross-platform testing, screenshots, offline behavior, etc.). I won't check those on your behalf, so the check will keep failing until an author/reviewer completes the checklist once the underlying work (cross-platform QA + filling in the |
|
🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
@MelvinBot the placeholder text color doesn't look correct in that latest adhoc build above, can you double check? |
|
I double-checked, and the change is in that adhoc build (it was built from So the placeholder is now rendering
Note the relative brightness flips between themes — the default I wasn't able to grab a fresh screenshot in the automation environment to compare against your eye, so to make sure I fix the right thing: which platform/theme were you viewing (e.g. web light vs. dark, iOS native)? A screenshot of what looks wrong would help. If |
|
@Expensify/design are we cool with the search input being small but inputs that have filter values are larger? I think it's probably okay but definitely a bit noticeable: CleanShot.2026-07-20.at.19.46.58.mp4 |
|
Yeah I think it's okay cause they're different purposes so I don't mind it 👍 |
|
Sweet, thanks for confirming! We can start getting this into review then! |
|
@ahmedGaber93 Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
@MelvinBot can you please fill out the author PR checklist as best as you can? @ahmedGaber93 I will need your help testing all platforms given this is a Melvin PR. |
|
Correct - those inputs should change height ever so slightly based on platform. |
|
Alright cool I'm on board 👍 ⛵ |
|
Okay cool, @ahmedGaber93 what's left for review? |
joekaufmanexpensify
left a comment
There was a problem hiding this comment.
Good for product 👍
| errorText={errorText} | ||
| autoCorrect={!disableAutoCorrect} | ||
| shouldInterceptSwipe={shouldInterceptSwipe ?? false} | ||
| touchableInputWrapperStyle={shouldUseNarrowLayout ? styles.listSearchInputNarrowWrapper : styles.listSearchInputWideWrapper} |
There was a problem hiding this comment.
The OP say:
Note that we use two different sizes: one for web/desktop, and one for mobile.
However, shouldUseNarrowLayout is always true in the RHP on web, so the input heights are actually:
- Web RHP: 46
- Web popover: 34
- Mobile: 46
If this isn't the intended behavior, we could use isSmallScreenWidth instead.
There was a problem hiding this comment.
@MelvinBot please implement the feedback above. We want the input size to change based on device width, not RHP width.
There was a problem hiding this comment.
Done — pushed in 4490061.
The compact search input now sizes off device width (isSmallScreenWidth) instead of shouldUseNarrowLayout, which was also true inside the RHP/narrow pane on web and forced the 46px size there. Result:
- Web (desktop + RHP + popover): 34px
- Mobile: 46px
Applied to both web variants that use this compact styling — SelectionList/components/TextInput.tsx and EmojiPicker/EmojiPickerMenu/index.tsx — so they stay in sync. EmojiPickerMenu/index.native.tsx already hardcodes the narrow values, which is correct since isSmallScreenWidth is always true on native. The other shouldUseNarrowLayout usages in the emoji picker (picker container/header layout) are unrelated and left untouched.
oxfmt, eslint (lint-changed), and typecheck all passed. The React Compiler check surfaces the same pre-existing [InferMutationAliasingEffects] invariant on EmojiPickerMenu/index.tsx that was present before this edit (identical error/lines on the base), so it's not a regression from this change.
ahmedGaber93
left a comment
There was a problem hiding this comment.
LGTM!
Just one small comment about the expected behavior: #96499 (comment)
We also need to ask Melvin to fix the the git conflict and mark all author checklist as checked
|
We did not find an internal engineer to review this PR, trying to assign a random engineer to #96491 as well as to this PR... Please reach out for help on Slack if no one gets assigned! |
|
@MelvinBot please fix the conflict |
…SearchInput Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com> # Conflicts: # tests/perf-test/SelectionList.perf-test.tsx
|
🤖 Resolved the merge conflict and pushed the merge commit — the PR is mergeable again. Conflict: Resolution: Kept this branch's typed version (the Please re-run through the test steps since |
|
MelvinBot has made 5 consecutive commits trying to fix CI failures. Automatic CI fix dispatches are now paused for this PR. Next steps: A human should review the recent commits and resolve the conflicting CI errors manually. |
…P width
Co-authored-by: {"message":"Not Found","documentation_url":"https://docs.github.com/rest/issues/comments#get-an-issue-comment","status":"404"} <{"message":"Not Found","documentation_url":"https://docs.github.com/rest/issues/comments#get-an-issue-comment","status":"404"}@users.noreply.github.com>
|
🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
Feeling good to me, let's get this into final review! |
|
@shawnborton Could you please ask Melvin to complete this tasks?
|
|
@MelvinBot please Fix the ESLint error by adding a justified // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth with the reasoning |
… inputs Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com>
|
Fixed the ESLint failure. Both errors came from the shared search-input change intentionally reading The reasoning: sizing by
|
|
🚧 blimpich has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/blimpich in version: 9.4.43-0 🚀
|
No help site changes requiredI reviewed the changes in this PR against the help site articles under Why: This is a purely presentational change. It:
No user-facing feature, tab name, setting, button label, or workflow changed — only input height and label presentation. Help articles document features and workflows, not input dimensions or label styling, and none of them describe or screenshot these search inputs (the emoji picker and selection-list search aren't referenced anywhere in @shawnborton, no linked help site PR was needed here since the change is cosmetic-only. If you feel any article should be refreshed regardless, let me know and I'll open one. |







Explanation of Change
Updates search inputs that appear above lists / inside popovers to use the smaller, compact size we already use above our tables, with the two responsive sizes: 34px on web/desktop and 46px on mobile (narrow layout).
Previously these inputs rendered a tall (
variables.inputHeight= 52px)BaseTextInputwith a floating label. The compact height cannot fit a floating label, so — matching how the "above the table"SearchPageInputworks — the label is now rendered as a placeholder instead, while accessibility is preserved viaaccessibilityLabel.Per
shawnborton's direction on the issue, this is a global change applied to the shared search input, so it affects all search inputs that appear above lists (Search filter popovers, member/selection-list search, etc.) plus the emoji picker.What changed:
listSearchInputWideWrapper(height: 34) andlistSearchInputNarrowWrapper(height: 46) insrc/styles/index.ts.SelectionList's shared search input (src/components/SelectionList/components/TextInput.tsx) now renders the compact, placeholder-based input responsively.EmojiPickerMenu/index.tsxandindex.native.tsx) uses the same compact, placeholder-based styling.Fixed Issues
$ #96491
PROPOSAL:
Tests
accessibilityLabel).Offline tests
This is a purely presentational change (input height + label→placeholder) with no network dependency, so behavior is identical online and offline.
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Automated web verification (MelvinBot):