Dotfiles frontend-design
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
git clone https://github.com/harperreed/dotfiles
T=$(mktemp -d) && git clone --depth=1 https://github.com/harperreed/dotfiles "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/frontend-design" ~/.claude/skills/harperreed-dotfiles-frontend-design && rm -rf "$T"
.claude/skills/frontend-design/SKILL.mdThis skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.
The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.
Vibe Discovery (Do This First)
BEFORE writing any code, run the Vibe Discovery process. Don't pick from a menu. Derive a unique aesthetic from the real world.
Step 1: Conversational Dig (Ask the User)
Do NOT skip this. Have an actual back-and-forth with the user. Ask these questions one or two at a time, not as a wall of text. Use their answers to generate follow-ups. The goal is to extract something specific and personal — not a generic category.
Opening questions (ask first):
Q1: What's the vibe of this project in non-design terms? Push them away from design language. "Fast and chaotic like a kitchen during dinner rush" is better than "modern and clean." If they say something generic ("professional", "sleek"), push back: "Professional like a law firm lobby, or professional like a SpaceX launch room? Those are very different vibes."
Q2: Who is the actual human using this, and what are they doing right before they open it? Context matters more than demographics. "A tired nurse checking schedules at 6am" gives you more than "healthcare professionals aged 25-45."
Follow-up questions (based on their answers, pick 2-3):
- "What's a physical space that has the same energy as what you're describing?" (derive from THEIR words, don't suggest options)
- "What would make someone screenshot this and send it to a friend?"
- "Is there a movie, album, restaurant, or store that has the feel you want?"
- "What's something you've seen recently that made you think 'yes, THAT energy'?"
- "What's the worst version of this? What would make you cringe?"
If the user says "just pick something" or gives minimal input: Don't fall back on a static list. Instead, derive a reference from the project itself:
- What does the product DO? Find an unexpected real-world analog for that action.
- Who uses it? Imagine their world. What textures, colors, sounds exist there?
- What era or subculture would claim this product as their own?
Step 2: Invent a Vibe (Don't Retrieve One)
You must CREATE a new aesthetic direction every time. Do not pattern-match to categories you've seen before. Do not mentally scan a list of "aesthetic styles" and pick the closest one.
The Collision Method: Take TWO things from the user's answers that don't obviously go together and smash them:
- Pick a physical texture or material from their world (concrete, linen, chrome, cardboard, velvet, terracotta, acrylic, denim)
- Pick an energy or movement quality from their description (frenetic, glacial, bouncy, surgical, tidal, flickering, heavy, weightless)
- Combine them into something that doesn't exist yet: "Velvet Frenetic", "Cardboard Surgical", "Chrome Tidal"
This is your vibe seed. Everything else derives from it.
Q3 (internal — don't ask the user): What should this NEVER be mistaken for? Based on the conversation, identify 2-3 anti-patterns. Use these as guardrails, not the user's problem to solve.
Step 3: Derive the Aesthetic From the Vibe Seed
Take your invented vibe and derive EACH element from it. Do NOT consult the Aesthetic Reference Library yet — that's for implementation details later, not for direction-setting.
- Colors: Close your eyes (metaphorically). What colors exist in the collision you invented? "Velvet Frenetic" → deep burgundy meeting electric yellow. "Cardboard Surgical" → kraft brown meeting clinical white with a sharp teal accent. Extract 3-4 colors. Invent fresh hex codes. Name the palette after the vibe, not a generic mood ("Scrubbed Kraft", "Bruised Neon", "Soft Concrete").
- Typography: What does text FEEL like in this vibe? Heavy and planted? Thin and nervous? Hand-drawn and loose? Search Google Fonts with the vibe's energy, not with a category. If your first instinct is a font you've used before, discard it and keep looking.
- Layout: How does the vibe's material organize space? Velvet drapes — layered, overlapping. Cardboard — flat, stacked, visible edges. Chrome — reflective, minimal, precise. Let the material metaphor drive layout choices.
- Motion: How does the vibe's energy quality move? Frenetic = jittery micro-movements. Glacial = slow parallax. Surgical = precise snap-to. Tidal = rhythmic ease-in-out. Pick ONE signature motion that embodies the energy word.
Step 4: Write a Vibe Spec
Before coding, write this out:
VIBE NAME: [your invented collision name, e.g. "Velvet Frenetic"] MATERIAL: [the physical texture/material driving the visual language] ENERGY: [the movement quality driving interaction and motion] USER CONTEXT: [who they are, what they were doing 5 minutes ago] ANTI-PATTERNS: [what this must never be confused with] COLORS: [hex codes + why each color, named palette derived from the material/energy] TYPOGRAPHY: [specific font names + why they fit THIS vibe, not a category] LAYOUT: [how the material organizes space — one signature structural choice] MOTION: [how the energy moves — one signature animation] WILDCARD: [one unexpected detail that doesn't "match" but makes it memorable]
Step 5: Freshness Check
Before proceeding, verify:
- My vibe name is something I've NEVER used before
- I did NOT reuse hex codes from previous projects
- I did NOT default to my comfortable fonts (Inter? Space Grotesk? JetBrains Mono? Monospace-on-dark? Start over.)
- The material + energy collision is actually visible in my design choices
- Someone could NOT mistake this for previous work
- I included a wildcard that surprises even me
- The user's actual words and context are driving the aesthetic, not a category I pattern-matched to
- I did NOT mentally scan a list of "aesthetic styles" and pick the closest one
When Context Is Minimal
If the user just says "build me a page" with no specifics, you STILL do the conversational dig. Ask:
- "What's this for? Even one sentence helps."
- "What's the energy — fast and loud, or slow and quiet, or something else entirely?"
- "What would make you hate it?"
If they truly refuse to engage, derive from the PROJECT CONTENT itself — what the thing does, who it serves, what world it lives in. Never fall back on a preset list of vibes.
Generating Fresh References (When You Need Physical-World Anchors)
Do NOT use a static list. Instead, use this generative process:
- Take the user's domain/product and think: "What's a surprising real-world analog for this ACTION?"
- A task manager → an air traffic control tower? a short-order cook's ticket rail? a librarian's card catalog?
- Think about the USER's physical context: "Where are they when they use this? What does that space smell/sound/feel like?"
- Think about TIME: "When in the day/week/year does this get used? What's the light like? The mood?"
- Combine the most interesting answers into your material + energy collision.
Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
- Production-grade and functional
- Visually striking and memorable
- Cohesive with a clear aesthetic point-of-view
- Meticulously refined in every detail
Frontend Aesthetics Guidelines
Focus on:
- Typography: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
- Color & Theme: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
- Motion: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
- Spatial Composition: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density.
- Backgrounds & Visual Details: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays.
NEVER use generic AI-generated aesthetics like overused font families (Inter, Roboto, Arial, system fonts), cliched color schemes (particularly purple gradients on white backgrounds), predictable layouts and component patterns, and cookie-cutter design that lacks context-specific character. ALSO avoid the "anti-slop" cliche: dark backgrounds with monospace fonts and neon green/cyan/magenta accents (terminal/hacker aesthetic) is just as overplayed and lazy as purple-on-white. It is not edgy or distinctive - it is the default fallback when trying too hard to avoid looking generic.
Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, JetBrains Mono, Fira Code, for example) across generations.
Aesthetic Reference Library (Implementation Raw Materials ONLY)
STOP. If you haven't completed Vibe Discovery above, go back. This library is NOT a menu of vibes to pick from. It is a parts bin — font names, hex codes, and CSS techniques you can cannibalize AFTER you've invented your own direction.
Rules for using this library:
- You MUST have a completed Vibe Spec before looking here
- Cherry-pick individual techniques or font pairings that serve YOUR vibe
- NEVER adopt a whole section as your aesthetic — that's the exact problem this skill exists to prevent
- If your final design maps cleanly to one of these categories, you failed the Vibe Discovery process. Start over.
Warm / Organic
Think: bakery website, ceramics studio, wellness brand, farm-to-table restaurant
- Fonts: Fraunces (display) + Libre Baskerville (body), or Playfair Display + Source Serif Pro
- Palette:
warm sand,#D4A373
cream,#FAEDCD
sage,#CCD5AE
soft olive,#E9EDC9
deep slate#3D405B - Layout: Flowing, asymmetric sections with generous whitespace. Overlapping rounded images. Text wrapping around organic shapes.
- CSS techniques:
for blob shapes, subtleborder-radius: 40% 60% 55% 45% / 60% 40% 45% 55%
, warmbackdrop-filter: blur()
with brown tones,box-shadow
on overlapping photosmix-blend-mode: multiply
Luxury / Refined
Think: high-end hotel, jewelry brand, architecture firm, premium spirits
- Fonts: Cormorant Garamond (display) + Montserrat 300-weight (body), or Bodoni Moda + DM Sans
- Palette:
near-black,#1A1A1A
warm white,#F5F0EB
muted gold,#C9A96E
charcoal,#4A4A4A
bronze#8B7355 - Layout: Extreme whitespace. Full-bleed hero images. Text set very large and very light-weight. Horizontal scroll sections. Elements placed with mathematical precision.
- CSS techniques:
on uppercase labels,letter-spacing: 0.3em
, hairline borders (font-weight: 200
), smooth0.5px
, images withscroll-snap-type
,aspect-ratio: 3/4mix-blend-mode: luminosity
Playful / Toy-like
Think: children's app, party supply store, casual mobile game, snack brand
- Fonts: Baloo 2 (display) + Nunito (body), or Fredoka One + Quicksand
- Palette:
coral,#FF6B6B
teal,#4ECDC4
sunny yellow,#FFE66D
mint white,#F7FFF7
grounding navy#2C3E50 - Layout: Tilted cards (
), stacked/overlapping elements, big chunky buttons with visible borders, intentional "messiness."transform: rotate(-2deg) - CSS techniques:
, thickborder: 3px solid
for pop-out effect,box-shadow: 6px 6px 0 #000
, bouncyborder-radius: 1rem
transitions, wigglecubic-bezier(0.34, 1.56, 0.64, 1)
on hover, hand-drawn SVG borders@keyframes
Art Deco / Geometric
Think: cocktail bar, jazz venue, museum exhibition, luxury stationery
- Fonts: Poiret One (display) + Raleway (body), or Josefin Sans + Lato
- Palette:
midnight blue,#0D1B2A
true gold,#D4AF37
dark teal,#1B2838
parchment,#F0E6D3
ruby accent#C41E3A - Layout: Strong symmetry. Geometric dividers (chevrons, fan shapes). Layered borders and frames around content. Centered, formal composition.
- CSS techniques: Repeating SVG patterns as backgrounds,
for angular sections,clip-path: polygon()
used for geometric stripes, goldlinear-gradient
, CSSborder-image
for text, ornamentalcolumns
/::before
pseudo-elements::after
Soft / Pastel / Dreamy
Think: skincare brand, meditation app, baby products, stationery shop
- Fonts: Outfit (display) + Karla (body), or Sora + IBM Plex Sans
- Palette:
lavender,#E8D5F5
peach,#F5E6CC
mint,#D4E8E0
blush white,#FFF5F5
muted purple#5C5470 - Layout: Rounded everything. Floating cards with soft shadows. Generous padding. Content feels like it's resting on clouds.
- CSS techniques:
, largebox-shadow: 0 20px 60px rgba(0,0,0,0.05)
, subtleborder-radius: 2rem
behind sections,background: linear-gradient(135deg, ...)
glassmorphism but with pastel tints not dark glass,backdrop-filter: blur(20px)
for softnessfilter: saturate(0.9)
Retro-Futuristic / Sci-Fi
Think: space tourism, vintage tech revival, synth music, concept car reveal
- Fonts: Orbitron (display) + Exo 2 (body), or Audiowide + Rajdhani
- Palette:
void blue,#0A0E27
retro coral,#FF6F61
signal yellow,#E8D44D
electric cyan,#2DE2E6
analog cream#F5E6CA - Layout: Asymmetric grid with angled dividers. Data-viz inspired decorative elements (arcs, circles, grid overlays). Split-screen compositions.
- CSS techniques:
for radar/dial effects, animatedconic-gradient()
on SVG circles,stroke-dashoffset
angled sections, scanline overlay with repeating-linear-gradient,clip-path
glow with theme accent, CSStext-shadow
for numbering sectionscounter()
Editorial / Magazine
Think: longform journalism, fashion lookbook, photo essay, cultural review
- Fonts: Playfair Display (headlines) + Charter or Lora (body), or DM Serif Display + Atkinson Hyperlegible
- Palette:
rich black,#1A1A1A
warm off-white,#FAFAF7
editorial red,#C41E3A
olive grey,#6B705C
newsprint#E8E0D5 - Layout: Multi-column text. Pull quotes in oversized italic. Full-bleed images breaking the grid. Drop caps. Sidebar annotations.
- CSS techniques: CSS
withcolumns: 2
,column-rule
for pull quotes withfloat
,shape-outside
for drop caps, largeinitial-letter: 3
headlines,font-size: clamp(3rem, 8vw, 7rem)
for text over images,mix-blend-mode: differencehyphens: auto
Maximalist / Eclectic
Think: street festival, record store, zine, independent fashion label
- Fonts: Unbounded (display) + Space Mono (body), or Rubik Glitch + Work Sans
- Palette:
hot pink,#FF3366
electric green,#33FF57
gold,#FFD700
deep purple-black,#1A1A2E
tangerine — use ALL of them boldly#FF6B35 - Layout: Overlapping layers. Rotated elements. Mixed grid sizes. Collage-like composition. Things intentionally "breaking" out of containers.
- CSS techniques:
andmix-blend-mode: screen
on overlapping elements,difference
scattered, CSStransform: rotate()
for cutout effects, layeredmask-image
compositions,position: absolute
running perpetually on decorative elements, clashinganimation
contrasts (12px next to 120px)font-size
Industrial / Utilitarian
Think: construction company, warehouse sale, municipal service, maker space
- Fonts: IBM Plex Mono (labels) + IBM Plex Sans (body), or Overpass Mono + Overpass
- Palette:
concrete,#F5F5F0
asphalt,#333333
caution yellow,#FFB800
safety red,#E63946
steel blue#457B9D - Layout: Visible grid structure. Labels and metadata exposed. Numbered sections. Dense but organized information hierarchy.
- CSS techniques: Visible
on grid cells,outline: 1px dashed
with widetext-transform: uppercase
on labels,letter-spacing
,font-variant-numeric: tabular-nums
accent bars, monochrome photos withborder-left: 4px solid
, data-attribute-drivenfilter: grayscale(1)
content labels::before
IMPORTANT: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well.
Choosing an Aesthetic
When selecting a direction, consider what the content actually is. A restaurant doesn't need to look like a SaaS dashboard. A personal blog doesn't need to look like a developer portfolio. Let the subject matter drive the aesthetic, not your default comfort zone.
Roll the dice. If your instinct says "dark background," go light. If you reach for monospace, pick a serif. If you're about to use a card grid, try a magazine layout. Fight your own patterns.
Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision.