- Every icon directory must have
default.svg - Every SVG must have a valid
viewBoxattribute - Every SVG must contain a
<title>element with the brand name - Preferred viewBox:
0 0 24 24(match library convention) - File size must be under 50KB
- No
<script>tags, event handlers, orjavascript:URIs - No embedded raster images (
<image>with base64 data) - No
<?xml>declarations or<!DOCTYPE>preambles
default.svg: Must use the brand hex color asfillon<svg>root (notcurrentColor)mono.svg: Must usefill="currentColor"on<svg>rootlight.svg: Must usefill="#ffffff"or similar light colordark.svg: Must usefill="#1a1a2e"or similar dark color- Detail elements (eyes, pupils, accents) that contrast with the body must have explicit
filloverrides - they must not inherit the root fill if that makes them invisible - Stroke colors on antennae, lines, or accents must contrast with adjacent filled shapes - same-color strokes over same-color fills are invisible
- Never include a viewport-covering rectangle like
<path d="M0 0h24v24H0z"/>withoutfill="none"- this covers the entire icon
- Located at
src/data/icons.json - Entries must be alphabetically sorted by
slug - Required fields:
slug,title,aliases,hex,categories,variants,license,url hexmust not include#prefix (e.g."f43f5e"not"#f43f5e")variantsobject keys must match filenames inpublic/icons/{slug}/categoriesmust use existing category names (check existing entries)
public/icons/{slug}/
default.svg # Required - brand color
mono.svg # Recommended - inherits text color
light.svg # Optional - for dark backgrounds
dark.svg # Optional - for light backgrounds
color.svg # Optional - multi-color/gradient version
wordmark.svg # Optional - text logo
wordmarkLight.svg # Optional - light text logo
wordmarkDark.svg # Optional - dark text logo
- Lowercase, hyphen-separated
- No uppercase, no spaces, no underscores
- Must match the directory name under
public/icons/
- No
anytypes - Strict mode enabled
- Server Components by default,
"use client"only when needed
- Tailwind CSS only, no inline styles or CSS modules
- shadcn/ui components, extend don't reinvent
- Lucide icons for UI chrome (not for brand icons)
- Never commit directly to
main - Conventional commit messages:
feat:,fix:,docs:,refactor:,test:,perf: - No AI tool mentions in commit messages
- Invisible elements: Fill color matches background or parent fill - always verify contrast
- Bounding box paths:
M0 0hWvHrectangles that cover the entire icon - Wrong alphabetical position: icons.json must stay sorted by slug
- Missing fill overrides: Child elements inheriting root fill when they need a different color
- Inconsistent viewBox: All icons in a PR should use the same coordinate space as the library standard
- Google Fonts in SVG: External
@import url()for fonts will not render in most contexts