A unified, theme-aware icon system built on the shadcn pattern. All icons use currentColor and inherit from parent text color.
Last Updated: January 2026
62 new icons added for form and UI components:
loader2, loaderCirclecheck, checkCircle, circleCheck, circleX, circleAlert, checkCircle2chevronLeft, chevronRight, arrowUpfile, fileText, fileSpreadsheet, fileAudio, image, videoupload, download, save, send, edit, pencil, copy, trash2bell, bellOff, mail, phone, smartphone, messageSquaregraduationCap, award, medal, trophy, school, landmark, library, bookOpenplus, minus, x, close, search, filter, settings, eye, eyeOff, moon, sunuser, clock, calendar, mapPin, palette, lightbulb, info, heart, wrench, sparkles, atSign, paperclip, triangleAlert, clipboardListimport { Icons } from "@/components/icons"
export function Example() {
return (
<div className="flex items-center gap-2">
<Icons.github className="size-5" />
<Icons.check className="size-5 text-green-500" />
<Icons.alertCircle className="text-destructive size-5" />
</div>
)
}Browse all 100+ icons and illustrations from Anthropic's design system. Click any icon for tags, path, and usage details.
112 icons found
Navigation, actions, and interface elements.
Third-party brands and technologies.
import { Icons } from "@/components/icons"
<Icons.github className="size-5" />
<Icons.check className="size-5 text-green-500" />
<Icons.spinner className="size-5 animate-spin" />import { GitHubIcon, CheckIcon } from "@/components/icons"
<GitHubIcon className="size-5" />
<CheckIcon className="size-5" />import { Icon } from "@/components/icons"
;<Icon name="github" className="size-5" />Use Tailwind's size-* utilities for consistent sizing:
<Icons.github className="size-4" /> {/* 16px */}
<Icons.github className="size-5" /> {/* 20px */}
<Icons.github className="size-6" /> {/* 24px */}
<Icons.github className="size-8" /> {/* 32px */}Icons inherit color from parent by default:
<div className="text-primary">
<Icons.github /> {/* Inherits text-primary */}
</div><Icons.github className="text-muted-foreground" />
<Icons.alertCircle className="text-destructive" />
<Icons.check className="text-green-500" /><Icons.check className="icon-success" /> {/* Green */}
<Icons.trash className="icon-destructive" /> {/* Red */}
<Icons.info className="icon-muted" /> {/* Muted */}
<Icons.star className="icon-warning" /> {/* Yellow */}/icon-add <name>Add a new icon to the system.
/icon-add activity/icon-migrate <scope>Migrate lucide-react imports to the unified system.
# Migrate a single file
/icon-migrate src/components/example.tsx
# Migrate in batches (10 files at a time)
/icon-migrate batch
# Migrate all files (with confirmation)
/icon-migrate all
# Show migration status
/icon-migrate report/icon-auditAudit icon usage across the codebase.
/icon-auditOutput includes:
/icon-registry <mode>Manage the icon registry.
# Sync registry with Icons namespace
/icon-registry sync
# Add single icon to registry
/icon-registry add alertCircle
# Validate registry completeness
/icon-registry validate
# Export registry as JSON
/icon-registry export/icon-validateValidate icons against design system rules.
/icon-validate/icon-fetch <source>Fetch icons from external sources.
# Fetch from Anthropic design system
/icon-fetch anthropic
# Fetch education-style icons
/icon-fetch education
# Fetch school operations icons
/icon-fetch school
# Fetch from all sources
/icon-fetch allThe unified system provides consistent theming and better maintainability.
Before (Direct Import):
import { AlertCircle, RefreshCw, Moon, Sun } from "lucide-react"
<AlertCircle className="h-4 w-4" />
<RefreshCw className="h-5 w-5 animate-spin" />After (Unified System):
import { Icons } from "@/components/icons"
<Icons.alertCircle className="size-4" />
<Icons.refresh className="size-5 animate-spin" />The icon registry provides metadata for all icons, enabling search, filtering, and documentation generation.
interface IconMetadata {
id: string // kebab-case identifier
name: string // Display name
component: IconComponent // React component
category: IconCategory // Primary category
tags: string[] // Search keywords
description?: string // Usage description
viewBox: string // SVG viewBox
customizable: boolean // Can use className for colors
}import { searchIcons } from "@/components/icons/utils"
const results = searchIcons("arrow")
// Returns icons matching "arrow" in id, name, tags, or descriptionimport { getIconsByCategory, IconCategory } from "@/components/icons"
const systemIcons = getIconsByCategory(IconCategory.SYSTEM)
const integrationIcons = getIconsByCategory(IconCategory.INTEGRATIONS)src/components/icons/
├── index.tsx # Main exports & Icons namespace
├── types.ts # TypeScript types & IconCategory enum
├── constants.ts # Category metadata & style guide
├── utils.ts # Helper functions (search, filter)
├── registry.ts # Icon registry with metadata (120+ entries)
├── anthropic.tsx # Anthropic design system icons
├── anthropic-showcase.tsx # Interactive showcase component
├── components/
│ └── icon-wrapper.tsx # IconWrapper for file-based icons
└── categories/
├── system.tsx # System/UI icons (40+)
├── integrations.tsx # Brand/integration icons (15+)
├── content.tsx # Content type icons
├── apps.tsx # Application icons
├── productivity.tsx # Productivity icons
├── development.tsx # Development tool icons
├── programming.tsx # Programming language icons
├── ratings.tsx # Rating icons
└── shapes.tsx # Shape icons
// categories/system.tsx
export const NewIcon = (props: IconProps) => (
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
{...props}
>
<path d="..." />
</svg>
)// index.tsx
export const Icons = {
// ... existing icons
newIcon: SystemIcons.NewIcon,
} as const// registry.ts
{
id: "new-icon",
name: "New Icon",
component: SystemIcons.NewIcon,
category: IconCategory.SYSTEM,
tags: ["new", "icon", "example"],
description: "Description of the icon",
viewBox: "0 0 24 24",
customizable: true,
}currentColor for fill/stroke{...props} last to allow overridesxmlns for standalone exportviewBox="0 0 24 24" for UI iconsLarge illustrative icons are available as image paths:
import Image from "next/image"
import { ANTHROPIC_ILLUSTRATIONS } from "@/components/icons"
;<Image
src={ANTHROPIC_ILLUSTRATIONS.handsBuild}
alt="Hands building"
width={200}
height={200}
/>Available illustrations:
handsBuild, handsStack, objectsPuzzlecategory01 through category14import { getIconForLanguage } from "@/components/icons"
const Icon = getIconForLanguage("ts") // TypeScriptIcon
const Icon = getIconForLanguage("py") // PythonIcon
const Icon = getIconForLanguage("rs") // RustIcon
<Icon className="size-4" />import { getAllIconNames, getIconCount } from "@/components/icons"
const names = getAllIconNames() // ["logo", "github", "check", ...]
const count = getIconCount() // 120+import type { IconName } from "@/components/icons"
function IconButton({ icon }: { icon: IconName }) {
const IconComponent = Icons[icon]
return <IconComponent className="size-4" />
}Icons.name for consistencysize-* classes - Not w-4 h-4.icon-destructive for delete actions/icon-audit - To check migration progressCheck if the icon exists in the Icons namespace:
import { Icons } from "@/components/icons"
console.log(Object.keys(Icons)) // List all available iconsUse the IconName type for type-safe icon names:
import type { IconName } from "@/components/icons"
const iconName: IconName = "github" // Type-checkedEnsure the icon uses currentColor:
// Check the SVG has fill="currentColor" or stroke="currentColor"
<path fill="currentColor" d="..." />Run the registry sync command:
/icon-registry sync