"use client" import * as React from "react" import Link from "next/link" import { cn } from "cn" import { ChevronRightIcon } from "lucide-react" import { type RegistryItem } from "shadcn/schema" import { type Base } from "@/registry/bases" import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/styles/base-nova/ui/collapsible" import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from "@/styles/base-nova/ui/sidebar" import { useDesignSystemSearchParams } from "@/app/(app)/(create)/lib/search-params" import { groupItemsByType } from "@/app/(app)/(create)/lib/utils" const cachedGroupedItems = React.cache( (items: Pick[]) => { return groupItemsByType(items) } ) export function ItemExplorer({ base, items, }: { base: Base["name"] items: Pick[] }) { const [params, setParams] = useDesignSystemSearchParams() const groupedItems = React.useMemo(() => cachedGroupedItems(items), [items]) const currentItem = React.useMemo( () => items.find((item) => item.name === params.item) ?? null, [items, params.item] ) return ( {groupedItems.map((group) => ( {group.title} {group.items.map((item, index) => (
{index === group.items.length - 1 && (
)} setParams({ item: item.name })} className="relative h-[26px] w-fit cursor-pointer overflow-visible border border-transparent text-[0.8rem] font-normal after:absolute after:inset-x-0 after:-inset-y-1 after:z-0 after:rounded-md data-[active=true]:border-accent data-[active=true]:bg-accent 3xl:fixed:w-full 3xl:fixed:max-w-48" data-active={item.name === currentItem?.name} isActive={item.name === currentItem?.name} > {item.title} {item.title} ))} ))} ) }