Simple Deno module that allows easy creation of Terminal User Interfaces.
Operating system | Linux | macOS | Windowsยน | WSL |
---|---|---|---|---|
Base | โ๏ธ | โ๏ธ | โ๏ธ | โ๏ธ |
Keyboard support | โ๏ธ | โ๏ธ | โ๏ธ | โ๏ธ |
Mouse support | โ๏ธ | โ๏ธ | โ๏ธ | โ๏ธ |
Required permissions | none | none | none | none |
ยน - If unicode characters are displayed incorrectly type chcp 65001
into the console to change active console code
page to use UTF-8 encoding.
import { crayon } from "https://deno.land/x/crayon@$MODULE_VERSION/mod.ts";
import { Canvas, Tui } from "https://deno.land/x/tui@$MODULE_VERSION/mod.ts";
const tui = new Tui({
style: crayon.bgBlack, // Make background black
refreshRate: 1000 / 60, // Run in 60FPS
});
tui.dispatch(); // Close Tui on CTRL+C
import { handleInput, handleKeyboardControls, handleMouseControls } from "https://deno.land/x/tui@$MODULE_VERSION/mod.ts";
...
handleInput(tui);
handleMouseControls(tui);
handleKeyboardControls(tui);
import { Button } from "https://deno.land/x/tui@$MODULE_VERSION/src/components/mod.ts";
import { Signal, Computed } from "https://deno.land/x/tui@$MODULE_VERSION/mod.ts";
...
// Create signal to make number automatically reactive
const number = new Signal(0);
const button = new Button({
parent: tui,
zIndex: 0,
label: {
text: new Computed(() => number.value.toString()), // cast number to string
},
theme: {
base: crayon.bgRed,
focused: crayon.bgLightRed,
active: crayon.bgYellow,
},
rectangle: {
column: 1,
row: 1,
height: 5,
width: 10,
},
});
// If button is active (pressed) make number bigger by one
button.state.when("active", (state) => {
++number.value;
});
// Listen to mousePress event
button.on("mousePress", ({ drag, movementX, movementY }) => {
if (!drag) return;
// Use peek() to get signal's value when it happens outside of Signal/Computed/Effect
const rectangle = button.rectangle.peek();
// Move button by how much mouse has moved while dragging it
rectangle.column += movementX;
rectangle.row += movementY;
});
...
tui.run();
Tui is open for any contributions.
If you feel like you can enhance this project - please open an issue and/or pull request.
Code should be well document and easy to follow what's going on.
This project follows conventional commits spec.
If your pull request's code can be hard to understand, please add comments to it.
This project is available under MIT License conditions.