home / skills / jezweb / claude-skills / icon-design

icon-design skill

/skills/icon-design

This skill helps you select semantic icons from Lucide, Heroicons, or Phosphor with templates and tree-shaking guidance.

npx playbooks add skill jezweb/claude-skills --skill icon-design

Review the files below or copy the command above to add this skill to your agents.

Files (9)
SKILL.md
4.2 KB
---
name: icon-design
description: |
  Select semantically appropriate icons for websites using Lucide, Heroicons, or Phosphor. Covers concept-to-icon mapping, React/HTML templates, and tree-shaking patterns.

  Use when: building feature sections, service grids, contact info, navigation, or any UI needing icons. Prevents emoji usage, ensures consistency.
---

# Icon Design

Select the right icon for the job. Maps concepts to icons, provides templates, prevents common mistakes.

## Quick Reference (Top 20 Concepts)

| Concept | Lucide | Heroicons | Phosphor |
|---------|--------|-----------|----------|
| Award/Quality | `Trophy` | `trophy` | `Trophy` |
| Price/Value | `Tag` | `tag` | `Tag` |
| Location | `MapPin` | `map-pin` | `MapPin` |
| Expertise | `GraduationCap` | `academic-cap` | `GraduationCap` |
| Support | `MessageCircle` | `chat-bubble-left-right` | `ChatCircle` |
| Security | `Shield` | `shield-check` | `Shield` |
| Speed | `Zap` | `bolt` | `Lightning` |
| Phone | `Phone` | `phone` | `Phone` |
| Email | `Mail` | `envelope` | `Envelope` |
| User/Profile | `User` | `user` | `User` |
| Team | `Users` | `user-group` | `Users` |
| Settings | `Settings` | `cog-6-tooth` | `Gear` |
| Home | `Home` | `home` | `House` |
| Search | `Search` | `magnifying-glass` | `MagnifyingGlass` |
| Check/Success | `Check` | `check` | `Check` |
| Close/Cancel | `X` | `x-mark` | `X` |
| Menu | `Menu` | `bars-3` | `List` |
| Calendar | `Calendar` | `calendar` | `Calendar` |
| Clock/Time | `Clock` | `clock` | `Clock` |
| Heart/Favourite | `Heart` | `heart` | `Heart` |

## Library Selection

| Library | Best For | Package |
|---------|----------|---------|
| **Lucide** | General use, React projects | `lucide-react` |
| **Heroicons** | Tailwind projects, minimal style | `@heroicons/react` |
| **Phosphor** | Weight variations needed | `@phosphor-icons/react` |

**Default recommendation**: Lucide (1,400+ icons, excellent React integration)

See `references/library-comparison.md` for detailed comparison.

## Icon Style Rules

### Sizing

| Context | Tailwind Class | Pixels |
|---------|----------------|--------|
| Inline with text | `w-4 h-4` or `w-5 h-5` | 16-20px |
| Feature cards | `w-8 h-8` | 32px |
| Hero sections | `w-10 h-10` or `w-12 h-12` | 40-48px |
| Large decorative | `w-16 h-16` | 64px |

### Consistency Rules

1. **Never mix styles** - Use all outline OR all solid in a section
2. **Never use emoji** - Use proper icon components (tree-shakeable)
3. **Use currentColor** - Icons inherit text color via `stroke="currentColor"`
4. **Semantic colours** - Use `text-primary`, not `text-blue-500`

### Tree-Shaking (Critical)

Dynamic icon selection breaks tree-shaking. Use explicit maps:

```tsx
// BAD - all icons bundled
import * as Icons from 'lucide-react'
const Icon = Icons[iconName]  // Tree-shaken away!

// GOOD - explicit map
import { Home, Users, Settings, type LucideIcon } from 'lucide-react'
const ICON_MAP: Record<string, LucideIcon> = { Home, Users, Settings }
const Icon = ICON_MAP[iconName]
```

## Selection Process

1. **Identify the concept** - What does the label/title communicate?
2. **Check semantic mapping** - See `references/semantic-mapping.md`
3. **Choose library** - Lucide (default), Heroicons (Tailwind), Phosphor (weights)
4. **Apply template** - See `references/icon-templates.md`
5. **Verify consistency** - Same style, same size in section

## Decision Tree

When unsure which icon:

```
Is it about recognition/awards? → Trophy, Star, Award
Is it about money/price? → Tag, DollarSign, CreditCard
Is it about location? → MapPin, Globe, Map
Is it about people/team? → Users, UserGroup, User
Is it about communication? → MessageCircle, Phone, Mail
Is it about safety/trust? → Shield, Lock, ShieldCheck
Is it about speed/time? → Zap, Clock, Timer
Is it trade-specific? → Check semantic-mapping.md
Still unsure? → CheckCircle (generic positive) or Sparkles (generic feature)
```

## Resources

- `references/semantic-mapping.md` - Full concept→icon tables by category
- `references/icon-templates.md` - React/HTML patterns with Tailwind
- `references/library-comparison.md` - Lucide vs Heroicons vs Phosphor
- `references/migration-guide.md` - FA/Material → modern equivalents
- `rules/icon-design.md` - Correction rules for projects

Overview

This skill helps you pick semantically appropriate icons for web UIs using Lucide, Heroicons, or Phosphor. It maps concepts to recommended icons, provides ready-to-use React/HTML templates, and enforces tree-shaking patterns so builds stay small and consistent. Use it to replace emojis and accidental icon mixing with a deliberate, scalable icon strategy.

How this skill works

The skill inspects your UI concept (label, feature, or action) and returns a recommended icon from the selected library (Lucide by default). It supplies explicit import maps and React/HTML templates that preserve tree-shaking, plus Tailwind sizing classes and style rules. It also guides library choice (Lucide, Heroicons, Phosphor) and verifies consistency across a section.

When to use it

  • Building feature sections or service grids that need semantic icons
  • Designing navigation, contact info, or profile elements
  • Replacing emoji or inconsistent icon usage across a site
  • Preparing icon imports for production-ready tree-shaking
  • Choosing library based on project needs (Tailwind, weight variants)

Best practices

  • Pick one style per section: all outline or all solid — never mix
  • Use currentColor so icons inherit text color (stroke="currentColor")
  • Prefer semantic utility classes (e.g., text-primary) over raw colors
  • Use explicit import maps to preserve tree-shaking, avoid dynamic imports by name
  • Size icons with Tailwind classes that match context (inline, card, hero)

Example use cases

  • Feature card list: use Trophy for awards, Zap for speed, Shield for security
  • Contact block: Phone and Mail icons with w-5 h-5 inline sizing
  • Navigation: explicit Icon map to render menu icons without bundling unused assets
  • Hero section: large decorative icon (w-12 h-12) matching brand color via currentColor
  • Migration: map old Font Awesome icons to modern Lucide/Phosphor equivalents

FAQ

Which library should I choose?

Use Lucide by default for broad coverage and React integration; choose Heroicons for Tailwind projects and Phosphor when you need weight variations.

How do I avoid bundling every icon?

Never import the whole icon namespace dynamically. Import specific icons and build an explicit ICON_MAP to enable tree-shaking.