Skip to content

Conversation

@tyrauber
Copy link
Contributor

Previously, when both className and style props were provided, className-derived styles would be completely overwritten by inline styles due to Object.assign() behavior in deepMergeConfig().

As documented in nativewind/nativewind#1647

This solution:

  • Only creates style arrays when className and inline styles have non-overlapping properties
  • Maintains CSS precedence rules (inline styles override className for same properties)
  • Preserves backward compatibility with existing behavior
  • Passes all existing tests while enabling the new functionality

Enables combining NativeWind className styling with React Native Reanimated animated styles when they target different CSS properties.

Fixes issue where className was ignored when style prop was also present, while preserving expected CSS specificity behavior.

Test locally with a patch.

Previously, when both className and style props were provided, className-derived
styles would be completely overwritten by inline styles due to Object.assign()
behavior in deepMergeConfig().

This refined solution:
- Only creates style arrays when className and inline styles have non-overlapping properties
- Maintains CSS precedence rules (inline styles override className for same properties)
- Preserves backward compatibility with existing behavior
- Passes all existing tests while enabling the new functionality

Enables combining NativeWind className styling with React Native Reanimated
animated styles when they target different CSS properties.

Fixes issue where className was ignored when style prop was also present,
while preserving expected CSS specificity behavior.
Copilot AI review requested due to automatic review settings October 28, 2025 01:21
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes a bug where className-derived styles were completely overwritten by inline style props in React Native components. The fix enables both to coexist when they target different CSS properties while maintaining proper CSS precedence rules (inline styles override className for the same properties).

Key Changes:

  • Modified deepMergeConfig() to detect non-overlapping properties between className and inline styles
  • Creates style arrays only when different properties should coexist, preserving backward compatibility
  • Added comprehensive test coverage for the new merging behavior

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
src/native/styles/index.ts Implements special style merging logic to support coexistence of className and inline style props
src/tests/native/className-with-style.test.tsx Adds test cases verifying the new style merging behavior for different scenarios

Address code review feedback by improving the style merging logic:

- Remove Set creation and array spreading for better performance
- Add early exit when finding non-overlapping properties
- Simplify logic flow making it more readable and maintainable
- Maintain identical functionality while reducing computational overhead

Performance improvements are especially beneficial for components
with many style properties, reducing unnecessary object iterations.
@DominikScholz
Copy link

looking forward to this to get Nativewind v5 working

@danstepanov danstepanov merged commit 2c68396 into nativewind:main Oct 31, 2025
6 checks passed
@danstepanov
Copy link
Member

Thanks @tyrauber 🫡

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants