/** * TerminalGrid - Display multiple terminals in a responsive grid */ import type { JSX } from 'react'; import type { TerminalInfo, TerminalSettings, PtySession } from '#types'; import type { TerminalEngineId } from './views/types.js'; import { TerminalCard } from './TerminalCard.js'; export interface GridLayout { cols: number; rows: number; } export interface TerminalGridProps { terminals: TerminalInfo[]; sessions: PtySession[]; gridLayout: GridLayout; getSettings: (terminalId: string) => TerminalSettings; onSettingsChange: (terminalId: string, updates: Partial) => void; onRemoveFromGrid: (terminalId: string) => void; onTerminalFocus: (terminal: TerminalInfo) => void; onTerminalBlur: (terminal: TerminalInfo) => void; onClearAll?: () => void; /** Rendering engine for all virtual terminals in the grid. */ engine?: TerminalEngineId; onEngineChange?: (engine: TerminalEngineId) => void; } export function TerminalGrid({ terminals, sessions, gridLayout, getSettings, onSettingsChange, onRemoveFromGrid, onTerminalFocus, onTerminalBlur, onClearAll, engine = 'xterm', onEngineChange, }: TerminalGridProps): JSX.Element { if (terminals.length === 0) { return (
Click terminals in the left panel to add them to the grid (Up to 9 terminals in a 3x3 grid)
); } return (
{terminals.length} Terminal{terminals.length > 1 ? 's' : ''} ({gridLayout.cols}x {gridLayout.rows} grid)
{onEngineChange && (
Engine:
)} {onClearAll && ( )}
{terminals.map((terminal, index) => { const session = sessions.find((s) => s.id === terminal.sessionId); return ( onSettingsChange(terminal.id, updates)} onClose={() => onRemoveFromGrid(terminal.id)} onFocus={() => onTerminalFocus(terminal)} onBlur={() => onTerminalBlur(terminal)} engine={engine} /> ); })}
); } export default TerminalGrid;