cflx 0.6.11

Conflux – a spec-driven parallel coding orchestrator that runs AI agents on git worktrees
import React from 'react';
import { MessageSquare, Plus, X } from 'lucide-react';
import { ProposalSession } from '../api/types';

interface ProposalSessionTabsProps {
  sessions: ProposalSession[];
  activeSessionId: string | null;
  onSelectSession: (sessionId: string) => void;
  onCreateSession: () => void;
  onCloseSession?: (sessionId: string) => void;
}

export function ProposalSessionTabs({
  sessions,
  activeSessionId,
  onSelectSession,
  onCreateSession,
  onCloseSession,
}: ProposalSessionTabsProps) {
  const activeSessions = sessions.filter((s) => s.status !== 'closed');

  if (activeSessions.length === 0) return null;

  return (
    <div className="flex items-center gap-1 border-b border-[#27272a] px-2 py-1 overflow-x-auto">
      {activeSessions.map((session) => {
        const isActive = session.id === activeSessionId;
        return (
          <button
            key={session.id}
            onClick={() => onSelectSession(session.id)}
            className={`group flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs transition-colors ${
              isActive
                ? 'bg-[#1e1b4b]/50 text-[#a5b4fc]'
                : 'text-[#52525b] hover:bg-[#27272a]/50 hover:text-[#a1a1aa]'
            }`}
          >
            <MessageSquare className="size-3" />
            <span className="max-w-[120px] truncate font-mono">
              {session.worktree_branch}
            </span>
            {session.is_dirty && (
              <span className="size-1.5 rounded-full bg-[#f59e0b]" title="Uncommitted changes" />
            )}
            {onCloseSession && (
              <span
                onClick={(e) => {
                  e.stopPropagation();
                  onCloseSession(session.id);
                }}
                className="ml-0.5 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-[#27272a]"
                role="button"
                aria-label={`Close session ${session.worktree_branch}`}
              >
                <X className="size-3" />
              </span>
            )}
          </button>
        );
      })}
      <button
        onClick={onCreateSession}
        className="flex items-center gap-1 rounded-md px-2 py-1 text-xs text-[#52525b] transition-colors hover:bg-[#27272a]/50 hover:text-[#a1a1aa]"
        aria-label="New proposal session"
      >
        <Plus className="size-3" />
      </button>
    </div>
  );
}