Install
Terminal · npx$
npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill tailwindcss-mobile-firstWorks with Paperclip
How Tailwindcss Mobile First fits into a Paperclip company.
Tailwindcss Mobile First drops into any Paperclip agent that handles this kind of work. Assign it to a specialist inside a pre-configured PaperclipOrg company and the skill becomes available on every heartbeat — no prompt engineering, no tool wiring.
S
SaaS FactoryPaired
Pre-configured AI company — 18 agents, 18 skills, one-time purchase.
$27$59
Explore packSource file
SKILL.md978 linesExpandCollapse
---name: tailwindcss-mobile-firstdescription: Mobile-first responsive design patterns with Tailwind CSS v4 (2025-2026). PROACTIVELY activate for: (1) mobile-first design with Tailwind breakpoints (sm:, md:, lg:, xl:, 2xl:), (2) responsive utility ordering (default = mobile, then breakpoints), (3) responsive typography (text-base sm:text-lg lg:text-xl), (4) responsive grids and flexbox, (5) hide/show across breakpoints (hidden md:block), (6) max-* breakpoints for desktop-down overrides, (7) container queries (@container) for component-level responsiveness, (8) safe-area insets and notch handling, (9) landscape vs portrait orientation, (10) touch vs hover (hover: with @media). Provides: breakpoint reference, mobile-first patterns, container-query examples, safe-area recipes, and touch/hover handling.--- # Mobile-First Responsive Design (2025/2026) ## Core Philosophy Mobile-first design is the **industry standard for 2025/2026**. With mobile traffic consistently exceeding 60% of global web traffic and Google's mobile-first indexing, starting with mobile ensures optimal user experience and SEO performance. ### The Mobile-First Mindset ```html<!-- CORRECT: Mobile-first (progressive enhancement) --><div class="text-sm md:text-base lg:text-lg"> Start small, enhance upward</div> <!-- INCORRECT: Desktop-first (graceful degradation) --><div class="lg:text-lg md:text-base text-sm"> Starts large, reduces down (more code, more bugs)</div>``` **Key Principle**: Unprefixed utilities apply to ALL screen sizes. Breakpoint prefixes apply at that size AND ABOVE. ## 2025/2026 Breakpoint Strategy ### Tailwind's Default Breakpoints | Prefix | Min-width | Target Devices ||--------|-----------|----------------|| (none) | 0px | All mobile phones (base) || `sm:` | 640px (40rem) | Large phones, small tablets || `md:` | 768px (48rem) | Tablets (portrait) || `lg:` | 1024px (64rem) | Tablets (landscape), laptops || `xl:` | 1280px (80rem) | Desktops || `2xl:` | 1536px (96rem) | Large desktops | ### Content-Driven Breakpoints **Best Practice 2025/2026**: Let content determine breakpoints, not device dimensions. ```css@theme { /* Override defaults based on YOUR content needs */ --breakpoint-sm: 36rem; /* 576px - when your content needs more space */ --breakpoint-md: 48rem; /* 768px */ --breakpoint-lg: 62rem; /* 992px - common content width */ --breakpoint-xl: 75rem; /* 1200px */ --breakpoint-2xl: 90rem; /* 1440px */ /* Add custom breakpoints for specific content needs */ --breakpoint-xs: 20rem; /* 320px - very small devices */ --breakpoint-3xl: 120rem; /* 1920px - ultra-wide */}``` ### Screen Coverage Strategy ```html<!-- Cover the most common device ranges (2025/2026 data) --> <!-- 375px-430px: ~50% of mobile devices (iPhone, modern Android) --><div class="px-4">Mobile base</div> <!-- 768px+: Tablets and small laptops --><div class="px-4 md:px-6">Tablet enhancement</div> <!-- 1024px+: Desktop experience --><div class="px-4 md:px-6 lg:px-8">Desktop enhancement</div> <!-- 1440px+: Wide desktop experience --><div class="px-4 md:px-6 lg:px-8 xl:px-12">Wide desktop</div>``` ## Fluid Typography System ### CSS Clamp for Smooth Scaling Fluid typography eliminates jarring size jumps between breakpoints: ```css@theme { /* Fluid typography scale */ --text-fluid-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem); --text-fluid-sm: clamp(0.875rem, 0.8rem + 0.375vw, 1rem); --text-fluid-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem); --text-fluid-lg: clamp(1.125rem, 1rem + 0.625vw, 1.25rem); --text-fluid-xl: clamp(1.25rem, 1rem + 1.25vw, 1.5rem); --text-fluid-2xl: clamp(1.5rem, 1.1rem + 2vw, 2rem); --text-fluid-3xl: clamp(1.875rem, 1.2rem + 3.375vw, 2.5rem); --text-fluid-4xl: clamp(2.25rem, 1rem + 6.25vw, 3.5rem); --text-fluid-5xl: clamp(3rem, 1rem + 10vw, 5rem);}``` **Important for Accessibility**: Always combine `vw` with `rem` to respect user zoom preferences (WCAG compliance). ### Using Fluid Typography ```html<!-- Fluid heading that scales smoothly --><h1 class="text-fluid-4xl font-bold leading-tight"> Responsive Heading</h1> <!-- Fluid body text --><p class="text-fluid-base leading-relaxed max-w-prose"> Body text that scales proportionally with the viewport while respecting user's font size preferences.</p> <!-- Fluid with breakpoint overrides for fine control --><h2 class="text-fluid-2xl lg:text-fluid-3xl font-semibold"> Section Title</h2>``` ## Fluid Spacing System ### Clamp-Based Spacing ```css@theme { /* Fluid spacing scale */ --spacing-fluid-xs: clamp(0.25rem, 0.2rem + 0.25vw, 0.5rem); --spacing-fluid-sm: clamp(0.5rem, 0.4rem + 0.5vw, 1rem); --spacing-fluid-md: clamp(1rem, 0.75rem + 1.25vw, 2rem); --spacing-fluid-lg: clamp(1.5rem, 1rem + 2.5vw, 3rem); --spacing-fluid-xl: clamp(2rem, 1.25rem + 3.75vw, 4rem); --spacing-fluid-2xl: clamp(3rem, 1.5rem + 7.5vw, 6rem); --spacing-fluid-section: clamp(4rem, 2rem + 10vw, 8rem);}``` ### Using Fluid Spacing ```html<!-- Fluid section padding --><section class="py-fluid-section px-fluid-md"> <div class="max-w-7xl mx-auto"> <h2 class="mb-fluid-lg">Section Title</h2> <div class="grid gap-fluid-md grid-cols-1 md:grid-cols-2 lg:grid-cols-3"> <!-- Cards --> </div> </div></section> <!-- Hero section with fluid spacing --><header class="min-h-screen flex items-center py-fluid-2xl px-fluid-md"> <div class="max-w-4xl"> <h1 class="text-fluid-5xl mb-fluid-md">Hero Title</h1> <p class="text-fluid-lg mb-fluid-lg">Hero description</p> <button class="px-fluid-md py-fluid-sm">Get Started</button> </div></header>``` ## Touch-Friendly Interactive Elements ### WCAG 2.2 Touch Target Requirements **Minimum sizes (2025 standards)**:- **WCAG 2.2 Level AA**: 24x24 CSS pixels minimum- **Recommended**: 44x44 CSS pixels (Apple, Google, Microsoft guidelines)- **Optimal**: 48x48 CSS pixels for critical actions ```html<!-- WCAG 2.2 compliant touch targets --> <!-- Minimum AA compliant (24px) --><button class="min-h-6 min-w-6 p-1"> <svg class="h-4 w-4">...</svg></button> <!-- Recommended size (44px) --><button class="min-h-11 min-w-11 p-2.5"> <svg class="h-6 w-6">...</svg> <span class="sr-only">Action</span></button> <!-- Optimal for primary actions (48px) --><button class="min-h-12 min-w-12 px-6 py-3 text-base"> Primary Action</button>``` ### Extended Touch Targets ```html<!-- Extend touch target beyond visible element --><a href="/link" class="relative inline-block text-sm"> Small visible link <!-- Invisible extended touch area --> <span class="absolute -inset-3" aria-hidden="true"></span></a> <!-- Icon button with extended target --><button class="relative p-2 -m-2 rounded-lg hover:bg-gray-100"> <svg class="h-5 w-5" aria-hidden="true">...</svg> <span class="sr-only">Close</span></button>``` ### Touch Target Spacing ```html<!-- Adequate spacing between touch targets (minimum 8px gap) --><nav class="flex gap-3"> <a href="#" class="min-h-11 px-4 py-2.5">Home</a> <a href="#" class="min-h-11 px-4 py-2.5">About</a> <a href="#" class="min-h-11 px-4 py-2.5">Contact</a></nav> <!-- Stacked navigation with adequate spacing --><nav class="flex flex-col"> <a href="#" class="py-3 px-4 min-h-11 border-b border-gray-100">Link 1</a> <a href="#" class="py-3 px-4 min-h-11 border-b border-gray-100">Link 2</a> <a href="#" class="py-3 px-4 min-h-11">Link 3</a></nav> <!-- Button group with safe spacing --><div class="flex flex-wrap gap-3"> <button class="min-h-11 px-4 py-2">Cancel</button> <button class="min-h-11 px-4 py-2 bg-blue-600 text-white">Confirm</button></div>``` ## Container Queries (2025 Game-Changer) Container queries enable **component-level responsiveness**, independent of viewport size. ### Setup ```css@import "tailwindcss";@plugin "@tailwindcss/container-queries";``` ### Container Query Breakpoints | Class | Min-width ||-------|-----------|| `@xs` | 20rem (320px) || `@sm` | 24rem (384px) || `@md` | 28rem (448px) || `@lg` | 32rem (512px) || `@xl` | 36rem (576px) || `@2xl` | 42rem (672px) || `@3xl` | 48rem (768px) || `@4xl` | 56rem (896px) || `@5xl` | 64rem (1024px) | ### Practical Container Query Patterns ```html<!-- Card that responds to its container, not viewport --><article class="@container"> <div class=" flex flex-col @sm:flex-row gap-4 p-4 bg-white rounded-xl shadow-sm "> <img src="..." class=" w-full @sm:w-32 @lg:w-48 aspect-video @sm:aspect-square object-cover rounded-lg " /> <div class="flex-1 min-w-0"> <h3 class="text-base @md:text-lg @lg:text-xl font-semibold truncate"> Card Title </h3> <p class=" text-sm @md:text-base text-gray-600 line-clamp-2 @lg:line-clamp-3 mt-2 "> Description that adapts to available space... </p> <div class="mt-4 flex flex-wrap gap-2 @md:gap-3"> <span class="text-xs @md:text-sm px-2 py-1 bg-gray-100 rounded">Tag</span> </div> </div> </div></article>``` ### Named Containers ```html<div class="@container/sidebar w-64"> <nav class=" flex flex-col @lg/sidebar:flex-row @lg/sidebar:items-center gap-2 @lg/sidebar:gap-4 "> <a href="#">Link 1</a> <a href="#">Link 2</a> </nav></div> <main class="@container/main flex-1"> <div class=" grid grid-cols-1 @md/main:grid-cols-2 @xl/main:grid-cols-3 gap-6 "> <!-- Grid items respond to main container --> </div></main>``` ### When to Use Container vs Viewport Queries | Use Container Queries | Use Viewport Queries ||----------------------|---------------------|| Reusable components | Page-level layouts || Sidebar widgets | Navigation bars || Card grids | Hero sections || Embedded content | Full-width sections || CMS/dynamic content | Fixed app shells | ## Responsive Layout Patterns ### Mobile-First Grid System ```html<!-- Auto-responsive grid with minimum card width --><div class=" grid gap-6 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"> <!-- Cards automatically flow --></div> <!-- CSS Grid auto-fit (no breakpoints needed) --><div class="grid grid-cols-[repeat(auto-fit,minmax(280px,1fr))] gap-6"> <!-- Cards auto-fit with 280px minimum --></div> <!-- CSS Grid auto-fill for fixed-size items --><div class="grid grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-4"> <!-- Fixed minimum size, grows to fill --></div>``` ### Responsive Flexbox Patterns ```html<!-- Stack to row --><div class="flex flex-col md:flex-row gap-4"> <div class="flex-1">Content 1</div> <div class="flex-1">Content 2</div></div> <!-- Wrap with centered items --><div class="flex flex-wrap justify-center gap-4"> <div class="w-full sm:w-auto">Item 1</div> <div class="w-full sm:w-auto">Item 2</div> <div class="w-full sm:w-auto">Item 3</div></div> <!-- Mobile stack, desktop inline with push --><div class="flex flex-col sm:flex-row sm:items-center gap-4"> <div class="flex-1"> <h3>Title</h3> <p class="text-sm text-gray-600">Description</p> </div> <button class="sm:ml-auto min-h-11 px-4 py-2">Action</button></div>``` ### Responsive Sidebar Layouts ```html<!-- Collapsible sidebar --><div class="flex min-h-screen"> <!-- Sidebar: hidden on mobile, visible on desktop --> <aside class=" hidden lg:flex lg:flex-col w-64 border-r bg-gray-50 "> <nav class="flex-1 p-4">...</nav> </aside> <!-- Main content --> <main class="flex-1 p-4 lg:p-8"> Content </main></div> <!-- Mobile drawer + desktop sidebar --><div class="relative flex min-h-screen"> <!-- Mobile drawer overlay --> <div class=" fixed inset-0 z-40 lg:hidden bg-black/50 data-[open=false]:hidden " data-open="false"> <aside class="w-64 h-full bg-white"> Mobile navigation </aside> </div> <!-- Desktop sidebar --> <aside class="hidden lg:block w-64 border-r"> Desktop navigation </aside> <main class="flex-1">Content</main></div>``` ### Holy Grail Layout (2025) ```html<div class="min-h-screen grid grid-rows-[auto_1fr_auto]"> <!-- Header --> <header class="sticky top-0 z-50 h-16 bg-white border-b shadow-sm"> <nav class="h-full max-w-7xl mx-auto px-4 flex items-center justify-between"> <Logo /> <ul class="hidden md:flex gap-6">...</ul> <button class="md:hidden min-h-11 min-w-11">Menu</button> </nav> </header> <!-- Main content area with optional sidebars --> <div class=" grid grid-cols-1 md:grid-cols-[240px_1fr] lg:grid-cols-[240px_1fr_280px] gap-0 "> <nav class="hidden md:block border-r p-4">Left Nav</nav> <main class="p-4 md:p-6 lg:p-8">Main Content</main> <aside class="hidden lg:block border-l p-4">Right Sidebar</aside> </div> <!-- Footer --> <footer class="bg-gray-900 text-white py-8 md:py-12"> Footer content </footer></div>``` ## Responsive Images ### Aspect Ratio Containers ```html<!-- Maintain aspect ratio across all sizes --><div class="aspect-video overflow-hidden rounded-lg"> <img src="..." class="w-full h-full object-cover" loading="lazy" /></div> <!-- Responsive aspect ratio --><div class="aspect-square sm:aspect-video lg:aspect-[4/3] overflow-hidden"> <img src="..." class="w-full h-full object-cover" /></div>``` ### Responsive Image Sizes ```html<!-- Art direction with picture element --><picture> <source media="(min-width: 1024px)" srcset="large.jpg" /> <source media="(min-width: 640px)" srcset="medium.jpg" /> <img src="small.jpg" alt="Description" class="w-full h-auto rounded-lg" loading="lazy" /></picture> <!-- Responsive srcset --><img src="image-800.jpg" srcset=" image-400.jpg 400w, image-800.jpg 800w, image-1200.jpg 1200w, image-1600.jpg 1600w " sizes=" (min-width: 1280px) 1200px, (min-width: 768px) 80vw, 100vw " alt="Responsive image" class="w-full h-auto" loading="lazy"/>``` ## Responsive Typography Patterns ### Heading Hierarchy ```html<!-- Mobile-first heading scale --><h1 class=" text-2xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl font-bold leading-tight tracking-tight"> Main Heading</h1> <h2 class=" text-xl sm:text-2xl md:text-3xl lg:text-4xl font-semibold leading-snug"> Section Heading</h2> <h3 class=" text-lg sm:text-xl md:text-2xl font-medium"> Subsection Heading</h3>``` ### Readable Body Text ```html<!-- Optimal line length and spacing --><article class="max-w-prose mx-auto"> <p class=" text-base md:text-lg leading-relaxed md:leading-loose text-gray-700 dark:text-gray-300 "> Body text optimized for readability with 45-75 characters per line. </p></article> <!-- Text that balances across lines --><h2 class="text-balance text-2xl md:text-3xl font-bold max-w-2xl"> This heading will balance text across lines to avoid orphans</h2>``` ## Mobile Navigation Patterns ### Hamburger to Full Nav ```html<nav class="relative"> <!-- Desktop navigation --> <ul class="hidden md:flex items-center gap-6"> <li><a href="#" class="py-2 hover:text-blue-600">Home</a></li> <li><a href="#" class="py-2 hover:text-blue-600">Products</a></li> <li><a href="#" class="py-2 hover:text-blue-600">About</a></li> <li><a href="#" class="py-2 hover:text-blue-600">Contact</a></li> </ul> <!-- Mobile menu button --> <button class="md:hidden min-h-11 min-w-11 p-2" aria-expanded="false" aria-controls="mobile-menu" aria-label="Toggle navigation menu" > <svg class="h-6 w-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/> </svg> </button> <!-- Mobile menu (controlled via JS) --> <div id="mobile-menu" class=" md:hidden absolute top-full left-0 right-0 bg-white shadow-lg border-t hidden " > <ul class="py-2"> <li><a href="#" class="block px-4 py-3 min-h-11 hover:bg-gray-50">Home</a></li> <li><a href="#" class="block px-4 py-3 min-h-11 hover:bg-gray-50">Products</a></li> <li><a href="#" class="block px-4 py-3 min-h-11 hover:bg-gray-50">About</a></li> <li><a href="#" class="block px-4 py-3 min-h-11 hover:bg-gray-50">Contact</a></li> </ul> </div></nav>``` ### Bottom Navigation (Mobile App Style) ```html<!-- Fixed bottom navigation for mobile --><nav class=" fixed bottom-0 inset-x-0 z-50 md:hidden bg-white border-t shadow-lg safe-area-pb"> <ul class="flex justify-around"> <li> <a href="#" class=" flex flex-col items-center min-h-14 min-w-14 px-3 py-2 text-xs text-gray-600 hover:text-blue-600 aria-current:text-blue-600 "> <svg class="h-6 w-6 mb-1">...</svg> Home </a> </li> <li> <a href="#" class="flex flex-col items-center min-h-14 min-w-14 px-3 py-2 text-xs"> <svg class="h-6 w-6 mb-1">...</svg> Search </a> </li> <li> <a href="#" class="flex flex-col items-center min-h-14 min-w-14 px-3 py-2 text-xs"> <svg class="h-6 w-6 mb-1">...</svg> Profile </a> </li> </ul></nav> <!-- Add padding to main content to prevent overlap --><main class="pb-20 md:pb-0"> Content</main>``` ## Safe Area Handling (Notched Devices) ```css@utility safe-area-pt { padding-top: env(safe-area-inset-top);} @utility safe-area-pb { padding-bottom: env(safe-area-inset-bottom);} @utility safe-area-pl { padding-left: env(safe-area-inset-left);} @utility safe-area-pr { padding-right: env(safe-area-inset-right);} @utility safe-area-p { padding-top: env(safe-area-inset-top); padding-right: env(safe-area-inset-right); padding-bottom: env(safe-area-inset-bottom); padding-left: env(safe-area-inset-left);}``` ```html<!-- Header that respects notch --><header class="sticky top-0 safe-area-pt bg-white"> <div class="h-16 flex items-center px-4"> Navigation </div></header> <!-- Bottom navigation with safe area --><nav class="fixed bottom-0 inset-x-0 safe-area-pb bg-white border-t"> Bottom nav</nav>``` ## Performance Optimization for Mobile ### Lazy Loading ```html<!-- Native lazy loading for images --><img src="image.jpg" alt="..." loading="lazy" class="w-full h-auto" /> <!-- Lazy load below-fold content --><div class="contents" data-lazy-load> Heavy component loaded on demand</div>``` ### Content Visibility ```css@utility content-auto { content-visibility: auto; contain-intrinsic-size: auto 500px;}``` ```html<!-- Skip rendering off-screen content --><section class="content-auto"> Large section that may be off-screen</section>``` ### Reduced Data Usage ```html<!-- Show simpler version on slow connections --><picture> <source srcset="video-poster.jpg" media="(prefers-reduced-data: reduce)" /> <img src="animated.gif" alt="..." /></picture>``` ## Responsive Testing Checklist ### Essential Tests 1. **320px** - Smallest supported width (older iPhones)2. **375px** - Modern iPhone base3. **414px** - Large phones (iPhone Plus/Max)4. **768px** - iPad portrait5. **1024px** - iPad landscape / small laptop6. **1280px** - Standard laptop7. **1440px** - Large desktop8. **1920px** - Full HD desktop ### Quality Checks - [ ] Text remains readable at all sizes- [ ] Touch targets are minimum 44px on mobile- [ ] No horizontal scroll on any viewport- [ ] Images don't overflow containers- [ ] Navigation is accessible on all sizes- [ ] Forms are usable on mobile- [ ] Modals fit mobile screens- [ ] Tables have mobile alternatives- [ ] Performance under 3s LCP on 3G ## Responsive Video Containers ### Aspect Ratio Utilities for Video Use Tailwind's `aspect-*` utilities to maintain correct video proportions across all screen sizes, preventing Cumulative Layout Shift (CLS): ```html<!-- Standard 16:9 video container --><div class="aspect-video overflow-hidden rounded-lg bg-black"> <video class="w-full h-full object-cover" playsinline preload="metadata"> <source src="video.mp4" type="video/mp4" /> </video></div> <!-- Vertical video (9:16) for mobile-first social content --><div class="aspect-[9/16] overflow-hidden rounded-lg bg-black max-w-sm mx-auto"> <video class="w-full h-full object-cover" playsinline muted loop> <source src="reel.mp4" type="video/mp4" /> </video></div> <!-- Square video (1:1) common for social feeds --><div class="aspect-square overflow-hidden rounded-lg bg-black"> <video class="w-full h-full object-cover" playsinline preload="metadata"> <source src="square.mp4" type="video/mp4" /> </video></div> <!-- Responsive aspect ratio - vertical on mobile, widescreen on desktop --><div class="aspect-[9/16] sm:aspect-video overflow-hidden rounded-lg bg-black"> <video class="w-full h-full object-contain" playsinline preload="metadata"> <source src="video.mp4" type="video/mp4" /> </video></div>``` ### Preventing CLS with Video Placeholders Videos without defined dimensions cause layout shift when they load. Use aspect ratio containers to reserve space: ```html<!-- CLS-safe video with poster and skeleton loader --><div class="relative aspect-video overflow-hidden rounded-lg bg-gray-900"> <!-- Skeleton placeholder while video loads --> <div class="absolute inset-0 animate-pulse bg-gray-800" aria-hidden="true"></div> <video class="absolute inset-0 w-full h-full object-cover" poster="/thumbnails/video-poster.jpg" playsinline preload="metadata" > <source src="video.mp4" type="video/mp4" /> </video></div> <!-- Responsive grid of video thumbnails with zero CLS --><div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"> <div class="aspect-video overflow-hidden rounded-lg bg-gray-900"> <video class="w-full h-full object-cover" poster="/thumb1.jpg" preload="none" playsinline></video> </div> <div class="aspect-video overflow-hidden rounded-lg bg-gray-900"> <video class="w-full h-full object-cover" poster="/thumb2.jpg" preload="none" playsinline></video> </div> <div class="aspect-video overflow-hidden rounded-lg bg-gray-900"> <video class="w-full h-full object-cover" poster="/thumb3.jpg" preload="none" playsinline></video> </div></div>``` ### Full-Bleed Video on Mobile, Constrained on Desktop ```html<!-- Full-width on mobile, centered with max-width on desktop --><div class="w-full lg:max-w-4xl lg:mx-auto"> <div class="aspect-video overflow-hidden lg:rounded-xl bg-black"> <video class="w-full h-full object-cover" playsinline preload="metadata"> <source src="hero.mp4" type="video/mp4" /> </video> </div></div> <!-- Full-bleed hero video background --><section class="relative w-full h-screen overflow-hidden"> <video class="absolute inset-0 w-full h-full object-cover" autoplay muted loop playsinline preload="auto" > <source src="hero-bg.mp4" type="video/mp4" /> </video> <!-- Content overlay with safe padding --> <div class="relative z-10 flex items-center justify-center h-full px-4 sm:px-8"> <div class="text-center text-white max-w-2xl"> <h1 class="text-3xl sm:text-4xl lg:text-6xl font-bold">Hero Title</h1> <p class="mt-4 text-lg sm:text-xl">Subtitle text</p> </div> </div> <!-- Dark overlay for text readability --> <div class="absolute inset-0 bg-black/40" aria-hidden="true"></div></section>``` ### Safe Zone Overlays for Video UI Video player controls and UI elements need touch-friendly sizing and proper placement: ```html<!-- Custom video player with touch-safe controls --><div class="@container relative aspect-video overflow-hidden rounded-lg bg-black group"> <video class="w-full h-full object-cover" playsinline preload="metadata"> <source src="video.mp4" type="video/mp4" /> </video> <!-- Play/Pause overlay - centered, touch-friendly --> <button class=" absolute inset-0 flex items-center justify-center bg-black/0 group-hover:bg-black/20 transition-colors "> <span class=" w-16 h-16 sm:w-20 sm:h-20 flex items-center justify-center rounded-full bg-white/90 shadow-lg "> <svg class="w-8 h-8 sm:w-10 sm:h-10 text-gray-900 ml-1" viewBox="0 0 24 24" fill="currentColor"> <path d="M8 5v14l11-7z"/> </svg> </span> </button> <!-- Bottom controls bar - respects touch targets --> <div class=" absolute bottom-0 inset-x-0 bg-gradient-to-t from-black/80 to-transparent p-3 sm:p-4 flex items-center gap-3 opacity-0 group-hover:opacity-100 transition-opacity "> <!-- Progress bar - tall enough for touch --> <div class="flex-1 h-1 bg-white/30 rounded-full cursor-pointer"> <div class="h-full w-1/3 bg-white rounded-full relative"> <span class="absolute right-0 top-1/2 -translate-y-1/2 w-4 h-4 bg-white rounded-full -mr-2"></span> </div> </div> <!-- Time display --> <span class="text-white text-xs sm:text-sm tabular-nums shrink-0">1:23 / 4:56</span> <!-- Fullscreen button - touch-friendly minimum size --> <button class="min-h-11 min-w-11 flex items-center justify-center text-white"> <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/> </svg> </button> </div></div>``` ### Container Queries for Adaptive Video Players Video player components that adapt their layout based on container size --- useful when the same player appears in a sidebar, main content area, or modal: ```html<!-- Video player that adapts to its container --><div class="@container"> <div class=" flex flex-col @lg:flex-row gap-4 @lg:gap-6 bg-gray-950 rounded-xl overflow-hidden "> <!-- Video area --> <div class=" w-full @lg:flex-1 aspect-video overflow-hidden "> <video class="w-full h-full object-cover" playsinline preload="metadata"> <source src="video.mp4" type="video/mp4" /> </video> </div> <!-- Info panel - below video on narrow, beside on wide --> <div class=" p-4 @lg:p-6 @lg:w-80 @lg:overflow-y-auto text-white "> <h3 class="text-base @lg:text-lg font-semibold">Video Title</h3> <p class="text-sm text-gray-400 mt-2 line-clamp-2 @lg:line-clamp-none"> Video description that shows more text when the container is wider... </p> <!-- Related videos - hidden in narrow containers --> <div class="hidden @xl:block mt-6 space-y-3"> <h4 class="text-sm font-medium text-gray-300">Related</h4> <div class="space-y-2"> <div class="flex gap-3"> <div class="w-28 aspect-video bg-gray-800 rounded shrink-0"></div> <div class="text-xs text-gray-400">Related Video 1</div> </div> </div> </div> </div> </div></div>``` ## Best Practices Summary | Practice | Implementation ||----------|---------------|| Mobile-first utilities | Unprefixed first, then `sm:`, `md:`, `lg:` || Touch targets | `min-h-11 min-w-11` (44px minimum) || Fluid typography | `clamp(min, preferred, max)` with `rem + vw` || Fluid spacing | `clamp()` for padding and margins || Container queries | `@container` for component responsiveness || Safe areas | `env(safe-area-inset-*)` for notched devices || Readable text | `max-w-prose` (65ch) and `leading-relaxed` || Lazy loading | `loading="lazy"` on below-fold images || Touch spacing | `gap-3` (12px) minimum between targets || Viewport meta | `width=device-width, initial-scale=1` |Related skills
Docker Best Practices
Install Docker Best Practices skill for Claude Code from josiahsiegel/claude-plugin-marketplace.
Tailwindcss Animations
Install Tailwindcss Animations skill for Claude Code from josiahsiegel/claude-plugin-marketplace.
1password
Install 1password skill for Claude Code from steipete/clawdis.