Using Tailwind CSS Colors with CSS Modules

Combine Tailwind CSS color utilities with CSS Modules for scoped styling in component-based projects.

css-modulesscoped-stylesintegrationcomponents
intermediate8 min readtutorial

Why Combine Tailwind with CSS Modules?

CSS Modules scope class names locally while Tailwind provides utility classes globally. You can use both together: Tailwind for colors and spacing, CSS Modules for complex animations or component-specific styles.

Using @apply for Color Tokens

/* Card.module.css */
.card {
  @apply bg-white dark:bg-slate-800 rounded-xl shadow-md;
}
.cardTitle {
  @apply text-slate-900 dark:text-slate-100 text-lg font-semibold;
}
.cardBody {
  @apply text-slate-600 dark:text-slate-300;
}
.cardAccent {
  @apply border-l-4 border-blue-500;
}

Mixing Approaches in Components

import styles from './Card.module.css';

export function Card({ title, children, accent }) {
  return (
    <div className={`${styles.card} ${accent ? styles.cardAccent : ''} p-6`}>
      <h3 className={styles.cardTitle}>{title}</h3>
      <div className={styles.cardBody}>{children}</div>
    </div>
  );
}

When to Use Each Approach

  • Use Tailwind classes directly for one-off color utilities
  • Use CSS Modules with @apply when you have complex selectors or pseudo-elements
  • Keep color tokens in Tailwind config so both systems share the same palette
  • Avoid duplicating color values between CSS Modules and Tailwind config

Frequently Asked Questions

Does @apply work inside CSS Modules?

Yes. PostCSS processes @apply before CSS Modules scoping, so Tailwind utilities expand correctly within module files.

Is there a performance penalty for mixing CSS Modules and Tailwind?

No significant penalty. CSS Modules add scoped names at build time. Combined output is still a single CSS file with Tailwind utilities and module styles.

Try Our Color Tools

50+ free tools for Tailwind CSS developers. No signup required.

Explore Tools