Use when building responsive layouts and mobile-first designs with Tailwind CSS. Covers breakpoints, container queries, and responsive utilities.
Provides mobile-first responsive design patterns using Tailwind CSS breakpoint prefixes. Claude uses this when building adaptive layouts that need to scale from mobile to desktop, covering grid systems, typography, spacing, and visibility controls.
/plugin marketplace add TheBushidoCollective/han/plugin install jutsu-scala@hanThis skill is limited to using the following tools:
Tailwind CSS provides a mobile-first responsive design system using breakpoint prefixes that make it easy to build adaptive layouts.
Tailwind uses a mobile-first breakpoint system. Unprefixed utilities apply to all screen sizes, and breakpoint prefixes apply from that breakpoint and up:
<!-- Mobile: full width, Tablet+: half width, Desktop+: third width -->
<div class="w-full md:w-1/2 lg:w-1/3">
Responsive width
</div>
// tailwind.config.js default breakpoints
{
sm: '640px', // Small devices (landscape phones)
md: '768px', // Medium devices (tablets)
lg: '1024px', // Large devices (desktops)
xl: '1280px', // Extra large devices (large desktops)
'2xl': '1536px' // 2X large devices (larger desktops)
}
Design for mobile first, then add complexity for larger screens:
<!-- Good: Mobile-first approach -->
<div class="
flex flex-col
md:flex-row
gap-4
">
<div class="w-full md:w-1/2">Column 1</div>
<div class="w-full md:w-1/2">Column 2</div>
</div>
<!-- Bad: Desktop-first (requires more overrides) -->
<div class="
flex flex-row
sm:flex-col
">
Scale text appropriately across devices:
<h1 class="
text-2xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl
font-bold
leading-tight
">
Responsive Heading
</h1>
<p class="
text-sm sm:text-base md:text-lg
leading-relaxed
">
Body text that scales
</p>
Adjust padding and margins for different screens:
<div class="
px-4 sm:px-6 md:px-8 lg:px-12
py-8 md:py-12 lg:py-16
">
<!-- Content with responsive padding -->
</div>
<section class="
space-y-4 md:space-y-6 lg:space-y-8
">
<!-- Responsive spacing between children -->
</section>
Create responsive grids that adapt to screen size:
<!-- 1 column mobile, 2 tablet, 3 desktop, 4 large desktop -->
<div class="
grid
grid-cols-1
sm:grid-cols-2
lg:grid-cols-3
xl:grid-cols-4
gap-4 md:gap-6
">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
<div>Item 4</div>
</div>
Control visibility across breakpoints:
<!-- Mobile menu button: visible on mobile, hidden on desktop -->
<button class="md:hidden">
<svg><!-- Menu icon --></svg>
</button>
<!-- Desktop navigation: hidden on mobile, visible on desktop -->
<nav class="hidden md:flex space-x-6">
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Contact</a>
</nav>
<!-- Show only on mobile -->
<div class="block md:hidden">Mobile only</div>
<!-- Show only on desktop -->
<div class="hidden lg:block">Desktop only</div>
<section class="
relative
min-h-screen md:min-h-[600px] lg:min-h-[800px]
px-4 sm:px-6 lg:px-8
py-12 md:py-16 lg:py-20
">
<div class="
max-w-7xl mx-auto
flex flex-col md:flex-row
items-center
gap-8 md:gap-12
">
<!-- Text Content -->
<div class="
w-full md:w-1/2
text-center md:text-left
">
<h1 class="
text-3xl sm:text-4xl md:text-5xl lg:text-6xl
font-bold
mb-4 md:mb-6
">
Welcome to Our Site
</h1>
<p class="
text-base sm:text-lg md:text-xl
text-gray-600
mb-6 md:mb-8
">
This is a responsive hero section that adapts to all screen sizes.
</p>
<button class="
w-full sm:w-auto
px-6 md:px-8
py-3 md:py-4
bg-blue-500 hover:bg-blue-600
text-white
text-base md:text-lg
rounded-lg
">
Get Started
</button>
</div>
<!-- Image -->
<div class="
w-full md:w-1/2
order-first md:order-last
">
<img
src="/hero.jpg"
alt="Hero"
class="
w-full
rounded-lg md:rounded-xl
shadow-lg md:shadow-2xl
"
/>
</div>
</div>
</section>
<div class="
grid
grid-cols-1
sm:grid-cols-2
lg:grid-cols-3
xl:grid-cols-4
gap-4 sm:gap-6 lg:gap-8
px-4 sm:px-6 lg:px-8
">
{cards.map(card => (
<div class="
bg-white
rounded-lg md:rounded-xl
shadow-md hover:shadow-xl
overflow-hidden
transition-shadow
">
<img
src={card.image}
alt={card.title}
class="
w-full
h-48 sm:h-56 lg:h-64
object-cover
"
/>
<div class="
p-4 sm:p-5 lg:p-6
">
<h3 class="
text-lg sm:text-xl
font-semibold
mb-2
">
{card.title}
</h3>
<p class="
text-sm sm:text-base
text-gray-600
line-clamp-3
">
{card.description}
</p>
</div>
</div>
))}
</div>
<nav class="
bg-white
border-b border-gray-200
sticky top-0 z-50
">
<div class="
max-w-7xl mx-auto
px-4 sm:px-6 lg:px-8
">
<div class="
flex justify-between items-center
h-16 md:h-20
">
<!-- Logo -->
<div class="flex-shrink-0">
<img
src="/logo.svg"
alt="Logo"
class="h-8 md:h-10 w-auto"
/>
</div>
<!-- Desktop Navigation -->
<div class="
hidden md:flex
space-x-8
">
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
Home
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
About
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
Services
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
Contact
</a>
</div>
<!-- Mobile Menu Button -->
<button class="
md:hidden
p-2
rounded-md
text-gray-700 hover:bg-gray-100
">
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div class="md:hidden border-t border-gray-200">
<div class="px-2 pt-2 pb-3 space-y-1">
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
Home
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
About
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
Services
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
Contact
</a>
</div>
</div>
</nav>
Use container queries for component-level responsiveness:
// tailwind.config.js
module.exports = {
plugins: [
require('@tailwindcss/container-queries'),
],
}
<div class="@container">
<div class="
@sm:grid @sm:grid-cols-2
@lg:grid-cols-3
gap-4
">
<!-- Responsive to container, not viewport -->
</div>
</div>
Add project-specific breakpoints:
// tailwind.config.js
module.exports = {
theme: {
screens: {
'xs': '475px',
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
'2xl': '1536px',
'3xl': '1920px',
// Max-width breakpoints
'max-md': { 'max': '767px' },
// Height breakpoints
'tall': { 'raw': '(min-height: 800px)' },
},
},
}
<div class="
portrait:flex-col
landscape:flex-row
">
Content that adapts to orientation
</div>
<div class="
text-base
print:text-xs
print:hidden
">
This is hidden in print
</div>
<div class="hidden print:block">
This only appears in print
</div>
<img
src="/image.jpg"
alt="Responsive image"
class="
w-full
h-auto
max-w-xs sm:max-w-sm md:max-w-md lg:max-w-lg xl:max-w-xl
mx-auto
"
/>
<!-- With aspect ratio -->
<div class="
aspect-square sm:aspect-video
w-full
overflow-hidden
">
<img
src="/image.jpg"
class="w-full h-full object-cover"
/>
</div>
<div class="
flex
flex-col sm:flex-row
gap-4
items-center sm:items-start
justify-center sm:justify-between
">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<div class="flex flex-col md:flex-row">
<div class="order-2 md:order-1">First on desktop, second on mobile</div>
<div class="order-1 md:order-2">Second on desktop, first on mobile</div>
</div>
<!-- Bad: Excessive breakpoints -->
<div class="
text-xs
sm:text-sm
md:text-base
lg:text-lg
xl:text-xl
2xl:text-2xl
">
<!-- Good: Strategic breakpoints -->
<div class="
text-sm
md:text-base
lg:text-lg
">
<!-- Bad: Desktop-only thinking -->
<div class="grid grid-cols-4 gap-2">
<!-- Good: Mobile-first -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<!-- Bad: Too many custom breakpoints -->
<div class="min-[823px]:flex min-[1043px]:grid">
<!-- Good: Use standard breakpoints -->
<div class="md:flex lg:grid">