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 (