Repository: ArthurSonzogni/FTXUI
Stars: 9955
README.md
<p align="center">
<img src="https://github.com/ArthurSonzogni/FTXUI/assets/4759106/6925b6da-0a7e-49d9-883c-c890e1f36007" alt="Demo image"></img>
<br/>
<a href="#"><img src="https://img.shields.io/badge/c++-%2300599C.svg?style=flat&logo=c%2B%2B&logoColor=white"></img></a>
<a href="http://opensource.org/licenses/MIT"><img src="https://img.shields.io/github/license/arthursonzogni/FTXUI?color=black"></img></a>
<a href="#"><img src="https://img.shields.io/github/stars/ArthurSonzogni/FTXUI"></img></a>
<a href="#"><img src="https://img.shields.io/github/forks/ArthurSonzogni/FTXUI"></img></a>
<a href="#"><img src="https://img.shields.io/github/repo-size/ArthurSonzogni/FTXUI"></img></a>
<a href="https://github.com/ArthurSonzogni/FTXUI/graphs/contributors"><img src="https://img.shields.io/github/contributors/arthursonzogni/FTXUI?color=blue"></img></a>
<br/>
<a href="https://github.com/ArthurSonzogni/FTXUI/issues"><img src="https://img.shields.io/github/issues/ArthurSonzogni/FTXUI"></img></a>
<a href="https://repology.org/project/ftxui/versions"><img src="https://repology.org/badge/latest-versions/ftxui.svg" alt="latest packaged version(s)"></a>
<a href="https://codecov.io/gh/ArthurSonzogni/FTXUI">
<img src="https://codecov.io/gh/ArthurSonzogni/FTXUI/branch/master/graph/badge.svg?token=C41FdRpNVA"/>
</a>
<br/>
<a href="https://arthursonzogni.github.io/FTXUI/">Documentation</a> ยท
<a href="https://github.com/ArthurSonzogni/FTXUI/issues">Report a Bug</a> ยท
<a href="https://arthursonzogni.github.io/FTXUI/examples/">Examples</a> .
<a href="https://github.com/ArthurSonzogni/FTXUI/issues">Request Feature</a> ยท
<a href="https://github.com/ArthurSonzogni/FTXUI/pulls">Send a Pull Request</a>
<br/>
Doc:
<a href="https://github.com/ArthurSonzogni/">English</a> |
<a href="https://arthursonzogni.github.io/FTXUI/fr/index.html">Franรงais</a> |
<a href="https://arthursonzogni.github.io/FTXUI/es/index.html">Espaรฑol</a> |
<a href="https://arthursonzogni.github.io/FTXUI/zh-TW/index.html">็น้ซไธญๆ</a> |
<a href="https://arthursonzogni.github.io/FTXUI/zh-CH/index.html">็ฎไฝไธญๆ</a> |
<a href="https://arthursonzogni.github.io/FTXUI/ja/index.html">ๆฅๆฌ่ช</a> |
</p>
FTXUI
<i>Functional Terminal (X) User interface</i>
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
~~~cpp
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>
<details><summary>Layout</summary>
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 flexbox:
</details>
<details><summary>Style</summary>
An element can be decorated using the functions:
- bold
- italic
- dim
- inverted
- underlined
- underlinedDouble
- blink
- strikethrough
- color
- bgcolor
- hyperlink
!image
FTXUI supports the pipe operator. It means: decorator1(decorator2(element)) and element | decorator1 | decorator2 can be used.
</details>
<details><summary>Colors</summary>
FTXUI support every color palette:
</details>
<details><summary>Border and separator</summary>
Use decorator border and element separator() to subdivide your UI:
auto document = vbox({
text("top"),
separator(),
text("bottom"),
}) | border;<details><summary>Text and paragraph</summary>
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);Paragraph example
!ezgif com-gif-maker (4)
</details>
<details><summary>Table</summary>
A class to easily style a table of data.
</details>
<details><summary>Canvas</summary>
Drawing can be made on a Canvas, using braille, block, or simple characters:
Simple example:
!image
Complex examples:
!ezgif com-gif-maker (3)
</details>
#### 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>
<details><summary>Gallery</summary>
Gallery of multiple components. (demo)
</details>
<details><summary>Radiobox</summary>
</details>
<details><summary>Checkbox</summary>
</details>
<details><summary>Input</summary>
</details>
<details><summary>Toggle</summary>
</details>
<details><summary>Slider</summary>
</details>
<details><summary>Menu</summary>
</details>
<details><summary>ResizableSplit</summary>
!ezgif com-gif-maker
</details>
<details><summary>Dropdown</summary>
</details>
<details><summary>Tab</summary>
Vertical:
!ezgif com-gif-maker (1)
Horizontal:
!ezgif com-gif-maker (2)
</details>
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.
- ftxui-navigation-tree
- MarkdownFTXUI: Markdown Editor/Viewer for the terminal.
Project using FTXUI
Feel free to add your projects here:
- json-tui
- git-tui
- rgb-tui
- chrome-log-beautifier
---
- 2048-cpp
- BestEdrOfTheMarket
- Captain's log
- Caravan
- CryptoCalculator
- FTB - tertminal file browser
- FTowerX
- Fallout terminal hacking
- Lazylist
- Memory game
- Path Finder
- Pigeon ROS TUI
- SHOOT!
- StartUp
- Step-Writer
- TUISIC
- Terminal Animation
- TimeAccumulator
- UDP chat
- VerifySN (Fast Hash Tool)
- XJ music
- beagle-config
- cachyos-cli-installer
- eCAL monitor
- ftxuiFileReader
- ftxui_CPUMeter
- hastur
- i3-termdialogs
- inLimbo
- keywords (Play web version :heart:)
- ltuiny
- openJuice
- ostree-tui
- pciex
- resource-monitor
- rw-tui
- simpPRU
- sweeper (Play web version :heart:)
- tabdeeli
- terminal-rain
- tic-tac-toe
- tiles
- todoman
- turing_cmd
- typing-speed-test
- vantage
- x86-64 CPU Architecture Simulation
- C++ Process Manager
cpp-best-practices/game_jam
Several games using the FTXUI have been made during the Game Jam:
- TermBreaker [[Play web version]](https://arthursonzogni.com/TermBreaker/)
- Minesweeper Marathon [[Play web version]](https://barlasgarden.com/minesweeper/index.html)
- 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 = [
# Choose submodules
"@ftxui//:component",
"@ftxui//:dom",
"@ftxui//:screen",
# Or use the single ftxui target (includes all modules)
# "@ftxui//:ftxui",
],
)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
Contributors
<a href="https://github.com/ArthurSonzogni/FTXUI/graphs/contributors">
<img src="https://contrib.rocks/image?repo=ArthurSonzogni/FTXUI" />
</a>