Functional Terminal (X) User interface - A simple C++ library for terminal based user interfaces!
FTXUI
Functional Terminal (X) User interface
A simple 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
 - Cross platform: Linux/MacOS (main target), WebAssembly, Windows (Thanks to contributors!).
 - Learn by examples, and tutorials
 - Multiple packages: CMake FetchContent (preferred), vcpkg, pkgbuild, conan.
 - Good practises: documentation, tests, fuzzers, performance tests, automated CI, automated packaging, etc...
 
Documentation
Operating systems
This is expected to be cross platform. This supports / tests:
- WebAssembly
 - Linux
 - MacOS
 - Windows
 
Example
  vbox({
    hbox({
      text("left") | border,
      text("middle") | border | flex,
      text("right") | border,
    }),
    gauge(0.5) | border,
  });
┌────┐┌───────────────────────────────────────────────────────────────┐┌─────┐
│left││middle                                                         ││right│
└────┘└───────────────────────────────────────────────────────────────┘└─────┘
┌────────────────────────────────────────────────────────────────────────────┐
│██████████████████████████████████████                                      │
└────────────────────────────────────────────────────────────────────────────┘
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>
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 the flex decorator.
Example using hbox, vbox and filler.

Example using gridbox:

Example using flexbox:

An element can be decorated using the functions:
bolddiminvertedunderlinedunderlinedDoubleblinkstrikethroughcolorbgcolor

FTXUI supports the pipe operator. It means: decorator1(decorator2(element)) and element | decorator1 | decorator2 can be used.
FTXUI support every color palette:
Color gallery:

Use decorator border and element separator() to subdivide your UI:
auto document = vbox({
    text("top"),
    separator(),
    text("bottom"),
}) | border;
Demo:

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);

A class to easily style a table of data.

Drawing can be made on a Canvas, using braille, block, or simple characters:
Simple example:

Complex examples:

Component
The ftxui/component is needed when you want to produce dynamic UI, reactive to the user's input. It defines a set of ftxui::Component. A component reacts to Events (keyboard, mouse, resize, ...) and Render Element (see previous section).
Prebuilt components are declared in <ftxui/component/component.hpp>
Gallery of multiple components. (demo)











Project using FTXUI
Feel free to add your projects here:
- json-tui
 - git-tui
 - rgb-tui
 - chrome-log-beautifier
 - x86-64 CPU Architecture Simulation
 - ltuiny
 - i3-termdialogs
 - Just-Fast
 - simpPRU
 - Pigeon ROS TUI
 - hastur
 - CryptoCalculator
 - todoman
 - TimeAccumulator
 - vantage
 - tabdeeli
 - tiles
 - cachyos-cli-installer
 - beagle-config
 - turing_cmd
 - StartUp
 - eCAL monitor
 
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
 
External package
It is highly recommended to use CMake FetchContent to depend on FTXUI. This way you can specify which commit you would like to depend on.
include(FetchContent)
FetchContent_Declare(ftxui
  GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
  GIT_TAG v3.0.0
)
FetchContent_GetProperties(ftxui)
if(NOT ftxui_POPULATED)
  FetchContent_Populate(ftxui)
  add_subdirectory(${ftxui_SOURCE_DIR} ${ftxui_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
If you don't, the following packages have been created:
Contributors
| license | MIT | 
|---|---|
| project | FTXUI | 
| url | arthursonzogni.github.io/FTXUI/ | 
| doc-url | arthursonzogni.github.io/FTXUI/ | 
| src-url | github.com/ArthurSonzogni/FTXUI | 
| topics | C++ | 
| version | 4.0.0 | 
|---|---|
| repository | https://pkg.cppget.org/1/stable | 
| depends | 0 | 
| reviews | +1 | 
| version | 3.0.0+2 | 
|---|---|
| repository | https://pkg.cppget.org/1/stable | 
| depends | 0 | 
| reviews | +1 |