Master utility-first CSS with Tailwind's powerful patterns and features.
Responsive Design
<!-- Mobile-first approach -->
<div class="w-full md:w-1/2 lg:w-1/3 xl:w-1/4">Responsive width</div>
<!-- Container queries -->
<div class="@container">
<div class="@sm:grid-cols-2 @md:grid-cols-3 grid">
Grid adapts to container size, not viewport!
</div>
</div>
<!-- Arbitrary values -->
<div class="w-[calc(100%-2rem)] lg:w-[600px]">Custom widths</div>
Dark Mode
<!-- System preference -->
<div class="bg-white dark:bg-gray-900">
<p class="text-gray-900 dark:text-white">Automatic dark mode</p>
</div>
<!-- Manual toggle -->
<html class="dark">
<body class="bg-white dark:bg-gray-900">
<!-- Content -->
</body>
</html>
// Toggle dark mode
function toggleDarkMode() {
document.documentElement.classList.toggle('dark');
}
Custom Utilities
// tailwind.config.js
module.exports = {
theme: {
extend: {
spacing: {
128: '32rem',
144: '36rem',
},
colors: {
brand: {
50: '#f0f9ff',
100: '#e0f2fe',
// ... full palette
900: '#0c4a6e',
},
},
fontSize: {
'2xs': '0.625rem',
},
},
},
plugins: [
function ({ addUtilities }) {
addUtilities({
'.scrollbar-hide': {
'-ms-overflow-style': 'none',
'scrollbar-width': 'none',
'&::-webkit-scrollbar': {
display: 'none',
},
},
});
},
],
};
Component Patterns
<!-- Card component pattern -->
<div
class="rounded-lg border border-gray-200 bg-white p-6 shadow-sm dark:border-gray-700 dark:bg-gray-800"
>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
Card Title
</h3>
<p class="mt-2 text-sm text-gray-600 dark:text-gray-400">Card content</p>
</div>
<!-- Button variants -->
<button
class="inline-flex items-center justify-center rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-700 focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50"
>
Primary Button
</button>
<button
class="inline-flex items-center justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-800 dark:text-white dark:hover:bg-gray-700"
>
Secondary Button
</button>
State Variants
<!-- Hover, focus, active states -->
<button
class="bg-blue-500 hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 active:bg-blue-700"
>
Interactive Button
</button>
<!-- Disabled state -->
<button
class="bg-blue-500 disabled:cursor-not-allowed disabled:bg-gray-300"
disabled
>
Disabled
</button>
<!-- Group hover -->
<div class="group">
<img class="transition group-hover:scale-110" src="..." />
<p class="group-hover:text-blue-600">Hover the parent</p>
</div>
<!-- Peer state -->
<input type="checkbox" class="peer" id="terms" />
<label class="peer-checked:text-blue-600" for="terms"> I agree to terms </label>
Layout Utilities
<!-- Flexbox -->
<div class="flex items-center justify-between gap-4">
<div class="flex-1">Flexible</div>
<div class="flex-shrink-0">Fixed</div>
</div>
<!-- Grid -->
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
<div>Item 1</div>
<div class="md:col-span-2">Spanning item</div>
</div>
<!-- Positioning -->
<div class="relative h-64">
<div class="absolute inset-0 flex items-center justify-center">Centered</div>
<div class="absolute right-4 top-4">Top right corner</div>
</div>
Typography
<article
class="prose prose-lg dark:prose-invert prose-headings:font-bold prose-a:text-blue-600 max-w-none"
>
<h1>Article Title</h1>
<p>Article content with automatic styling...</p>
</article>
Tailwind's utility-first approach creates maintainable, consistent designs.
Posted ontailwindcsswith tags: