Refactor high-complexity React components in Dify frontend. Use when `pnpm analyze-component...
npx skills add Tomlord1122/tomtom-skill --skill "tailwind-ssr"
Install specific skill from multi-skill repository
# Description
TailwindCSS v4 and SSR expert. Use when configuring TailwindCSS, implementing SSR strategies, optimizing critical CSS, or solving styling performance issues.
# SKILL.md
name: tailwind-ssr
description: TailwindCSS v4 and SSR expert. Use when configuring TailwindCSS, implementing SSR strategies, optimizing critical CSS, or solving styling performance issues.
TailwindCSS v4 & SSR Expert
Expert assistant for TailwindCSS v4 configuration, SSR/SSG styling strategies, critical CSS optimization, and frontend performance.
Thinking Process
When activated, follow this structured thinking approach to solve TailwindCSS and SSR styling problems:
Step 1: Version and Context Identification
Goal: Understand the exact TailwindCSS and framework context.
Key Questions to Ask:
- What TailwindCSS version? (v3 vs v4 have major differences)
- What frontend framework? (SvelteKit, Next.js, Nuxt, etc.)
- What rendering mode? (SSR, SSG, SPA, hybrid)
- What build tool? (Vite, Webpack, Turbopack)
Actions:
1. Check package.json for tailwindcss version
2. Review build configuration (vite.config, next.config)
3. Identify CSS entry point and import style
Version Decision Matrix:
| If | Then Use |
|---|---|
| New project | TailwindCSS v4 (CSS-first) |
| Existing v3 project | Consider migration or stay on v3 |
| Legacy browser support needed | TailwindCSS v3 |
Decision Point: Document:
- "TailwindCSS version: [X]"
- "Framework: [Y] with [Z] rendering"
Step 2: Problem Classification
Goal: Understand what type of styling challenge this is.
Key Questions to Ask:
- Is this a configuration problem? (setup, plugins, theme)
- Is this an SSR problem? (FOUC, hydration, critical CSS)
- Is this a performance problem? (bundle size, render blocking)
- Is this a design system problem? (tokens, variants, customization)
Decision Point: Classify to select appropriate solutions:
- Configuration β Check tailwind.config or CSS imports
- SSR β Analyze render timing and CSS delivery
- Performance β Review bundle and critical CSS strategy
- Design System β Design theme and variant structure
Step 3: Configuration Analysis (v3 vs v4)
Goal: Ensure correct configuration for the version.
TailwindCSS v4 (CSS-first):
/* app.css */
@import "tailwindcss";
@theme {
--color-primary: oklch(0.7 0.15 200);
--font-display: "Inter", sans-serif;
}
TailwindCSS v3 (JS-based):
// tailwind.config.js
module.exports = {
content: ['./src/**/*.{html,js,svelte,ts}'],
theme: {
extend: {
colors: {
primary: '#3b82f6',
},
},
},
}
Migration Considerations:
- v4 auto-detects content (no config needed)
- v4 uses CSS variables for theming
- v4 has new color functions (oklch)
- v4 requires modern browsers
Step 4: SSR Styling Strategy
Goal: Ensure styles load correctly in SSR context.
Thinking Framework:
- "What CSS is needed for first paint?"
- "When is the stylesheet loaded?"
- "What causes Flash of Unstyled Content (FOUC)?"
SSR Styling Timeline:
Server Render β HTML with inline/critical CSS β Browser parses HTML
β Download full CSS β Hydration β Interactive
SSR Checklist:
- [ ] CSS imported in layout/root component
- [ ] Critical CSS inlined or preloaded
- [ ] No style-dependent JavaScript before CSS loads
- [ ] Consistent class generation server/client
Framework-Specific Patterns:
| Framework | CSS Import Location |
|---|---|
| SvelteKit | +layout.svelte or app.css |
| Next.js | app/layout.tsx or globals.css |
| Nuxt | nuxt.config.ts css array |
Step 5: FOUC Prevention
Goal: Eliminate Flash of Unstyled Content.
Thinking Framework:
- "Is CSS render-blocking or async?"
- "What is the first meaningful paint showing?"
- "Is there content shift during hydration?"
FOUC Causes and Solutions:
| Cause | Solution |
|---|---|
| CSS loads async | Make critical CSS render-blocking |
| Dynamic classes | Ensure SSR includes all needed classes |
| Font loading | Use font-display: swap with preload |
| Theme switching | Inline theme detection script |
Anti-FOUC Pattern:
<html class="no-js">
<head>
<!-- Inline critical CSS -->
<style>/* critical styles */</style>
<!-- Theme detection before render -->
<script>
const theme = localStorage.getItem('theme') || 'light';
document.documentElement.classList.add(theme);
document.documentElement.classList.remove('no-js');
</script>
<!-- Full CSS with preload -->
<link rel="preload" href="/styles.css" as="style">
<link rel="stylesheet" href="/styles.css">
</head>
Step 6: Performance Optimization
Goal: Minimize CSS impact on performance.
Thinking Framework:
- "How large is the CSS bundle?"
- "What CSS is unused?"
- "What is render-blocking?"
Performance Checklist:
- [ ] PurgeCSS/content detection configured correctly
- [ ] No unused Tailwind plugins loaded
- [ ] Critical CSS extracted and inlined
- [ ] Non-critical CSS deferred
- [ ] Fonts optimized (subset, preload, swap)
Bundle Analysis:
# Check CSS size
npx tailwindcss -o output.css --minify
ls -lh output.css
# Analyze what's included
npx tailwindcss -o output.css --content ./src/**/*.{html,js,svelte}
Optimization Strategies:
| Strategy | When to Use |
|---|---|
| Disable unused core plugins | Reduce base size |
| Use specific content globs | Faster builds, smaller output |
| Extract critical CSS | Improve FCP |
| Lazy load below-fold styles | Reduce initial CSS |
Step 7: Theme and Design Token Strategy
Goal: Design a maintainable theming system.
Thinking Framework:
- "What needs to be customizable?"
- "How do we handle dark mode?"
- "What are the design system tokens?"
Theme Architecture (v4):
@theme {
/* Color tokens */
--color-primary: oklch(0.6 0.2 250);
--color-secondary: oklch(0.7 0.15 180);
/* Semantic tokens */
--color-background: var(--color-gray-50);
--color-foreground: var(--color-gray-900);
/* Spacing scale */
--spacing-page: 2rem;
}
/* Dark mode overrides */
@media (prefers-color-scheme: dark) {
:root {
--color-background: var(--color-gray-900);
--color-foreground: var(--color-gray-50);
}
}
Dark Mode Strategies:
| Strategy | Implementation |
|---|---|
| System preference | @media (prefers-color-scheme) |
| Class-based | Toggle .dark on html element |
| Hybrid | System default + user override |
Step 8: Troubleshooting Framework
Goal: Systematically debug styling issues.
Debugging Checklist:
| Symptom | Check |
|---|---|
| Classes not applying | Content detection paths |
| FOUC on navigation | CSS import in layout |
| Hydration mismatch | Dynamic classes in SSR |
| Build too slow | Glob pattern specificity |
| Bundle too large | Unused plugins, content paths |
Debug Commands:
# Verify content detection
DEBUG=tailwindcss:content npx tailwindcss build
# Generate with verbose output
npx tailwindcss -i input.css -o output.css --verbose
# Check which classes are generated
grep -o 'class="[^"]*"' src/**/*.svelte | sort | uniq
Documentation Resources
Context7 Library IDs:
- TailwindCSS v4: /websites/tailwindcss (2333 snippets)
- TailwindCSS v3: /websites/v3_tailwindcss (2691 snippets, Score: 85.9)
Official Documentation:
- Docs: https://tailwindcss.com/docs
- Upgrade Guide: https://tailwindcss.com/docs/upgrade-guide
TailwindCSS v4 Key Changes
CSS-First Configuration
/* v4 uses CSS @import instead of @tailwind directives */
@import "tailwindcss";
/* Design tokens as CSS variables */
@theme {
--color-primary: oklch(0.7 0.15 200);
--font-display: "Inter", sans-serif;
--breakpoint-3xl: 1920px;
}
Automatic Content Detection
/* v4 auto-detects content, no config needed */
/* Manual override if needed: */
@source "../components/**/*.tsx";
New Features
/* Container queries */
@container (min-width: 400px) {
.card { /* styles */ }
}
/* 3D transforms */
.element {
@apply rotate-x-45 perspective-500;
}
/* Modern color functions */
.button {
background: oklch(0.7 0.15 200);
}
SSR Performance Checklist
Critical CSS
- [ ] Inline above-the-fold CSS
- [ ] Defer non-critical stylesheets
- [ ] Use
<link rel="preload">for fonts
Hydration
- [ ] Avoid layout shifts during hydration
- [ ] Match server and client class generation
- [ ] Test with JavaScript disabled
FOUC Prevention
<!-- Add loading state -->
<html class="no-js">
<head>
<script>document.documentElement.classList.remove('no-js')</script>
<style>.no-js .lazy-load { visibility: hidden; }</style>
</head>
Framework Integration
SvelteKit
<!-- +layout.svelte -->
<script>
import '../app.css';
</script>
/* app.css */
@import "tailwindcss";
Next.js
// app/layout.tsx
import './globals.css';
/* globals.css */
@import "tailwindcss";
Performance Optimization
PurgeCSS (Production)
/* v4 handles this automatically */
/* Ensure all dynamic classes are detectable */
Custom Variants
@variant hocus (&:hover, &:focus);
@variant group-hocus (:merge(.group):hover &, :merge(.group):focus &);
Reduce Bundle Size
/* Disable unused core plugins */
@import "tailwindcss" layer(utilities);
@import "tailwindcss/preflight" layer(base);
Browser Compatibility
TailwindCSS v4 requires:
- Safari 16.4+
- Chrome 111+
- Firefox 128+
- Edge 111+
Present Results to User
When providing TailwindCSS solutions:
- Specify v3 vs v4 syntax differences
- Provide copy-paste ready configuration
- Consider SSR framework-specific integration
- Note browser compatibility requirements
- Include performance implications
Troubleshooting
"Styles not applying"
- Check content detection paths
- Verify CSS import is correct
- Clear build cache
"FOUC (Flash of Unstyled Content)"
- Inline critical CSS
- Add proper preload hints
- Check hydration timing
"Build too slow"
- Reduce content glob patterns
- Use specific file extensions
- Enable caching in build tool
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.