NativeWind border color not working as expected in React Native app

200 Views Asked by At

I'm trying to style some pills using NativeWind. Here's my app:

import React, { useState, useEffect } from 'react';
import { StatusBar, View } from 'react-native';
import { Pill } from './components/Pill';

export default function App() {
  return (
    <View className="px-8 py-20">
      <Pill conditional={'ok'} />
      <Pill conditional={'windy'} />
      <Pill conditional={'foggy'} />
      <Pill conditional={'hazard'} />
      <Pill conditional={'some random thing'} />
      <Pill conditional={'issue'} />
      <StatusBar style="auto" />
    </View>
  );
}

And here's Pill.js:

import React from "react";
import { Text } from "react-native";

export function Pill({ conditional }) {
    return conditional === 'ok' ? (
        <InternalPill color="green"> No issues</InternalPill>
    ) : conditional === 'hazard' ? (
        <InternalPill color="yellow">⚠️ Hazard reported</InternalPill>
    ) : conditional === 'foggy' ? (
        <InternalPill color="gray">️ Fog advisory</InternalPill>
    ) : conditional === 'windy' ? (
        <InternalPill color="gray">️ Wind advisory</InternalPill>
    ) : conditional === 'issue' ? (
        <InternalPill color="red">❌ Issue reported</InternalPill>
    ) :
        <InternalPill color="gray">{' ' + conditional}</InternalPill>
}

function InternalPill({ children, color }) {
    return <Text className={`
    rounded-full px-3 py-1 text-sm font-semibold mr-2 border
    ${color === "yellow"
            ? "bg-yellow-100 text-yellow-800 border-yellow-800"
            : color === "red"
                ? "bg-red-100 text-red-800 border-red-800"
                : color === "green"
                    ? "bg-green-100 text-green-800 border-green-800"
                    : "bg-gray-100 text-gray-800 border-gray-600"
        }`}>
        {children}
    </Text>
}

It looks like this:

screenshot of pills

I want the pills to look closer to this:

enter image description here

Questions:

  1. Why don't I see borders? e.g. border-green-800 seems to have no effect
  2. Why isn't there rounding? e.g. rounded-full seems to have no effect
  3. The Pill component is taking up the full width of the parent view; how can I minimize the width?
1

There are 1 best solutions below

1
vit On BEST ANSWER

Question 1 and 2:

Using nativewind v4, I can't reproduce your problem. Your code worked for me

enter image description here

package.json:

...
"dependencies": {
    "expo": "~50.0.6",
    "expo-status-bar": "~1.11.1",
    "nativewind": "^4.0.1",
    "react": "18.2.0",
    "react-native": "0.73.4",
    "react-native-reanimated": "~3.6.2",
    "tailwindcss": "^3.4.1"
  },
...

Question 3:

You need to use flex in your wrapper component.

<View className="px-8 py-20 flex items-start">
   <Pill conditional={'ok'} />
   <Pill conditional={'windy'} />
   <Pill conditional={'foggy'} />
   <Pill conditional={'hazard'} />
   <Pill conditional={'some random thing'} />
   <Pill conditional={'issue'} />
   <StatusBar style="auto" />
</View>

Result:

result