![]()
Some checks failed
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (cl, cl, windows-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, ubuntu-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Has been cancelled
Build / Test modules (llvm, ubuntu-latest) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
Stop using Sender/Receiver in TerminalInputParser. This will help removing usage of thread. At some point, my goal is to have an initialization step when installing the ScreenInteractive so that we can provide the terminal ID synchronously without losing some events. This will help with: https://github.com/ArthurSonzogni/FTXUI/pull/1069 |
||
---|---|---|
.bcr | ||
.github | ||
bazel | ||
cmake | ||
doc | ||
examples | ||
include/ftxui | ||
src/ftxui | ||
tools | ||
.bazelrc | ||
.clang-format | ||
.clang-tidy | ||
.gitignore | ||
BUILD.bazel | ||
CHANGELOG.md | ||
CMakeLists.txt | ||
codecov.yml | ||
flake.lock | ||
flake.nix | ||
ftxui.pc.in | ||
iwyu.imp | ||
LICENSE | ||
MODULE.bazel | ||
README.md | ||
WORKSPACE.bazel |
Documentation ·
Report a Bug ·
Examples .
Request Feature ·
Send a Pull Request
FTXUI
Functional Terminal (X) User interface
A simple cross-platform C++ library for terminal based user interfaces!
Feature
- Functional style. Inspired by 1 and React
- Simple and elegant syntax (in my opinion)
- Keyboard & mouse navigation.
- Support for UTF8 and fullwidth chars (→ 测试)
- Support for animations. Demo 1, Demo 2
- Support for drawing. Demo
- No dependencies.
- C++20 Module support
- Cross platform: Linux/MacOS (main target), WebAssembly, Windows (Thanks to contributors!).
- Learn by examples, and tutorials
- Multiple packages:
- CMake FetchContent (preferred)
- Bazel
- vcpkg
- Conan Debian package
- Ubuntu package
- Arch Linux
- OpenSUSE
- XMake repository package
- Nix
- Good practices: documentation, tests, fuzzers, performance tests, automated CI, automated packaging, etc...
Documentation
- Starter CMake
- Starter Bazel
- Documentation
- Examples (WebAssembly)
- Build using CMake
- Build using Bazel
Example
vbox({
hbox({
text("one") | border,
text("two") | border | flex,
text("three") | border | flex,
}),
gauge(0.25) | color(Color::Red),
gauge(0.50) | color(Color::White),
gauge(0.75) | color(Color::Blue),
});
Short gallery
DOM
This module defines a hierarchical set of Element. An Element manages layout and can be responsive to the terminal dimensions.
They are declared in <ftxui/dom/elements.hpp>
Layout
Element can be arranged together:
- horizontally with
hbox
- vertically with
vbox
- inside a grid with
gridbox
- wrap along one direction using the
flexbox
.
Element can become flexible using the flex
decorator.
Example using hbox
, vbox
and filler
.
Example using gridbox:
Example using flexbox:
Style
An element can be decorated using the functions:
bold
italic
dim
inverted
underlined
underlinedDouble
blink
strikethrough
color
bgcolor
hyperlink
FTXUI supports the pipe operator. It means: decorator1(decorator2(element))
and element | decorator1 | decorator2
can be used.
Border and separator
Use decorator border and element separator() to subdivide your UI:
auto document = vbox({
text("top"),
separator(),
text("bottom"),
}) | border;
Demo:
Text and paragraph
A simple piece of text is represented using text("content")
.
To support text wrapping following spaces the following functions are provided:
Element paragraph(std::string text);
Element paragraphAlignLeft(std::string text);
Element paragraphAlignRight(std::string text);
Element paragraphAlignCenter(std::string text);
Element paragraphAlignJustify(std::string text);
Canvas
Drawing can be made on a Canvas, using braille, block, or simple characters:
Simple example:
Complex examples:
Component
ftxui/component produces dynamic UI, reactive to the user's input. It defines a set of ftxui::Component. A component reacts to Events (keyboard, mouse, resize, ...) and Renders as an Element (see previous section).
Prebuilt components are declared in <ftxui/component/component.hpp>
Libraries for FTXUI
- Want to share a useful Component for FTXUI? Feel free to add yours here
- ftxui-grid-container
- ftxui-ip-input
- ftxui-image-view: For Image Display.
Project using FTXUI
Feel free to add your projects here:
- json-tui
- git-tui
- ostree-tui
- rgb-tui
- chrome-log-beautifier
- x86-64 CPU Architecture Simulation
- ltuiny
- i3-termdialogs
- simpPRU
- Pigeon ROS TUI
- hastur
- CryptoCalculator
- todoman
- TimeAccumulator
- vantage
- tabdeeli
- tiles
- cachyos-cli-installer
- beagle-config
- turing_cmd
- StartUp
- eCAL monitor
- Path Finder
- rw-tui
- resource-monitor
- ftxuiFileReader
- ftxui_CPUMeter
- Captain's log
- FTowerX
- Caravan
- Step-Writer
- XJ music
- UDP chat
- 2048-cpp
- Memory game
- Terminal Animation
- pciex
- Fallout terminal hacking
- Lazylist
- TUISIC
- inLimbo
- BestEdrOfTheMarket
- terminal-rain
- keywords (Play web version ❤️)
- FTB - tertminal file browser
- openJuice
- SHOOT!
cpp-best-practices/game_jam
Several games using the FTXUI have been made during the Game Jam:
- TermBreaker **[Play web version]**
- Minesweeper Marathon **[Play web version]**
- Grand Rounds
- LightsRound
- DanteO
- Sumo
- Drag Me aROUND
- DisarmSelfDestruct
- TheWorld
- smoothlife
- Consu
Build using CMake
It is highly recommended to use CMake FetchContent to depend on FTXUI so you may specify which commit you would like to depend on.
include(FetchContent)
FetchContent_Declare(ftxui
GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
GIT_TAG v6.1.9
)
FetchContent_MakeAvailable(ftxui)
target_link_libraries(your_target PRIVATE
# Chose a submodule
ftxui::component
ftxui::dom
ftxui::screen
)
Build using Bazel
MODULE.bazel
bazel_dep(
name = "ftxui",
version = "v6.1.9",
)
BUILD.bazel
cc_binary(
name = "your_target",
srcs = ["your_source.cc"],
deps = [
"@ftxui//:ftxui_component",
"@ftxui//:ftxui_dom",
"@ftxui//:ftxui_screen",
],
)
Build with something else:
If you don't, FTXUI may be used from the following packages:
- CMake FetchContent (preferred),
- Bazel,
- vcpkg,
- Conan
- Debian package,
- Ubuntu package,
- Arch Linux,
- OpenSUSE,
Nix,
If you choose to build and link FTXUI yourself, ftxui-component
must be first in the linking order relative to the other FTXUI libraries, i.e.
g++ . . . -lftxui-component -lftxui-dom -lftxui-screen . . .
To build FTXUI with modules, check documentation