import { IconPlus, IconX, type Icon as TabIcon } from '@tabler/icons-react' import { cva } from 'class-variance-authority' import { IconGhost } from '@/client/components/shared/IconGhost' import { ReorderableList } from '@/client/components/shared/ReorderableList' import type { ReorderableRenderState } from '@/client/components/shared/ReorderableList' import { Button, buttonVariants } from '@/client/components/ui/button' import { Spinner } from '@/client/components/ui/spinner' import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '@/client/components/ui/dropdown-menu' import { cn } from '@/client/lib/cn' import type { WorkspaceTabId } from '@/lib/types' export type WorkspaceTabItem = { key: WorkspaceTabId Icon: TabIcon label: string closable?: boolean loading?: boolean } export type CreateWorkspaceTabItem = { key: string Icon: TabIcon label: string onClick: () => void } type WorkspaceTabsProps = { tabs: WorkspaceTabItem[] active: WorkspaceTabId createItems: CreateWorkspaceTabItem[] onSelect: (tab: WorkspaceTabId) => void onClose: (tab: WorkspaceTabId) => void onReorder: (ordered: WorkspaceTabId[]) => void } const workspaceTabVariants = cva( [buttonVariants({ variant: 'ghost', size: 'sm' }), 'group/tab min-w-0'], { variants: { active: { true: 'bg-accent text-accent-foreground' }, dragging: { true: 'invisible' }, preview: { true: 'cursor-grabbing ring-1 ring-border' } }, compoundVariants: [{ preview: true }] } ) function CreateTabMenu({ items }: { items: CreateWorkspaceTabItem[] }) { return ( } /> {items.map(({ key, Icon, label, onClick }) => ( {label} ))} ) } type WorkspaceTabBaseProps = { tab: WorkspaceTabItem active: boolean } type WorkspaceTabProps = WorkspaceTabBaseProps & ( | { preview: true state?: never onSelect?: never onClose?: never } | { preview?: false state: ReorderableRenderState onSelect: (tab: WorkspaceTabId) => void onClose: (tab: WorkspaceTabId) => void } ) function WorkspaceTab(props: WorkspaceTabProps) { const { tab, active } = props const preview = props.preview === true return ( ) } export function WorkspaceTabs({ tabs, active, createItems, onSelect, onClose, onReorder }: WorkspaceTabsProps) { return (
tab.key} className="flex w-max items-center gap-1" onReorder={ordered => onReorder(ordered as WorkspaceTabId[])} renderPlaceholder={() => (
)} renderOverlay={tab => } renderItem={(tab, state) => ( )} />
) }