💻 C++ Functional Terminal User Interface. ❤️
Go to file
Arthur Sonzogni b78b97056b
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. (#1073)
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
2025-07-02 15:23:01 +02:00
.bcr Bazel: general improvements. (#1043) 2025-05-07 22:41:17 +02:00
.github Add modules support (#1015) 2025-06-04 15:02:20 +02:00
bazel Bazel: general improvements. (#1043) 2025-05-07 22:41:17 +02:00
cmake Add modules support (#1015) 2025-06-04 15:02:20 +02:00
doc Add docs for additional install methods (#1059) 2025-06-05 12:13:41 +02:00
examples Stop using Sender/Receiver in TerminalInputParser. (#1073) 2025-07-02 15:23:01 +02:00
include/ftxui Stop using Sender/Receiver in TerminalInputParser. (#1073) 2025-07-02 15:23:01 +02:00
src/ftxui Stop using Sender/Receiver in TerminalInputParser. (#1073) 2025-07-02 15:23:01 +02:00
tools Add modules support (#1015) 2025-06-04 15:02:20 +02:00
.bazelrc Bazel: general improvements. (#1043) 2025-05-07 22:41:17 +02:00
.clang-format Variou details: 2020-08-28 23:54:25 +02:00
.clang-tidy Apply Clang-tidy (#918) 2024-08-16 11:19:51 +02:00
.gitignore Add modules support (#1015) 2025-06-04 15:02:20 +02:00
BUILD.bazel Bazel: general improvements. (#1043) 2025-05-07 22:41:17 +02:00
CHANGELOG.md Fix ScreenInteractive::FixedSize screen stomps on the history terminal output (#1064) 2025-06-20 15:59:36 +02:00
CMakeLists.txt Add modules support (#1015) 2025-06-04 15:02:20 +02:00
codecov.yml Bring back C++17 minimal requirement. (#475) 2022-09-03 13:03:04 +02:00
flake.lock update nix and add dev shell (#769) 2023-10-23 08:48:50 +02:00
flake.nix update nix and add dev shell (#769) 2023-10-23 08:48:50 +02:00
ftxui.pc.in Add pkg-config file. (#642) 2023-05-17 10:50:47 +02:00
iwyu.imp Feature: hyperlink support. (#665) 2023-06-04 21:06:19 +02:00
LICENSE Add LICENSE. Add take_any_args. 2019-01-06 16:14:19 +01:00
MODULE.bazel v6.1.9 2025-05-07 22:43:27 +02:00
README.md Add docs for additional install methods (#1059) 2025-06-05 12:13:41 +02:00
WORKSPACE.bazel Support Bazel build system (#1033) 2025-04-29 15:11:10 +02:00

Demo image

latest packaged version(s)
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

Documentation

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

image

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.

image

Example using gridbox:

image

Example using flexbox:

image

See also this demo.

Style

An element can be decorated using the functions:

  • bold
  • italic
  • dim
  • inverted
  • underlined
  • underlinedDouble
  • blink
  • strikethrough
  • color
  • bgcolor
  • hyperlink

Example

image

FTXUI supports the pipe operator. It means: decorator1(decorator2(element)) and element | decorator1 | decorator2 can be used.

Colors

FTXUI support every color palette:

Color gallery: image

Border and separator

Use decorator border and element separator() to subdivide your UI:

auto document = vbox({
    text("top"),
    separator(),
    text("bottom"),
}) | border;

Demo:

image

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

Paragraph example

ezgif com-gif-maker (4)

Table

A class to easily style a table of data.

Example:

image

Canvas

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

Simple example:

image

Complex examples:

ezgif com-gif-maker (3)

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>

Gallery

Gallery of multiple components. (demo)

image

Radiobox

Example:

image

Checkbox

Example:

image

Input

Example:

image

Toggle

Example:

image

Slider

Example:

image

Menu

Example:

image

ResizableSplit

Example:

ezgif com-gif-maker

Dropdown

Example:

youtube-video-gif (3)

Tab

Vertical:

ezgif com-gif-maker (1)

Horizontal:

ezgif com-gif-maker (2)

Libraries for FTXUI

Project using FTXUI

Feel free to add your projects here:

cpp-best-practices/game_jam

Several games using the FTXUI have been made during the Game Jam:

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:

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