Config Structure
const defaultTheme = require('tailwindcss/defaultTheme');
module.exports = {
content: ['./src/**/*.{html,js,jsx,tsx}'],
darkMode: 'class',
theme: {
screens: {
sm: '480px',
md: '768px',
lg: '1024px',
xl: '1280px',
},
extend: {
colors: {
brand: {
50: '#f0f9ff',
500: '#0ea5e9',
900: '#0c4a6e',
},
},
fontFamily: {
sans: ['Inter', ...defaultTheme.fontFamily.sans],
},
spacing: {
'18': '4.5rem',
'128': '32rem',
},
borderRadius: {
'4xl': '2rem',
},
animation: {
'fade-in': 'fadeIn 0.5s ease-out',
},
keyframes: {
fadeIn: {
'0%': { opacity: '0' },
'100%': { opacity: '1' },
},
},
},
},
plugins: [
require('@tailwindcss/typography'),
require('@tailwindcss/forms'),
require('@tailwindcss/container-queries'),
],
}
Extend vs. Override
Important Distinction
Keys inside
theme.extend are
added to the defaults. Keys directly in
theme replace the defaults entirely. If you put
colors directly in
theme (not
extend), you lose all of Tailwind's default colors.
JIT Mode (Just-In-Time)
Since Tailwind v3, JIT is the default engine. It generates styles on-demand as you author classes, enabling:
- Instant build times — Only generates CSS for classes you actually use
- Arbitrary values —
w-[137px], bg-[#1a1a2e], grid-cols-[200px_1fr]
- All variants enabled — No need to configure which variants are active
- Development and production parity — Same CSS in both environments
Presets
Share configuration across projects using presets.
module.exports = {
theme: {
extend: {
colors: { brand: '#0ea5e9' },
fontFamily: { sans: ['Inter'] },
},
},
}
module.exports = {
presets: [require('./company-preset')],
}