Automatically validates frontend design patterns to prevent generic aesthetics (Inter fonts, purple gradients, minimal animations) and enforce distinctive, branded design during Tanstack Start (React) development with shadcn/ui
Automatically validates shadcn/ui design patterns to prevent generic aesthetics like Inter fonts and purple gradients. Triggers on component creation, styling changes, and config modifications to enforce distinctive, branded design in Tanstack Start projects.
/plugin marketplace add hirefrank/hirefrank-marketplace/plugin install edge-stack@hirefrank-marketplaceThis skill inherits all available tools. When active, it can use any tool Claude has access to.
This SKILL automatically activates when:
.tsx React components are createdtailwind.config.ts) is modifiedapp.config.ts) is modified<!-- These patterns trigger alerts: -->
<!-- Generic font (Inter/Roboto) -->
<div className="font-sans"> <!-- Using default Inter -->
<!-- Purple gradient on white (overused pattern) -->
<div className="bg-gradient-to-r from-purple-500 to-purple-600">
<!-- No animations/transitions -->
<Button onClick="submit">Submit</Button> <!-- No hover state -->
<!-- Default background colors -->
<div className="bg-gray-50"> <!-- Generic #f9fafb -->
<!-- These patterns are validated as correct: -->
<!-- Custom distinctive fonts -->
<h1 className="font-heading"> <!-- Custom font family -->
<!-- Custom brand colors -->
<div className="bg-brand-coral"> <!-- Distinctive palette -->
<!-- Engaging animations -->
<Button
className="transition-all duration-300 hover:scale-105 hover:shadow-xl"
onClick="submit"
>
Submit
</Button>
<!-- Atmospheric backgrounds -->
<div className="bg-gradient-to-br from-brand-ocean via-brand-sky to-brand-coral">
frontend-design-specialist agenttanstack-ui-architect agentaccessibility-guardian agent/es-design-review commandfrom-purple-* to to-purple-* on white backgroundsbg-gray-50, bg-gray-100 (overused neutrals)<!-- ❌ Critical: Default Inter font -->
<h1 className="text-4xl font-sans">Welcome</h1>
<!-- ✅ Correct: Distinctive custom font -->
<h1 className="text-4xl font-heading tracking-tight">Welcome</h1>
<!-- tailwind.config.ts -->
export default {
theme: {
extend: {
fontFamily: {
// ❌ NOT: sans: ['Inter', 'sans-serif']
// ✅ YES: Distinctive fonts
sans: ['Space Grotesk', 'system-ui', 'sans-serif'],
heading: ['Archivo Black', 'system-ui', 'sans-serif'],
mono: ['JetBrains Mono', 'monospace']
}
}
}
}
<!-- ❌ Critical: Purple gradient (overused) -->
<div className="bg-gradient-to-r from-purple-500 to-purple-600">
<h2 className="text-white">Hero Section</h2>
</div>
<!-- ✅ Correct: Custom brand colors -->
<div className="bg-gradient-to-br from-brand-coral via-brand-ocean to-brand-sunset">
<h2 className="text-white">Hero Section</h2>
</div>
<!-- tailwind.config.ts -->
export default {
theme: {
extend: {
colors: {
// ❌ NOT: Using only default Tailwind colors
// ✅ YES: Custom brand palette
brand: {
coral: '#FF6B6B',
ocean: '#4ECDC4',
sunset: '#FFE66D',
midnight: '#2C3E50',
cream: '#FFF5E1'
}
}
}
}
}
<!-- ❌ Critical: No hover/transition effects -->
<Button onClick="handleSubmit">
Submit Form
</Button>
<!-- ✅ Correct: Engaging animations -->
<Button
className="transition-all duration-300 hover:scale-105 hover:shadow-xl active:scale-95"
onClick="handleSubmit"
>
<span className="inline-flex items-center gap-2">
Submit Form
<Icon
name="i-heroicons-arrow-right"
className="transition-transform duration-300 group-hover:translate-x-1"
/>
</span>
</Button>
<!-- ❌ P2: All default props (generic appearance) -->
<Card>
<p>Content here</p>
</Card>
<!-- ✅ Correct: Customized for brand distinctiveness -->
<Card
:ui="{
background: 'bg-white dark:bg-brand-midnight',
ring: 'ring-1 ring-brand-coral/20',
rounded: 'rounded-2xl',
shadow: 'shadow-xl hover:shadow-2xl',
body: { padding: 'p-8' }
}"
className="transition-all duration-300 hover:-translate-y-1"
>
<p className="text-gray-700 dark:text-gray-300">Content here</p>
</Card>
When shadcn/ui MCP server is available:
ui prop structure against actual schemaExample MCP Usage:
// Validate Button customization
const buttonDocs = await mcp.shadcn.get_component("Button");
// Check if suggested props exist: color, size, variant, ui, etc.
// Ensure customizations align with actual API
// Developer creates: <div className="font-sans bg-purple-500">
// SKILL immediately activates: "⚠️ WARNING: Using default 'font-sans' (Inter) and purple gradient. Consider custom brand fonts and colors for distinctive design."
// Developer adds: <Button>Click me</Button>
// SKILL immediately activates: "⚠️ P2: Button lacks hover animations. Add transition utilities for better engagement: class='transition-all duration-300 hover:scale-105'"
// Developer modifies tailwind.config.ts with default Inter
// SKILL immediately activates: "⚠️ P1: Using Inter font (appears in 80%+ of sites). Replace with distinctive font choices like Space Grotesk, Archivo, or other brand-appropriate fonts."
// SKILL runs comprehensive check: "✅ Design validation passed. Custom fonts, distinctive colors, engaging animations, and customized components detected."
This SKILL implements the core insight from Claude's "Improving Frontend Design Through Skills" blog post:
"Think about frontend design the way a frontend engineer would. The more you can map aesthetic improvements to implementable frontend code, the better Claude can execute."
Key Mappings:
fontFamily config + utility classestransition-*, hover:*, duration-* utilitiesbackdrop-* utilities<!-- The "AI default aesthetic" -->
<div className="bg-white">
<h1 className="font-sans text-gray-900">Title</h1>
<div className="bg-gradient-to-r from-purple-500 to-purple-600">
<Button>Action</Button>
</div>
</div>
Problems:
<!-- Brand-distinctive aesthetic -->
<div className="bg-gradient-to-br from-brand-cream via-white to-brand-ocean/10">
<h1 className="font-heading text-6xl text-brand-midnight tracking-tighter">
Title
</h1>
<div className="relative overflow-hidden rounded-3xl bg-brand-coral p-8">
<!-- Atmospheric background -->
<div className="absolute inset-0 bg-gradient-to-br from-brand-coral to-brand-sunset opacity-80" />
<Button
:ui="{
font: 'font-heading',
rounded: 'rounded-full',
size: 'xl'
}"
className="relative z-10 transition-all duration-500 hover:scale-110 hover:rotate-2 hover:shadow-2xl active:scale-95"
>
<span className="flex items-center gap-2">
Action
<Icon
name="i-heroicons-sparkles"
className="animate-pulse"
/>
</span>
</Button>
</div>
</div>
Strengths:
This SKILL ensures every Tanstack Start project develops a distinctive visual identity by preventing generic patterns and guiding developers toward branded, engaging design implementations.
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.