Icon Picker
icon-picker-alan-courtois/icon-pickerFreeComponent
An icon picker component with lucide icons.
Live preview
live · rendered by the registry
Rendered by acme on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://icon-picker.alan-courtois.fr/r/icon-picker.jsonSource
1"use client";23import * as React from "react";4import { useState, useMemo, useCallback, useEffect } from "react";5import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";6import { Button } from "@/components/ui/button";7import { Input } from "@/components/ui/input";8import { cn } from "@/lib/utils";9import { LucideProps, LucideIcon } from 'lucide-react';10import { DynamicIcon, dynamicIconImports, IconName } from 'lucide-react/dynamic';11import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";12import { iconsData } from "./icons-data";13import { useVirtualizer, VirtualItem } from '@tanstack/react-virtual';14import { Skeleton } from "@/components/ui/skeleton";15import Fuse from 'fuse.js';16import { useDebounceValue } from "usehooks-ts";1718export type IconData = typeof iconsData[number];1920interface IconPickerProps extends Omit<React.ComponentPropsWithoutRef<typeof PopoverTrigger>, 'onSelect' | 'onOpenChange'> {21 value?: IconName22 defaultValue?: IconName23 onValueChange?: (value: IconName) => void24 open?: boolean25 defaultOpen?: boolean26 onOpenChange?: (open: boolean) => void27 searchable?: boolean28 searchPlaceholder?: string29 triggerPlaceholder?: string30 iconsList?: IconData[]31 categorized?: boolean32 modal?: boolean33}3435const IconRenderer = React.memo(({ name }: { name: IconName }) => {36 return <Icon name={name} />;37});38IconRenderer.displayName = "IconRenderer";3940const IconsColumnSkeleton = () => {41 return (42 <div className="flex flex-col gap-2 w-full">43 <Skeleton className="h-4 w-1/2 rounded-md" />44 <div className="grid grid-cols-5 gap-2 w-full">45 {46 Array.from({ length: 40 }).map((_, i) => (47 <Skeleton key={i} className="h-10 w-10 rounded-md" />48 ))49 }50 </div>51 </div>52 )53}5455const useIconsData = () => {56 const [icons, setIcons] = useState<IconData[]>([]);57 const [isLoading, setIsLoading] = useState(true);5859 useEffect(() => {60 let isMounted = true;6162 const loadIcons = async () => {63 setIsLoading(true);6465 const { iconsData } = await import('./icons-data');66 if (isMounted) {67 setIcons(iconsData.filter((icon: IconData) => {68 return icon.name in dynamicIconImports;69 }));70 setIsLoading(false);71 }72 };7374 loadIcons();7576 return () => {77 isMounted = false;78 };79 }, []);8081 return { icons, isLoading };82};8384const IconPicker = React.forwardRef<85// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from acme
All 2 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Icon Picker Exampleicon-picker-example | acme | Components | Free | no deps |
