Terminal Animation

PreviousNext

Composable terminal UI primitives with typed command playback, tabbed scenarios, and customizable output rendering.

Download BG
$

Installation

pnpm dlx shadcn@latest add https://cult-ui.com/r/terminal-animation.json

Usage

import { TerminalAnimationRoot, TerminalAnimationContainer, TerminalAnimationWindow, TerminalAnimationContent, TerminalAnimationCommandBar, TerminalAnimationOutput, TerminalAnimationTabList, TerminalAnimationTabTrigger, type TabContent, } from "@/components/ui/terminal-animation" const tabs: TabContent[] = [ { label: "dev", command: "npm run dev", lines: [ { text: " ▲ Next.js 16.1.6", delay: 300 }, { text: " - Local: http://localhost:3000", delay: 200, color: "text-cyan-400" }, ], }, ]
<TerminalAnimationRoot tabs={tabs} defaultActiveTab={0}> <TerminalAnimationContainer> <TerminalAnimationWindow> <TerminalAnimationContent> <TerminalAnimationCommandBar className="font-mono text-sm" /> <TerminalAnimationOutput className="mt-2 space-y-1" /> </TerminalAnimationContent> <TerminalAnimationTabList className="flex gap-2 p-4"> {tabs.map((tab, index) => ( <TerminalAnimationTabTrigger key={tab.label} index={index}> {tab.label} </TerminalAnimationTabTrigger> ))} </TerminalAnimationTabList> </TerminalAnimationWindow> </TerminalAnimationContainer> </TerminalAnimationRoot>

Controlled Tabs

Use activeTab + onActiveTabChange when tab state is managed externally:

const [activeTab, setActiveTab] = useState(1) <TerminalAnimationRoot tabs={tabs} activeTab={activeTab} onActiveTabChange={setActiveTab} > {/* terminal layout */} </TerminalAnimationRoot>

Custom Output Rendering

Use renderLine to fully control how each output line appears:

<TerminalAnimationOutput renderLine={(line, index, visible) => { if (!visible) return null return ( <div className="font-mono text-sm leading-relaxed"> <span className="text-muted-foreground mr-3 select-none">{String(index + 1).padStart(2, "0")}</span> <span className={line.color ?? "text-foreground"}>{line.text || "\u00A0"}</span> </div> ) }} />

API Reference

Data Types

TerminalLine

PropertyTypeDescription
textstringText content for an output line
colorstringOptional utility class for line color
delaynumberDelay (ms) before revealing the next line

TabContent

PropertyTypeDescription
labelstringTab label
commandstringCommand text to animate in the prompt
linesTerminalLine[]Output lines revealed after command typing

TerminalAnimationRoot

PropTypeDefaultDescription
tabsTabContent[]-Data source for command tabs and output
defaultActiveTabnumber0Initial tab index (uncontrolled mode)
activeTabnumber-Controlled active tab index
onActiveTabChange(index: number) => void-Called when tab changes
backgroundImagestring-Optional full-bleed background image URL
alwaysDarkbooleanfalseForces dark terminal theme regardless of page theme

TerminalAnimationWindow

PropTypeDefaultDescription
backgroundColorstring-Inline background color override
minHeightstring"28rem"Minimum height of the terminal area
animateOnVisiblebooleantruePlays slide-up transition when entering viewport

TerminalAnimationCommandBar

PropTypeDefaultDescription
cursorReactNodeblock cursorCustom cursor while command is typing

TerminalAnimationOutput

PropTypeDefaultDescription
renderLine(line, index, visible) => ReactNode-Custom renderer for each output line

TerminalAnimationTabTrigger

PropTypeDefaultDescription
indexnumber-Target tab index
asChildbooleanfalseRenders via Slot to merge props into a custom child

Exports

The component includes a full set of primitives for composition:

  • TerminalAnimationRoot
  • TerminalAnimationBackgroundGradient
  • TerminalAnimationContainer
  • TerminalAnimationWindow
  • TerminalAnimationContent
  • TerminalAnimationBlinkingCursor
  • TerminalAnimationCommandBar
  • TerminalAnimationOutput
  • TerminalAnimationOutputLine
  • TerminalAnimationTrailingPrompt
  • TerminalAnimationTabList
  • TerminalAnimationTabTrigger
  • useTerminalAnimation
  • defaultTerminalTabs