Repository navigation
Float a frosted header and composer over the mobile chat, without the iOS 26 dimming - #1889
Conversation
With headerTransparent, iOS 26 adds an AdditionalDimmingOverlay inside the inverted message list's UIScrollView, and scrollEdgeEffects 'hidden' on the screen does not reach it. The header now has a base fill (the pre-#1875 configuration the Simulator bisect found clean), the list starts below it, and the top fade sits at the top of the list like the bottom one. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc
|
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 9 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 |
…ttom The message list now runs to the bottom of the screen and the composer floats over it with no bar, like Telegram. A static base gradient covers the composer and edgeFade.bottom above it, and the list keeps that much space below the newest message. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc
The native stack header is hidden and the chat draws its own floating header, so messages run under the chip without the iOS 26 dimming that a transparent native header causes. The chip, round buttons and composer pill are frosted (raised or surface at glass.tint opacity), and both edge fades are lighter, so messages show faintly through them. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc
Messages pass around and under the floating composer, but the pill keeps its opaque surface fill so nothing shows through where the Human types. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc
Batch QA — iOS Simulator (PR1800 glass, iOS 26, iPhone 17 Pro), head 4eaeba4Base:
Note: the dim root cause was bisected to eb8cf06 (#1875 transparent header); the overlay was a UIScrollView subview (scroll-edge effect), not a nav bar or modal. |







Requested by Vain · project thread
Why the change
Before:
headerTransparent). That header leaves anAdditionalDimmingOverlayas a direct subview of the list's UIScrollView. SettingscrollEdgeEffectstohiddenon the screen did not remove it, because react-native-screens applies that setting only to the first scroll view in the screen's first-child chain.After (Vain's follow-ups, Telegram as the reference):
headerShown: false). The chat draws its own header instead: back on the left, the chip in the middle and the computer button on the right, floating over the messages. Messages run under it and the status bar. With no native navigation bar over the list, UIKit has nothing to dim it with. The swipe back is a screen gesture and still works.glass.tint(72%) opacity. Messages show faintly through them as they pass under.edgeFade.stops: 80% at the screen edge, 40% at the middle, 0 at the end). The top fade covers the header andedgeFade.topbelow it. The bottom fade covers the composer andedgeFade.bottomabove it.Special things to note
expo-blur(a native module and a rebuild), and a blur view over a scrolling list re-renders every frame.AccentProvider.KeyboardAvoidingViewneeds no offset now that there is no native header.typecheckandvitest runpass (34 files, 277 tests).pnpm lint,oxfmt --checkandchangelog:checkare clean.node scripts/e2e-mobile-follow-latest-web.mjspasses, including tapping the chip into the Bot profile. The screenshots below come from it.affected.Change outline
src/ui/chat/header-chrome.tsx:ChatHeaderanduseChatHeaderHeight; the round buttons are frosted;systemGlassBaris removed.src/ui/chat/conversation-screen.tsx: hides the native header and rendersChatHeader; the top fade spans the header; the composer floats in the list wrapper.src/ui/design/theme.tsx: addsfrosted(fill).src/ui/chat/chat-title.tsx,channel-title.tsxandcomposer.tsx: frosted fills; the composer root has no background.src/ui/design/tokens.ts: lighteredgeFade.stops, plusedgeFade.top.DESIGN.mdand the Fade the mobile DM above the composer and move Model and Workspace into the Bot profile #1875 change fragment are updated to match.Human QA
AdditionalDimmingOverlay.🤖 Generated with Claude Code
https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc