# Code coverage report for src/components/features/python-runner/TerminalOutput.tsx

# All files / src/components/features/python-runner TerminalOutput.tsx

100% Statements 49/49
100% Branches 5/5
100% Functions 1/1
100% Lines 49/49

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    501x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    76x
    30x
    30x
    30x
    30x
    30x
    30x
    46x
    46x
    46x
    46x
    256x
    256x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
    46x
     import { motion } from 'framer-motion'

    interface TerminalLine {
      type: 'output' | 'error' | 'input-prompt' | 'input-value'
      content: string
      id: string
    }

    interface TerminalOutputProps {
      lines: TerminalLine[]
      isRunning: boolean
    }

    export function TerminalOutput({ lines, isRunning }: TerminalOutputProps) {
      if (lines.length === 0 && !isRunning) {
        return (
          <div className="flex items-center justify-center h-full text-muted-foreground">
            Click "Run" to execute the Python code
          </div>
        )
      }

      return (
        <div className="space-y-1">
          {lines.map((line) => (
            <motion.div
              key={line.id}
              initial={{ opacity: 0, y: 5 }}
              animate={{ opacity: 1, y: 0 }}
              transition={{ duration: 0.15 }}
              className="leading-relaxed"
            >
              {line.type === 'output' && (
                <div className="text-foreground whitespace-pre-wrap">{line.content}</div>
              )}
              {line.type === 'error' && (
                <div className="text-destructive whitespace-pre-wrap">{line.content}</div>
              )}
              {line.type === 'input-prompt' && (
                <div className="text-accent font-medium whitespace-pre-wrap">{line.content}</div>
              )}
              {line.type === 'input-value' && (
                <div className="text-primary whitespace-pre-wrap">{'> ' + line.content}</div>
              )}
            </motion.div>
          ))}
        </div>
      )
    }