Svelte
The @wterm/svelte package provides a <Terminal> component for Svelte 5
applications. It re-exports the DOM and core APIs from @wterm/dom so the
component and terminal types can come from one import.
Use <Terminal aria-label="Build shell" aria-describedby="shell-help" /> to name and describe the actual input. Label attributes stay synchronized when they change. The wrapper is a group; input is the single editable control. tabindex={-1} removes input from page tab entry. Press Escape, then Tab to move focus out of the terminal, or Escape, then Shift+Tab to move backward. Use readText() on the WTerm instance to present a stable snapshot of retained output in a labelled, read-only text area; see Reading Terminal Output. See Input Accessibility.
Install
Basic Usage
The WASM binary is embedded in the package — no extra setup is required. To
serve it separately, pass wasmUrl.
Custom Input Handling
Typed input is echoed back by default. In Svelte 5, pass onData when input
should be sent to a PTY or another backend:
onBinary receives raw X10 mouse bytes. Forward its Uint8Array unchanged
when the terminal input transport accepts binary data.
The other callback props are onTitle, onBell, onClipboardWrite, onShellIntegration, onWorkingDirectory, onResize, onReady, and onError.
onReady receives the underlying WTerm instance.
Props
The component accepts the shared terminal options cols, rows, core,
wasmUrl, autoResize, maxImageWidth, maxImageHeight, cursorBlink, announceOutput, renderingPaused, and
debug, plus the theme prop. Standard <div> attributes such as class,
style, id, and ARIA attributes are forwarded to the root element.
See the Terminal Options and Svelte-only Props reference sections for details.
The Svelte wrapper delegates rendering to @wterm/dom, so a graphics-capable
core such as @wterm/ghostty automatically renders direct Kitty PNG/RGB/RGBA
images. Set maxImageWidth and/or maxImageHeight to constrain rendered
images while preserving their aspect ratio.
Imperative Control
Bind the component instance to call write, resize, and focus:
To access the underlying WTerm, bind the instance prop:
Themes
Import the stylesheet and pass the theme name:
Built-in themes are solarized-dark, monokai, and light. Define custom
themes with CSS custom properties.
The component initializes in onMount, so it is safe to render from an SSR
application.
Terminal Search
The underlying WTerm instance exposes full-history search, findNext, findPrevious, getSearchState, and clearSearch. Set its onSearchChange callback to keep Find controls current. Use onReady or bind:instance. See Terminal Search for Unicode behavior, progress, and limits.
Selection and Copy
Native Copy preserves terminal line breaks and complete Unicode cells, joining confirmed Ghostty soft wraps. Call getSelectionText() on the underlying WTerm instance to read that text without writing the clipboard. See Selection and Copy for whitespace behavior, return values, and native-selection limits.
With Ghostty's current WASM binary, selections also follow output scrolling and resize/reflow while their text remains intact. Overwritten or discarded text, resets, and screen switches clear them. The same reference covers preservation limits and pending-frame behavior.
Use await wt.selectAll() on the WTerm instance to select all retained history and the active screen without mounting extra rows, then read wt.getSelectionText(). Cmd+A or Ctrl+Shift+A invokes the same action from terminal input. wt.clearSelection() cancels it. See Select All for capture limits, shortcuts, and when selection clears.
Double-click words or paths, or triple-click logical lines. The WTerm methods selectWord({ row, col }) and selectLine(row) create the same native selection, including confirmed Ghostty soft wraps and unmounted history. See Words and Logical Lines for coordinates, boundaries, and limits.
Alt/Option-drag selects rectangular columns; Shift+Alt selects inside mouse-reporting applications. Call selectRectangle(start, end) on the WTerm instance with inclusive retained-row/cell corners. Rectangles preserve selected spaces and physical row breaks and clear on output or resize. See Rectangular Selection for copy shortcuts, coordinates, and limits.
Output announcements
Opt in with announceOutput to announce terminal text changes politely while
input has focus. The option defaults to false; component prop changes apply
without restarting the terminal, and vanilla callers use
term.setOutputAnnouncements(enabled). Announcements are batched and stop
when focus leaves input. Bursts are bounded to avoid overwhelming the speech
queue. See Output announcements for
capture limits, pause/resume behavior, and redraw semantics.
Inactive panes
Use renderingPaused for panes that are not visible. Parsing and terminal
effects continue, and resuming paints the latest state without restarting.
In vanilla code, call term.setRenderingPaused(paused); framework props are
reactive. Browser document visibility also pauses painting. See
Inactive panes for focus and capture behavior.
Application clipboard writes require an explicit host policy; see Clipboard requests.
Shell integration
With Ghostty, onWorkingDirectory (or onworkingdirectory) receives raw OSC 7
URI reports, including while rendering is paused. An empty string clears the
value. Treat the URI as untrusted metadata; see
Working directories.
With Ghostty and a shell emitting OSC 133, onShellIntegration receives the
latest prompt, input, running, or completion state and the last reported exit
code. Delivery continues while painting is paused; markers in one parser chunk
coalesce into current state. See Shell integration
for the contract, shell setup, and workspace indicators.
Use the underlying WTerm instance’s scrollToPrompt(-1) and
scrollToPrompt(1) methods to navigate previous and next prompts in retained
history. See Shell integration for viewport
behavior, unsupported cores, and inactive states.