"use client" import * as React from "react" import { lazy, memo, Suspense } from "react" import { useQueryStates } from "nuqs" import { Item, ItemContent, ItemTitle } from "@/registry/bases/radix/ui/item" import { iconLibraries, type IconLibrary, type IconLibraryName, } from "@/registry/config" import { LockButton } from "@/app/(create)/components/lock-button" import { Picker, PickerContent, PickerGroup, PickerRadioGroup, PickerRadioItem, PickerSeparator, PickerTrigger, } from "@/app/(create)/components/picker" import { designSystemSearchParams } from "@/app/(create)/lib/search-params" const IconLucide = lazy(() => import("@/registry/icons/icon-lucide").then((mod) => ({ default: mod.IconLucide, })) ) const IconTabler = lazy(() => import("@/registry/icons/icon-tabler").then((mod) => ({ default: mod.IconTabler, })) ) const IconHugeicons = lazy(() => import("@/registry/icons/icon-hugeicons").then((mod) => ({ default: mod.IconHugeicons, })) ) const PREVIEW_ICONS = { lucide: [ "CopyIcon", "CircleAlertIcon", "TrashIcon", "ShareIcon", "ShoppingBagIcon", "MoreHorizontalIcon", "Loader2Icon", "PlusIcon", "MinusIcon", "ArrowLeftIcon", "ArrowRightIcon", "CheckIcon", "ChevronDownIcon", "ChevronRightIcon", ], tabler: [ "IconCopy", "IconExclamationCircle", "IconTrash", "IconShare", "IconShoppingBag", "IconDots", "IconLoader", "IconPlus", "IconMinus", "IconArrowLeft", "IconArrowRight", "IconCheck", "IconChevronDown", "IconChevronRight", ], hugeicons: [ "Copy01Icon", "AlertCircleIcon", "Delete02Icon", "Share03Icon", "ShoppingBag01Icon", "MoreHorizontalIcon", "Loading03Icon", "PlusSignIcon", "MinusSignIcon", "ArrowLeft02Icon", "ArrowRight02Icon", "Tick02Icon", "ArrowDown01Icon", "ArrowRight01Icon", ], } const logos = { lucide: ( ), tabler: ( ), hugeicons: ( ), } export function IconLibraryPicker({ isMobile, anchorRef, }: { isMobile: boolean anchorRef: React.RefObject }) { const [params, setParams] = useQueryStates(designSystemSearchParams, { shallow: false, history: "push", }) const currentIconLibrary = React.useMemo( () => iconLibraries[params.iconLibrary as keyof typeof iconLibraries], [params.iconLibrary] ) return ( Icon Library {currentIconLibrary?.title} {logos[currentIconLibrary?.name as keyof typeof logos]} { setParams({ iconLibrary: value as IconLibraryName }) }} > {Object.values(iconLibraries).map((iconLibrary, index) => ( {index < Object.values(iconLibraries).length - 1 && ( )} ))} ) } function IconLibraryPickerItem({ iconLibrary, value, }: { iconLibrary: IconLibrary value: string }) { return ( {iconLibrary.title} ) } const IconLibraryPreview = memo(function IconLibraryPreview({ iconLibrary, }: { iconLibrary: IconLibraryName }) { const previewIcons = PREVIEW_ICONS[iconLibrary] if (!previewIcons) { return null } const IconRenderer = iconLibrary === "lucide" ? IconLucide : iconLibrary === "tabler" ? IconTabler : IconHugeicons return ( {previewIcons.map((iconName) => ( ))} } > {previewIcons.map((iconName) => ( ))} ) })