cn() utility function merges Tailwind CSS classes intelligently, handling class conflicts and conditional styling. It leverages the clsx-for-tailwind library to properly resolve conflicting Tailwind utility classes.
Function Signature
Parameters
Any number of arguments that can be:
- strings: Direct class names like
"bg-blue-500 text-white" - Vars: Reflex Var objects containing class names
- lists: Lists of class names
- tuples: Tuples of class names
- None: Ignored gracefully
Returns
AVar representing the merged classes string with conflicts resolved.
How It Works
Thecn() function wraps the cn utility from the clsx-for-tailwind library, which:
- Combines multiple class name inputs
- Resolves conflicting Tailwind utility classes (e.g., later classes override earlier ones)
- Removes duplicates and normalizes the output
- Handles conditional classes and falsy values
Usage Examples
Basic Class Merging
Combine multiple class strings:Resolving Conflicting Classes
When classes conflict, later values override earlier ones:Conditional Styling
Apply classes conditionally using tuples or conditional expressions:Merging with Component Props
Combine base classes with dynamic props:Using with State Variables
Dynamically merge classes based on state:Complex Component Styling
Create reusable components with variant support:Integration with clsx-for-tailwind
Thecn() function automatically imports and uses the cn utility from the clsx-for-tailwind npm package. This library provides:
- Tailwind-aware merging: Understands Tailwind’s utility class structure
- Conflict resolution: Properly handles conflicting utilities (e.g.,
bg-red-500vsbg-blue-500) - Performance: Optimized for runtime class name generation
Best Practices
- Order matters for conflicts: Place more specific or override classes later in the arguments
- Use for variants: Ideal for component variants and conditional styling
- Combine with rx.cond(): Create dynamic, state-driven class names
- Keep base classes first: Put common, shared classes in the first argument
- Avoid inline conditionals: Use
rx.cond()orrx.match()for cleaner conditional logic
Common Patterns
Button Variants
Responsive Classes
See Also
- Styling Overview - Learn about styling in Reflex UI
- Tailwind CSS - Official Tailwind documentation
- clsx-for-tailwind - The underlying npm package