Search Documentation

Search for components, guides, and more.

Terminal

A fully-featured terminal emulator component for building command-line interfaces on the web. Supports multiple window states, command history, and customizable prompts.

Examples

Terminal Basics



Installation

pnpm dlx shadcn@latest add https://chatcn.me/c/terminal



Usage

Basic Terminal

import {
  TerminalProvider,
  Terminal,
  TerminalHeader,
  TerminalBody,
  TerminalBodyContent,
  TerminalPrompt,
  TerminalInput,
} from "@/components/chatcn/system/terminal"
 
export default function Example() {
  return (
    <TerminalProvider>
      <Terminal className="h-80">
        <TerminalHeader>
          <span>Terminal</span>
        </TerminalHeader>
        <TerminalBody>
          <TerminalBodyContent
            prompt={
              <TerminalPrompt>
                <span className="text-green-500">user@host</span>
                <span className="text-white">:</span>
                <span className="text-blue-500">~</span>
                <span className="text-white">$</span>
              </TerminalPrompt>
            }
          />
          <div className="flex gap-2 mt-2">
            <TerminalPrompt>
              <span className="text-green-500">user@host</span>
              <span className="text-white">:</span>
              <span className="text-blue-500">~</span>
              <span className="text-white">$</span>
            </TerminalPrompt>
            <TerminalInput />
          </div>
        </TerminalBody>
      </Terminal>
    </TerminalProvider>
  )
}

With Window Controls

import {
  TerminalProvider,
  Terminal,
  TerminalHeader,
  TerminalBody,
  TerminalBodyContent,
  useTerminal,
} from "@/components/chatcn/system/terminal"
 
function WindowControls() {
  const { setTerminalState, terminalState } = useTerminal()
 
  return (
    <div className="flex gap-2">
      <button
        onClick={() => setTerminalState("minimize")}
        className="w-3 h-3 rounded-full bg-yellow-500"
      />
      <button
        onClick={() => setTerminalState(
          terminalState === "maximize" ? "normal" : "maximize"
        )}
        className="w-3 h-3 rounded-full bg-green-500"
      />
    </div>
  )
}
 
export default function Example() {
  return (
    <TerminalProvider>
      <Terminal className="h-80">
        <TerminalHeader className="flex justify-between items-center">
          <span>Terminal</span>
          <WindowControls />
        </TerminalHeader>
        <TerminalBody>
          <TerminalBodyContent />
        </TerminalBody>
      </Terminal>
    </TerminalProvider>
  )
}

Starting Maximized

import { TerminalProvider, Terminal } from "@/components/chatcn/system/terminal"
 
export default function Example() {
  return (
    <TerminalProvider initialState="maximize">
      <Terminal>
        {/* Terminal content */}
      </Terminal>
    </TerminalProvider>
  )
}


Props

TerminalProvider

Wraps your terminal components and provides shared state.

PropTypeDefaultDescription
childrenReactNode-Child components to wrap
initialState"normal" | "minimize" | "maximize""normal"Initial window state

Terminal

The main terminal container component.

PropTypeDefaultDescription
childrenReactNode-Terminal content (header, body, etc.)
classNamestring-Additional CSS classes

TerminalHeader

The terminal header/title bar.

PropTypeDefaultDescription
childrenReactNode-Header content (title, window controls)
classNamestring-Additional CSS classes

TerminalBody

The main content area of the terminal.

PropTypeDefaultDescription
childrenReactNode-Body content
classNamestring-Additional CSS classes

TerminalBodyContent

Displays command history with automatic scroll-to-bottom.

PropTypeDefaultDescription
classNamestring-Additional CSS classes
promptReactNode-Custom prompt element to display before each command

TerminalPrompt

A styled container for prompt elements.

PropTypeDefaultDescription
childrenReactNode-Prompt content
classNamestring-Additional CSS classes

TerminalInput

An input field for entering commands.

No props required - automatically connects to terminal context.

Hooks

useTerminal

Access the terminal context from any child component:

const {
  terminalState,      // Current window state
  setTerminalState,   // Change window state
  terminalHistory,    // Array of command entries
  setTerminalHistory, // Update history
} = useTerminal()

Built-in Commands

The terminal includes some default commands:

CommandDescription
helpDisplay available commands
whoamiDisplay user information
clearClear terminal history