GLMPilot / packages /client /src /components /editor /EditorTabs.tsx
E5K7's picture
Initial commit: Rebranded to GLMPilot and migrated to GLM-5 API
c2c8c8d
import { X } from 'lucide-react';
import { useEditorStore } from '@/stores/editorStore';
import { cn } from '@/lib/utils';
import { getFileName } from '@glmpilot/shared';
export default function EditorTabs() {
const openFiles = useEditorStore((s) => s.openFiles);
const activeFilePath = useEditorStore((s) => s.activeFilePath);
const setActive = useEditorStore((s) => s.setActive);
const removeFile = useEditorStore((s) => s.removeFile);
const files = Object.values(openFiles);
if (files.length === 0) return null;
return (
<div className="flex items-center bg-background border-b border-border overflow-x-auto">
{files.map((file) => (
<button
key={file.path}
onClick={() => setActive(file.path)}
className={cn(
'group flex items-center gap-2 px-3 py-1.5 text-xs border-r border-border transition-colors min-w-0 shrink-0',
file.path === activeFilePath
? 'bg-card text-foreground'
: 'text-muted-foreground hover:text-foreground hover:bg-card/50'
)}
>
{file.isDirty && (
<span className="w-1.5 h-1.5 rounded-full bg-primary shrink-0" />
)}
<span className="truncate max-w-[120px]">{getFileName(file.path)}</span>
<span
onClick={(e) => {
e.stopPropagation();
removeFile(file.path);
}}
className="opacity-0 group-hover:opacity-100 hover:bg-secondary rounded p-0.5 transition-opacity"
>
<X className="w-3 h-3" />
</span>
</button>
))}
</div>
);
}