The ultimate lightweight, fully typed, and customizable terminal component for Svelte 5.
Svelte Bash is a high-performance terminal emulator component designed specifically for modern Svelte applications. It provides a realistic shell experience with a virtual file system, command history navigation, and advanced features like autoplay sequences for tutorials.
Note: As of v1.0.1, svelte-bash has been refactored to use Pure Vanilla CSS internally. This means it has ZERO dependencies on Tailwind CSS and will render correctly in any project (including Bootstrap, Tailwind, or plain CSS projects). You do NOT need to install Tailwind.
Whether you are building a developer portfolio, a documentation site, or a web-based CLI tool, Svelte Bash offers the perfect balance of aesthetics and functionality.
mkdir, touch, rm, cp, mv).on:change event to save filesystem state to localStorage.alias ll='ls -la').ls -la, cd, cat, and pwd commands.dracula, matrix, and dark presets, plus full CSS control.npm install svelte-bash
Import the component and pass a structure object to define the virtual file system.
<script>
import { Terminal } from 'svelte-bash';
const fileSystem = {
'readme.md': '# Hello World',
'src': {
'app.js': 'console.log("Hi")'
}
};
</script>
<Terminal
structure={fileSystem}
user="guest"
style="height: 300px"
/>
The terminal now supports file mutation. You can listen to changes to persist them.
<script>
import { Terminal } from 'svelte-bash';
// ... load initial state from localStorage ...
function handleFsChange(event) {
// event.detail contains the new FileStructure
localStorage.setItem('fs', JSON.stringify(event.detail));
}
</script>
<Terminal
structure={initialState}
on:change={handleFsChange}
/>
You can extend the terminal with your own commands or presets.
<script>
import { Terminal } from 'svelte-bash';
const myCommands = {
// Return a string
hello: () => "Hello form svelte-bash!",
// Accept arguments
echo: (args) => args.join(' '),
// Define an alias programmatically
ll: () => "alias ll='ls -la'"
};
</script>
<Terminal commands={myCommands} />
Perfect for documentation or presentations. The terminal will automatically type and execute the provided sequence.
<Terminal
autoplay={[
{ command: "mkdir project" },
{ command: "touch project/index.js", delayAfter: 500 },
{ command: "ls -la" }
]}
typingSpeed={80}
/>
Svelte Bash allows comprehensive styling customization.
Built-in Presets:
dark (default)lightdraculamatrixCustom Theme Object:
<Terminal
theme={{
background: '#1a1b26',
foreground: '#a9b1d6',
prompt: '#7aa2f7',
cursor: '#c0caf5'
}}
/>
| Prop | Type | Default | Description |
|---|---|---|---|
structure |
FileStructure |
{} |
Key-value pairs defining the virtual file system. |
commands |
Record<string, Function> |
{} |
Custom command handlers. |
theme |
string | Theme |
'dark' |
Theme preset name or specific color object. |
user |
string |
'user' |
The username displayed in the prompt. |
machine |
string |
'machine' |
The machine name displayed in the prompt. |
welcomeMessage |
string | string[] |
[] |
Message shown on initialization. |
autoplay |
AutoplayItem[] |
undefined |
Array of commands to execute automatically. |
typingSpeed |
number |
50 |
Default typing speed for autoplay (ms). |
readonly |
boolean |
false |
If true, user input is disabled. |
| Event | Detail | Description |
|---|---|---|
change |
FileStructure |
Fired when the filesystem is modified (mkdir, rm, etc). |
Contributions are welcome! Please feel free to submit a Pull Request.
MIT 漏 Yusuf Cengiz