fix(ios): restore opaque scroll-edge appearance on iOS 26+ - #567
Draft
thiagobrez wants to merge 2 commits into
Draft
fix(ios): restore opaque scroll-edge appearance on iOS 26+#567thiagobrez wants to merge 2 commits into
thiagobrez wants to merge 2 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR Description
Fixes #532.
scrollEdgeAppearance="transparent"and"opaque"are intended to differ at the same content/scroll position: transparent keeps the floating Liquid Glass presentation with content visible beneath it, while opaque provides a solid theme-appropriate backing behind the complete tab bar. Default/unconfigured behavior remains UIKit's platform default, and an explicittabBarStyle.backgroundColorreplaces the system background for non-transparent appearances.The JavaScript prop and
UITabBarAppearancemapping were already correct. Runtime inspection showed the expected opaque and transparent appearance objects reaching UIKit, but iOS 26+ Liquid Glass does not render their background opacity as a backing surface. The smallest public-API correction setsUITabBar.backgroundColoron iOS 26+ only: transparent clears it, custom non-transparent colors are preserved, opaque/translucent={false}falls back to dynamicsystemBackground, and default/unconfigured with no color remains clear.This keeps the existing appearance object responsible for item styling, shadows, and older iOS behavior. It adds no delays, forced update loops, private APIs, global appearance proxies, overlays, masks, or new abstractions. macOS, tvOS, visionOS, pre-iOS-26 behavior, dynamic colors, custom colors, custom tab bars, and non-scroll-edge configuration are unchanged.
How to test?
Local validation completed:
yarn install --immutableyarn lint(0 errors; 3 pre-existing warnings)yarn typecheckyarn buildRCT_NEW_ARCH_ENABLED=1 yarn build:iossrc/__tests__/index.test.tsx(passed; repository's one existing todo)ReactNativeBottomTabsexample workspace build for the iOS simulator with code signing disabledgit diff --checkAll required GitHub Actions checks passed: lint, SwiftLint, library build, Android example build, and iOS example build. CodeQL analysis also passed for Actions, C/C++, and JavaScript/TypeScript.
Device verification used the repository example app and the installed
agent-device0.20.10 workflow (open → snapshot -i → interact/scroll → explicitly verify → close):CD1ADD09-474F-4618-899B-689243327BC6)27A5228h)The final binary was verified at equivalent top/bottom article positions for default, transparent, opaque, and custom-color configurations. Additional checks covered minimize-on-scroll collapse/restore, hide/show, light/dark dynamic
systemBackground,translucent={false}, and the custom-tab-bar example.The mandatory adversarial gate ran exactly once with Claude Code Fable/High, followed by exactly one GPT-5.6-Sol/High remediation pass; Fable was not rerun. One valid custom-color finding was fixed, the lifecycle concern was disproven with device evidence, the exact-iOS-26 objection was disproven by the explicit iOS-26-or-newer requirement while documenting the runtime limitation, and committed media was retained per the task requirement. See the unchanged review JSON and finding dispositions.
Screenshots
Complete reproduction, diagnosis, environment, and evidence index: issue #532 evidence README.
Baseline (before fix):
Final verification: