Help us improve
Share bugs, ideas, or general feedback.
From design
Source, customize, and govern icon usage across all design surfaces — when to source from Flaticon, when Lucide or Heroicons or Phosphor is enough, when to commission custom marks. Picks one icon family and holds it across an asset. Owns iconography style coherence: stroke weight discipline, fill-vs-outline rules, sizing scale, color treatment. Use this skill any time icons are used in any deliverable — UI, deck, document, social, brand identity. Trigger before reaching for any icon so the choice is intentional rather than defaulted.
npx claudepluginhub bpainter/composable-dxp-claude-marketplace --plugin designHow this skill is triggered — by the user, by Claude, or both
Slash command
/design:design-iconographyThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Icons are quietly the most-defaulted decision in AI-generated design. Lucide gets reached for first because it's the shadcn default. Three different icon families end up on the same screen because nobody noticed. Stroke weights drift across the asset family. The accumulated mismatch is what makes generic look generic.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
Icons are quietly the most-defaulted decision in AI-generated design. Lucide gets reached for first because it's the shadcn default. Three different icon families end up on the same screen because nobody noticed. Stroke weights drift across the asset family. The accumulated mismatch is what makes generic look generic.
This skill enforces icon discipline: one family per asset family, consistent stroke weight, consistent fill-vs-outline, consistent sizing scale.
Pair with [[design-taste]] (load first), [[ai-tells-forbidden-patterns]] (the no-emoji-as-icon ban), and the surface-specific skills ([[design-presentation]], [[design-document]], [[design-social-asset]]).
Pick one. Hold it across the entire asset family.
A deck has one icon family. A document has one icon family. A UI has one icon family. No mixing.
The exception: when a deliverable explicitly composes UI screenshots (with their UI icon set) into a document. The doc still has its own icon family for callouts, sections, etc. — distinct from the UI icons inside the screenshots.
Pick one stroke weight per family. 1.5px or 2px, not both.
Set it once. Hold it across all icons in the asset.
Don't mix filled and outline icons at the same hierarchy level.
Define an icon-size scale once. Hold it.
For UI:
icon-xs: 16px (inline with body text)icon-sm: 20px (compact UI)icon-md: 24px (default)icon-lg: 32px (feature emphasis)icon-xl: 48px (hero treatments)For decks (16:9):
For documents (8.5×11):
fill: currentColor or stroke: currentColor).Emojis are font-dependent and inconsistent across platforms. Banned for navigation, settings, system controls, callout headings.
Acceptable emoji uses (rare):
For Slalom Composable DXP work: emojis don't appear in deliverables. (See [[ai-tells-forbidden-patterns]] — the emoji-as-structural-icon ban.)
Interactive icons (clickable) need a 44×44pt tap area minimum, even if the visual icon is smaller. Use hitSlop (React Native) or padding (web).
# Icon system: {Project}
## Family
- Library: {Lucide / Heroicons / Phosphor / Tabler / Flaticon premium / Custom}
- Reason: {why this family fits the brief}
## Stroke weight
- {1.5px or 2px}, applied across all icons.
## Fill-vs-outline rule
- Default: {outline / filled}
- Active state: {outline / filled} — used to signify selected/current.
## Sizing scale
- xs: 16px (inline text)
- sm: 20px (compact)
- md: 24px (default)
- lg: 32px (emphasis)
- xl: 48px (hero)
## Color treatment
- Inline: currentColor (inherits text)
- Emphasis: --accent
- Status: --success / --warning / --error / --info
## Usage rules
- Icons clarify, never decorate.
- One family per asset family.
- Touch targets ≥ 44pt for interactive.
Is this product UI (web app, mobile app, dashboard)?
├─ Yes → Lucide (shadcn default) or Phosphor (if weight variation matters)
└─ No
│
Is this a brand identity deliverable (logo, mark, brand asset)?
├─ Yes → Custom commissioned
└─ No
│
Is this a deck, document, or social asset using illustrative/decorative icons?
├─ Yes → Flaticon (with license verified per icon — see tool-flaticon)
└─ No → default to Lucide for consistency
| Failure | Symptom | Fix |
|---|---|---|
| Mixed families | Lucide outline + Material filled in the same UI | Audit, pick one, replace others |
| Drifting stroke weight | Some 1.5px, some 2px, some 3px | Set one weight in the icon-system file; replace mismatches |
| Mixed fill/outline at same hierarchy | Some filled, some outline, no clear rule | Define rule (default + active state); apply consistently |
| Emojis as structural icons | 🚀 in a button label, 📊 in a section heading | Replace with SVG icons from chosen family |
| Decorative color | Icons in random brand colors with no semantic meaning | Inherit text color or use one accent |
| Too many icons | Every list item has an icon, every label has an icon | Cut decorative icons; keep only those that clarify |
| Icon-only buttons no label | Icon button with no aria-label or visible label | Add label or aria-label (see [[interaction-patterns]] §1) |
| Icons too small at touch | 16px clickable icon with no hit-padding | Add 44pt tap area via padding or hitSlop |
| Custom icon doesn't match family | One commissioned icon next to library icons in a different style | Either customize the entire family or pick a library icon |
software-engineering-frontend-developer — when icons need implementation.tool-flaticon in design/references/ — for the Flaticon sourcing protocol.