---
name: features-content-detection
description: How Tailwind detects classes in source files and how to customize content scanning
---
# Detecting Classes in Source Files
Tailwind scans your project for utility classes and generates CSS based on what you've actually used.
## How Classes Are Detected
Tailwind treats all source files as plain text and looks for tokens that could be class names:
```jsx
export function Button({ color, children }) {
const colors = {
black: "bg-black text-white",
blue: "bg-blue-500 text-white",
};
return (
);
}
```
Tailwind detects `bg-black`, `text-white`, `bg-blue-500`, `rounded-full`, `px-2`, and `py-1.5` from this file.
## Dynamic Class Names
Tailwind scans files as plain text, so it can't understand string concatenation or interpolation.
### ❌ Don't Construct Classes Dynamically
```html
```
The strings `text-red-600` and `text-green-600` don't exist in the file, so Tailwind won't generate them.
### ✅ Use Complete Class Names
```html
Content
```
### ❌ Don't Build Classes from Props
```jsx
function Button({ color, children }) {
return ;
}
```
### ✅ Map Props to Static Classes
```jsx
function Button({ color, children }) {
const colorVariants = {
blue: "bg-blue-600 hover:bg-blue-500",
red: "bg-red-600 hover:bg-red-500",
};
return ;
}
```
## Which Files Are Scanned
Tailwind scans every file in your project except:
- Files in `.gitignore`
- Files in `node_modules`
- Binary files (images, videos, zip files)
- CSS files
- Common package manager lock files
## Explicitly Registering Sources
Use `@source` to explicitly register source paths:
```css
@import "tailwindcss";
@source "../node_modules/@acmecorp/ui-lib";
```
This is useful for external libraries built with Tailwind that are in `.gitignore`.
## Setting Base Path
Set the base path for source detection:
```css
@import "tailwindcss" source("../src");
```
Useful in monorepos where build commands run from the root.
## Ignoring Specific Paths
Use `@source not` to ignore paths:
```css
@import "tailwindcss";
@source not "../src/components/legacy";
```
## Disabling Automatic Detection
Use `source(none)` to disable automatic detection:
```css
@import "tailwindcss" source(none);
@source "../admin";
@source "../shared";
```
Useful for projects with multiple Tailwind stylesheets.
## Safelisting Utilities
Force Tailwind to generate specific classes with `@source inline()`:
```css
@import "tailwindcss";
@source inline("underline");
```
### Safelisting with Variants
Generate classes with variants:
```css
@import "tailwindcss";
@source inline("{hover:,focus:,}underline");
```
### Safelisting with Ranges
Use brace expansion to generate multiple classes:
```css
@import "tailwindcss";
@source inline("{hover:,}bg-red-{50,{100..900..100},950}");
```
This generates `bg-red-50` through `bg-red-950` with hover variants.
## Explicitly Excluding Classes
Use `@source not inline()` to prevent specific classes from being generated:
```css
@import "tailwindcss";
@source not inline("{hover:,focus:,}bg-red-{50,{100..900..100},950}");
```
## Key Points
- Tailwind scans files as plain text
- Always use complete class names, never construct them dynamically
- Map props/state to static class names
- Use `@source` to explicitly register or ignore paths
- Use `@source inline()` to safelist utilities
- Brace expansion works in inline sources for ranges