Terminal

Display streaming console output with full ANSI color support.

The Terminal component displays console output with ANSI color support, streaming indicators, and auto-scroll functionality.

Install using CLI

AI Elements Vue
shadcn-vue CLI
npx ai-elements-vue@latest add terminal

Install Manually

Copy and paste the following files into the same folder.

Terminal.vue
TerminalHeader.vue
TerminalTitle.vue
TerminalStatus.vue
TerminalActions.vue
TerminalContent.vue
TerminalCopyButton.vue
TerminalClearButton.vue
context.ts
index.ts
<script setup lang="ts">
import type { HTMLAttributes } from 'vue'
import { cn } from '@repo/shadcn-vue/lib/utils'
import { computed, getCurrentInstance, provide } from 'vue'
import { TerminalKey } from './context'
import TerminalActions from './TerminalActions.vue'
import TerminalClearButton from './TerminalClearButton.vue'
import TerminalContent from './TerminalContent.vue'
import TerminalCopyButton from './TerminalCopyButton.vue'
import TerminalHeader from './TerminalHeader.vue'
import TerminalStatus from './TerminalStatus.vue'
import TerminalTitle from './TerminalTitle.vue'

interface Props extends /* @vue-ignore */ HTMLAttributes {
  output: string
  isStreaming?: boolean
  autoScroll?: boolean
  class?: HTMLAttributes['class']
}

const props = withDefaults(defineProps<Props>(), {
  isStreaming: false,
  autoScroll: true,
})

const emit = defineEmits<{
  (e: 'clear'): void
}>()

const instance = getCurrentInstance()

// Check for the presence of the 'onClear' listener
const hasClear = computed(() => !!instance?.vnode.props?.onClear)

function handleClear() {
  emit('clear')
}

provide(TerminalKey, {
  output: computed(() => props.output),
  isStreaming: computed(() => props.isStreaming),
  autoScroll: computed(() => props.autoScroll),
  hasClear,
  onClear: handleClear,
})
</script>

<template>
  <div
    :class="cn(
      'flex flex-col overflow-hidden rounded-lg border bg-zinc-950 text-zinc-100',
      props.class,
    )"
    v-bind="$attrs"
  >
    <slot>
      <TerminalHeader>
        <TerminalTitle />
        <div class="flex items-center gap-1">
          <TerminalStatus />
          <TerminalActions>
            <TerminalCopyButton />
            <TerminalClearButton v-if="hasClear" />
          </TerminalActions>
        </div>
      </TerminalHeader>
      <TerminalContent />
    </slot>
  </div>
</template>

Features

  • Full ANSI color support (256 colors, bold, italic, underline)
  • Streaming mode with cursor animation
  • Auto-scroll to latest output
  • Copy output to clipboard
  • Clear button support
  • Dark terminal theme

ANSI Support

The Terminal uses ansi-to-vue3 to parse ANSI escape codes:

\x1b[32m✓\x1b[0m Success    # Green checkmark
\x1b[31m✗\x1b[0m Error      # Red X
\x1b[33mwarn\x1b[0m Warning   # Yellow text
\x1b[1mBold\x1b[0m           # Bold text

Examples

Basic Usage

Streaming Mode

With Clear Button

Props

<Terminal />

outputrequiredstring
Terminal output text (supports ANSI codes).
isStreamingboolean
Show streaming indicator.
autoScrollboolean
Auto-scroll to bottom on new output.
@clear() => void
Callback to clear output (enables clear button).
classstring
Additional CSS classes.

<TerminalHeader />

classstring
Additional CSS classes.

<TerminalTitle />

classstring
Additional CSS classes.

<TerminalStatus />

classstring
Additional CSS classes.

<TerminalActions />

classstring
Additional CSS classes.

<TerminalContent />

classstring
Additional CSS classes.

<TerminalCopyButton />

timeoutnumber
Duration to show copied state (ms).
@copy() => void
Callback after successful copy.
@error(error: Error) => void
Callback if copying fails.

<TerminalClearButton />

...propsButtonProps
Additional props forwarded to the underlying Button component.