// Comprehensive frontend design system for creating distinctive, production-grade interfaces that avoid generic AI aesthetics. Use when users request web components, pages, applications, or any frontend interface. Provides design workflows, aesthetic guidelines, code patterns, animation libraries, typography systems, color theory, and anti-patterns to create memorable, context-specific designs that feel genuinely crafted rather than generated.
| name | modern-frontend-design |
| description | Comprehensive frontend design system for creating distinctive, production-grade interfaces that avoid generic AI aesthetics. Use when users request web components, pages, applications, or any frontend interface. Provides design workflows, aesthetic guidelines, code patterns, animation libraries, typography systems, color theory, and anti-patterns to create memorable, context-specific designs that feel genuinely crafted rather than generated. |
This skill provides a comprehensive system for creating distinctive, production-grade frontend interfaces that transcend generic AI aesthetics. Every design should feel intentionally crafted for its specific context.
Every interface tells a story. Design is not decoration applied to functionality - it's the synthesis of purpose, emotion, and interaction into a cohesive experience.
Before writing any code, establish:
Understand the request deeply:
Choose ONE primary aesthetic direction from:
Define your design tokens BEFORE coding:
/* Example: Neo-Brutalist System */
:root {
/* Typography Scale */
--font-display: 'Archivo Black', sans-serif; /* Never use Inter/Roboto */
--font-body: 'Work Sans', sans-serif;
--scale-base: clamp(1rem, 2vw, 1.125rem);
--scale-ratio: 1.333; /* Perfect fourth */
/* Spatial System */
--space-unit: 0.5rem;
--grid-columns: 12;
--container-max: 1440px;
/* Color Philosophy */
--color-ink: #0A0A0A;
--color-paper: #F7F3F0;
--color-accent: #FF3E00;
--color-bruise: #7B68EE;
/* Animation Timing */
--ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
--duration-base: 200ms;
--stagger-delay: 50ms;
}
Never use default font stacks. Always pair fonts intentionally:
/* Bad - Generic AI Slop */
font-family: Inter, system-ui, sans-serif;
/* Good - Intentional Pairing */
font-family: 'Instrument Serif', 'Crimson Pro', serif; /* Editorial */
font-family: 'Space Mono', 'JetBrains Mono', monospace; /* Tech */
font-family: 'Bebas Neue', 'Oswald', sans-serif; /* Bold Display */
font-family: 'Playfair Display', 'Libre Baskerville', serif; /* Luxury */
Avoid predictable gradients. Use color with intention:
/* Bad - Overused Purple Gradient */
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
/* Good - Context-Specific Approaches */
/* Risograph-inspired duotone */
background:
linear-gradient(45deg, #FF6B6B 0%, transparent 70%),
linear-gradient(-45deg, #4ECDC4 0%, transparent 70%),
#F7FFF7;
/* Noise texture overlay */
background:
url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www[.]w3[.]org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.02'/%3E%3C/svg%3E"),
linear-gradient(180deg, #0A0E27 0%, #151B3D 100%);
Break the grid intentionally:
/* Dynamic asymmetric grid */
.container {
display: grid;
grid-template-columns: 2fr 1fr 1fr 3fr 1fr;
grid-template-rows: auto 1fr auto;
gap: clamp(1rem, 3vw, 2rem);
}
.hero-content {
grid-column: 1 / span 3;
grid-row: 2;
z-index: 2;
}
.hero-visual {
grid-column: 3 / -1;
grid-row: 1 / span 2;
margin-top: -10vh; /* Break container boundaries */
}
One orchestrated entrance beats scattered micro-interactions:
[@]keyframes revealUp {
from {
opacity: 0;
transform: translateY(30px) scale(0.98);
}
}
.hero > * {
animation: revealUp 800ms var(--ease-out-expo) both;
}
.hero > *:nth-child(1) { animation-delay: 0ms; }
.hero > *:nth-child(2) { animation-delay: 80ms; }
.hero > *:nth-child(3) { animation-delay: 160ms; }
// Parallax with Intersection Observer
const parallaxElements = document.querySelectorAll('[data-parallax]');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const scrolled = window.pageYOffset;
const rate = scrolled * entry[.]target.dataset.parallax;
entry[.]target[.]style.transform = `translateY(${rate}px)`;
}
});
});
parallaxElements.forEach(el => observer.observe(el));
.card {
transition: transform 200ms var(--ease-out-expo);
}
.card:hover {
transform: perspective(1000px) rotateX(5deg) scale(1.02);
}
.card:hover::before {
/* Reveal hidden layer */
opacity: 1;
transform: translate(-5px, -5px);
}
NEVER do all of these together:
For React, emphasize composition and state management:
// Use compound components for complex UI
const Card = ({ children }) => {
const [isExpanded, setIsExpanded] = useState(false);
return (
<CardContext.Provider value={{ isExpanded, setIsExpanded }}>
<article className="card" data-expanded={isExpanded}>
{children}
</article>
</CardContext.Provider>
);
};
Card.Header = ({ children }) => {
const { setIsExpanded } = useContext(CardContext);
return (
<header onClick={() => setIsExpanded(prev => !prev)}>
{children}
</header>
);
};
For Vue, leverage reactive design:
<script setup>
import { ref, computed } from 'vue'
const theme = ref('dark')
const themeClasses = computed(() => ({
'theme-dark': theme.value === 'dark',
'theme-light': theme.value === 'light'
}))
</script>
Before delivering any frontend:
You are not generating "a frontend" - you are crafting an experience. Every choice should serve the concept. Every detail should reinforce the story. The user should feel something when they see it.
Make it memorable. Make it distinctive. Make it feel designed, not generated.