From autonomous-agent
Provides frontend design principles avoiding AI slop like Inter/Roboto fonts, purple gradients, and bland layouts. Guides thoughtful typography, colors, animations for polished UIs.
npx claudepluginhub bejranonda/llm-autonomous-agent-plugin-for-claude --plugin autonomous-agentThis skill uses the workspace's default tool permissions.
This skill provides specific design principles and patterns for creating distinctive, polished frontend interfaces that avoid "AI slop" - the generic, obviously-generated aesthetic that results from default AI model choices. Based on official research from ["Improving frontend design through Skills"](https://claude.com/blog/improving-frontend-design-through-skills) by Anthropic.
Provides Ktor server patterns for routing DSL, plugins (auth, CORS, serialization), Koin DI, WebSockets, services, and testApplication testing.
Conducts multi-source web research with firecrawl and exa MCPs: searches, scrapes pages, synthesizes cited reports. For deep dives, competitive analysis, tech evaluations, or due diligence.
Provides demand forecasting, safety stock optimization, replenishment planning, and promotional lift estimation for multi-location retailers managing 300-800 SKUs.
This skill provides specific design principles and patterns for creating distinctive, polished frontend interfaces that avoid "AI slop" - the generic, obviously-generated aesthetic that results from default AI model choices. Based on official research from "Improving frontend design through Skills" by Anthropic.
Skills Methodology: This follows Anthropic's skills approach - reusable markdown documents that provide altitude-appropriate design guidance without permanent context overhead. Skills make effective design prompts contextual and reusable across projects.
Core Problem: Distributional Convergence: Language models naturally sample from the high-probability center of their training data distribution. This causes them to default to statistically common "safe choices" (Inter fonts, purple gradients, minimal animations, standard grid layouts) because these patterns dominate web design datasets. The result is bland, forgettable interfaces that lack intentional design decisions.
Altitude-Appropriate Guidance: This skill avoids both extremes:
Instead, it provides contextual principles with concrete examples that guide toward distinctive choices while preserving flexibility.
Generic Fonts:
Generic Colors:
Minimal Visual Interest:
Result: Interface that looks "obviously AI-generated" - bland, safe, forgettable
Calculate AI Slop Score (0-100, lower is better):
Score 60+: High AI slop - needs significant design enhancement Score 30-59: Moderate - some generic patterns present Score 0-29: Distinctive - thoughtful design choices evident
Never Use (Without Strong Justification):
Code/Technical Aesthetic:
Primary: JetBrains Mono (headings, code blocks)
Secondary: Space Grotesk (body, UI)
Character: Modern, technical, developer-focused
Editorial/Content:
Primary: Playfair Display (headings, hero)
Secondary: Source Sans 3 (body)
Character: Classic, sophisticated, content-heavy
Technical/Data:
Primary: IBM Plex Sans (all text)
Secondary: IBM Plex Mono (code, data)
Character: Professional, systematic, dashboard-friendly
Friendly/Playful:
Primary: Fredoka (headings)
Secondary: Manrope (body)
Character: Approachable, consumer-facing, warm
Elegant/Premium:
Primary: Crimson Pro (headings)
Secondary: Karla (body)
Character: Sophisticated, refined, premium feel
High-Contrast Pairings (Recommended): Pair fonts from different categories for maximum distinctiveness:
Serif + Sans Pairing:
Geometric + Humanist:
Monospace + Sans:
Extreme Weight Variations: Create hierarchy through dramatic weight differences:
Size Jumps (3x+ Ratio): Create clear hierarchy with large size differences:
Variable Fonts (Modern Approach):
/* Fluid Typography with clamp() */
:root {
--text-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem);
--text-sm: clamp(0.875rem, 0.825rem + 0.25vw, 1rem);
--text-base: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
--text-lg: clamp(1.125rem, 1.075rem + 0.25vw, 1.25rem);
--text-xl: clamp(1.25rem, 1.15rem + 0.5vw, 1.5rem);
--text-2xl: clamp(1.5rem, 1.35rem + 0.75vw, 2rem);
--text-3xl: clamp(2rem, 1.75rem + 1.25vw, 3rem);
--text-4xl: clamp(2.5rem, 2rem + 2.5vw, 4rem);
}
/* Type Scale with Clear Hierarchy */
.heading-1 {
font-family: 'Playfair Display', serif;
font-size: var(--text-4xl);
font-weight: 700;
line-height: 1.1;
letter-spacing: -0.02em;
}
.heading-2 {
font-family: 'Playfair Display', serif;
font-size: var(--text-3xl);
font-weight: 600;
line-height: 1.2;
}
.body {
font-family: 'Source Sans 3', sans-serif;
font-size: var(--text-base);
font-weight: 400;
line-height: 1.6;
}
Never Use (Without Intentional Justification):
Principle: Choose colors that create a mood and brand identity
Ocean/Tech Professional:
Primary: #0ea5e9 (sky blue)
Accent: #f59e0b (amber)
Background: #0f172a → #1e293b (dark slate gradient)
Text: #f8fafc / #cbd5e1 / #64748b
Mood: Professional, trustworthy, technical
Sunset/Energetic:
Primary: #f97316 (orange)
Accent: #ec4899 (pink)
Background: #fff7ed (light warm) with subtle gradients
Text: #1c1917 / #57534e / #78716c
Mood: Energetic, warm, inviting
Forest/Calm:
Primary: #059669 (emerald)
Accent: #facc15 (yellow)
Background: #f0fdf4 (light green) with layered depth
Text: #14532d / #166534 / #4ade80
Mood: Calm, natural, wellness
Cyberpunk/Bold:
Primary: #06b6d4 (cyan)
Accent: #f0abfc (fuchsia)
Background: #18181b (very dark) with neon glows
Text: #fafafa / #a1a1aa / #52525b
Mood: Modern, bold, tech-forward
Dominance Hierarchy:
Contrast Requirements:
Semantic Color Usage:
Success: Greens (#10b981, #22c55e)
Warning: Yellows/Oranges (#f59e0b, #eab308)
Error: Reds (#ef4444, #dc2626)
Info: Blues (#3b82f6, #0891b2)
Implementation:
:root {
--color-primary: 14 165 233; /* RGB values for hsl() */
--color-accent: 245 158 11;
--color-bg-base: 15 23 42;
--color-bg-surface: 30 41 59;
--color-text-primary: 248 250 252;
}
/* Use with opacity */
.element {
background-color: hsl(var(--color-primary) / 0.1); /* 10% opacity */
color: hsl(var(--color-text-primary));
}
Never Use:
1. Subtle Noise Texture:
.background-noise {
background-image:
linear-gradient(135deg, hsl(var(--bg-base)) 0%, hsl(var(--bg-surface)) 100%),
url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.05'/%3E%3C/svg%3E");
}
2. Geometric Grid Pattern:
.background-grid {
background-image:
linear-gradient(90deg, rgba(255,255,255,0.05) 1px, transparent 1px),
linear-gradient(180deg, rgba(255,255,255,0.05) 1px, transparent 1px);
background-size: 50px 50px;
}
3. Radial Ambient Glow:
.background-glow {
background:
radial-gradient(circle at 20% 50%, rgba(14, 165, 233, 0.15) 0%, transparent 50%),
radial-gradient(circle at 80% 50%, rgba(245, 158, 11, 0.1) 0%, transparent 50%),
hsl(var(--bg-base));
}
4. Layered SVG Waves:
.background-waves {
background:
linear-gradient(180deg, hsl(var(--primary) / 0.1) 0%, transparent 100%),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 320'%3E%3Cpath fill='rgba(255,255,255,0.05)' d='M0,96L48,112C96,128,192,160,288,160C384,160,480,128,576,122.7C672,117,768,139,864,144C960,149,1056,139,1152,128C1248,117,1344,107,1392,101.3L1440,96L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z'%3E%3C/path%3E%3C/svg%3E") no-repeat bottom;
}
5. Mesh Gradient (Modern):
.background-mesh {
background:
radial-gradient(at 27% 37%, hsla(215, 98%, 61%, 0.3) 0px, transparent 50%),
radial-gradient(at 97% 21%, hsla(125, 98%, 72%, 0.3) 0px, transparent 50%),
radial-gradient(at 52% 99%, hsla(354, 98%, 61%, 0.3) 0px, transparent 50%),
radial-gradient(at 10% 29%, hsla(256, 96%, 67%, 0.3) 0px, transparent 50%),
radial-gradient(at 97% 96%, hsla(38, 60%, 74%, 0.3) 0px, transparent 50%),
radial-gradient(at 33% 50%, hsla(222, 67%, 73%, 0.3) 0px, transparent 50%),
radial-gradient(at 79% 53%, hsla(343, 68%, 79%, 0.3) 0px, transparent 50%);
}
Core Insight: One well-orchestrated page load with staggered reveals is worth more than a dozen random micro-animations scattered across the interface.
Avoid:
Focus On High-Impact Moments:
Motion Priority:
Decision Framework:
CSS-Only Approach (HTML Projects, Simple React):
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.page-enter {
animation: fadeInUp 0.6s cubic-bezier(0.22, 1, 0.36, 1);
}
/* Staggered children */
.stagger > :nth-child(1) { animation-delay: 0.1s; }
.stagger > :nth-child(2) { animation-delay: 0.2s; }
.stagger > :nth-child(3) { animation-delay: 0.3s; }
.stagger > :nth-child(4) { animation-delay: 0.4s; }
React + Framer Motion (For Complex Animations):
import { motion } from 'framer-motion'
export default function Page({ children }) {
return (
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -20 }}
transition={{ duration: 0.5, ease: [0.22, 1, 0.36, 1] }}
>
{children}
</motion.div>
)
}
// Staggered list
const container = {
hidden: { opacity: 0 },
show: {
opacity: 1,
transition: {
staggerChildren: 0.1
}
}
}
const item = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0 }
}
<motion.ul variants={container} initial="hidden" animate="show">
{items.map((item) => (
<motion.li key={item.id} variants={item}>
{item.name}
</motion.li>
))}
</motion.ul>
Button Hover:
.button {
transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
}
.button:hover {
transform: translateY(-2px);
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.2);
}
.button:active {
transform: translateY(0);
transition-duration: 0.1s;
}
Card Hover:
.card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.card:hover {
transform: scale(1.02);
box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.15);
}
Link Underline Animation:
.link {
position: relative;
text-decoration: none;
}
.link::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 2px;
background: currentColor;
transform: scaleX(0);
transform-origin: right;
transition: transform 0.3s ease;
}
.link:hover::after {
transform: scaleX(1);
transform-origin: left;
}
Always Include:
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
Asymmetric Grid:
.hero-grid {
display: grid;
grid-template-columns: 1fr 1.5fr 1fr;
grid-template-rows: auto auto;
gap: 2rem;
}
.hero-text {
grid-column: 1 / 3;
grid-row: 1;
}
.hero-image {
grid-column: 2 / 4;
grid-row: 1 / 3;
transform: translateY(-2rem); /* Break alignment */
}
Broken Grid Layout:
.content-grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 1.5rem;
}
.card-1 {
grid-column: 1 / 6;
grid-row: 1 / 3;
}
.card-2 {
grid-column: 6 / 10;
grid-row: 1 / 2;
transform: translateY(2rem); /* Offset for visual interest */
}
.card-3 {
grid-column: 10 / 13;
grid-row: 1 / 3;
}
Overlapping Elements:
.overlap-container {
position: relative;
}
.background-card {
position: relative;
z-index: 1;
}
.foreground-element {
position: absolute;
top: -2rem;
left: -2rem;
z-index: 2;
}
Before considering design complete:
Typography:
Color:
Background:
Animation:
prefers-reduced-motion respectedLayout:
Overall:
Use this skill when:
This approach ensures frontend designs are distinctive, polished, and intentional - not generic AI defaults.