{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "icon-context",
  "title": "Icon Context",
  "description": "Named icon slots with a Lucide default set; swap any icon via IconProvider.",
  "dependencies": [
    "lucide-react"
  ],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/lib/icon-context.tsx",
      "content": "\"use client\";\n\nimport { createContext, useContext, useMemo, type ComponentType, type ReactNode } from \"react\";\n\nimport {\n  ChevronRight,\n  ChevronDown,\n  X,\n  Copy,\n  Menu,\n  Dot,\n  Monitor,\n  Sun,\n  Moon,\n  RectangleHorizontal,\n  Circle,\n  SquareLibrary,\n  Clock,\n  Star,\n  Settings,\n  Plus,\n  ArrowLeft,\n  ArrowRight,\n  ArrowUp,\n  ArrowDown,\n  Search,\n  Loader,\n  Users,\n  Lock,\n  Mail,\n  Bell,\n  Shield,\n  Palette,\n  Lightbulb,\n  Rocket,\n  Heart,\n  Paintbrush,\n  Brain,\n  Globe,\n  User,\n  ImageIcon,\n  Link,\n  Check,\n  RotateCcw,\n  Play,\n  Pause,\n  Pipette,\n  Home,\n  MessageCircle,\n  Inbox,\n  Pencil,\n  Scaling,\n  SkipForward,\n  CornerDownRight,\n  CornerDownLeft,\n  PanelLeft,\n  PanelRight,\n  ChevronsUpDown,\n  Ellipsis,\n  EllipsisVertical,\n  Calendar,\n  Folder,\n  SlidersHorizontal,\n  Download,\n  Undo2,\n  Redo2,\n  Bold,\n  Italic,\n  Strikethrough,\n  Code,\n  TextQuote,\n  List,\n  ListOrdered,\n  ListTodo,\n  IndentIncrease,\n  IndentDecrease,\n  Minus,\n} from \"lucide-react\";\n\nexport interface IconComponentProps {\n  size?: number;\n  strokeWidth?: number;\n  className?: string;\n}\n\nexport type IconComponent = ComponentType<IconComponentProps>;\n\nexport type IconName =\n  | \"chevron-right\" | \"chevron-down\" | \"x\" | \"copy\" | \"menu\" | \"dot\"\n  | \"monitor\" | \"sun\" | \"moon\" | \"rectangle-horizontal\" | \"circle\"\n  | \"square-library\" | \"clock\" | \"star\" | \"settings\"\n  | \"plus\" | \"arrow-left\" | \"arrow-right\" | \"arrow-up\" | \"arrow-down\"\n  | \"search\" | \"loader\"\n  | \"users\" | \"lock\" | \"mail\" | \"bell\" | \"shield\" | \"palette\"\n  | \"lightbulb\" | \"rocket\" | \"heart\" | \"paintbrush\" | \"brain\"\n  | \"globe\" | \"user\"\n  | \"image\" | \"link\" | \"check\" | \"rotate-ccw\"\n  | \"play\" | \"pause\" | \"pipette\"\n  | \"home\" | \"message-circle\" | \"inbox\"\n  | \"pencil\" | \"scaling\" | \"skip-forward\" | \"corner-down-right\" | \"corner-down-left\"\n  | \"panel-left\" | \"panel-right\" | \"chevrons-up-down\" | \"more-horizontal\" | \"more-vertical\" | \"calendar\" | \"folder\"\n  | \"sliders-horizontal\" | \"download\"\n  | \"undo\" | \"redo\" | \"bold\" | \"italic\" | \"strikethrough\" | \"code\"\n  | \"text-quote\" | \"list\" | \"list-ordered\" | \"list-todo\"\n  | \"indent-increase\" | \"indent-decrease\" | \"minus\";\n\nexport const defaultIcons: Record<IconName, IconComponent> = {\n  \"chevron-right\": ChevronRight,\n  \"chevron-down\": ChevronDown,\n  \"pipette\": Pipette,\n  \"x\": X,\n  \"copy\": Copy,\n  \"menu\": Menu,\n  \"dot\": Dot,\n  \"monitor\": Monitor,\n  \"sun\": Sun,\n  \"moon\": Moon,\n  \"rectangle-horizontal\": RectangleHorizontal,\n  \"circle\": Circle,\n  \"square-library\": SquareLibrary,\n  \"clock\": Clock,\n  \"star\": Star,\n  \"settings\": Settings,\n  \"plus\": Plus,\n  \"arrow-left\": ArrowLeft,\n  \"arrow-right\": ArrowRight,\n  \"arrow-up\": ArrowUp,\n  \"arrow-down\": ArrowDown,\n  \"search\": Search,\n  \"loader\": Loader,\n  \"users\": Users,\n  \"lock\": Lock,\n  \"mail\": Mail,\n  \"bell\": Bell,\n  \"shield\": Shield,\n  \"palette\": Palette,\n  \"lightbulb\": Lightbulb,\n  \"rocket\": Rocket,\n  \"heart\": Heart,\n  \"paintbrush\": Paintbrush,\n  \"brain\": Brain,\n  \"globe\": Globe,\n  \"user\": User,\n  \"image\": ImageIcon,\n  \"link\": Link,\n  \"check\": Check,\n  \"rotate-ccw\": RotateCcw,\n  \"play\": Play,\n  \"pause\": Pause,\n  \"home\": Home,\n  \"message-circle\": MessageCircle,\n  \"inbox\": Inbox,\n  \"pencil\": Pencil,\n  \"scaling\": Scaling,\n  \"skip-forward\": SkipForward,\n  \"corner-down-right\": CornerDownRight,\n  \"corner-down-left\": CornerDownLeft,\n  \"panel-left\": PanelLeft,\n  \"panel-right\": PanelRight,\n  \"chevrons-up-down\": ChevronsUpDown,\n  \"more-horizontal\": Ellipsis,\n  \"more-vertical\": EllipsisVertical,\n  \"calendar\": Calendar,\n  \"folder\": Folder,\n  \"sliders-horizontal\": SlidersHorizontal,\n  \"download\": Download,\n  \"undo\": Undo2,\n  \"redo\": Redo2,\n  \"bold\": Bold,\n  \"italic\": Italic,\n  \"strikethrough\": Strikethrough,\n  \"code\": Code,\n  \"text-quote\": TextQuote,\n  \"list\": List,\n  \"list-ordered\": ListOrdered,\n  \"list-todo\": ListTodo,\n  \"indent-increase\": IndentIncrease,\n  \"indent-decrease\": IndentDecrease,\n  \"minus\": Minus,\n};\n\nconst IconContext = createContext<Record<IconName, IconComponent> | null>(null);\n\n/**\n * Returns a single icon component for the given name.\n * Falls back to the default (Lucide) set if no provider is present.\n */\nfunction useIcon(name: IconName): IconComponent {\n  const icons = useContext(IconContext);\n  return (icons ?? defaultIcons)[name];\n}\n\n/**\n * Returns the full icon map.\n * Falls back to the default (Lucide) set if no provider is present.\n */\nfunction useIcons(): Record<IconName, IconComponent> {\n  const icons = useContext(IconContext);\n  return icons ?? defaultIcons;\n}\n\n/**\n * Swap some or all icons for components from another library.\n * Names left out of `icons` keep their default (Lucide) component.\n */\nfunction IconProvider({\n  children,\n  icons,\n}: {\n  children: ReactNode;\n  icons?: Partial<Record<IconName, IconComponent>>;\n}) {\n  const value = useMemo(() => ({ ...defaultIcons, ...icons }), [icons]);\n  return <IconContext.Provider value={value}>{children}</IconContext.Provider>;\n}\n\nexport { IconProvider, useIcon, useIcons };\n",
      "type": "registry:lib"
    }
  ],
  "categories": [
    "lib"
  ],
  "type": "registry:lib"
}