# Copyright 2025 Arthur Sonzogni. All rights reserved. # Use of this source code is governed by the MIT license that can be found in # the LICENSE file. # TODO: # - Build benchmark. # - Build fuzzers. # - Build documentation. # - Enable the two tests timing out. # - Support WebAssembly load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") load(":bazel/ftxui.bzl", "ftxui_cc_library") load(":bazel/ftxui.bzl", "generate_examples") load(":bazel/ftxui.bzl", "cpp20") load(":bazel/ftxui.bzl", "windows_copts") load(":bazel/ftxui.bzl", "pthread_linkopts") package(default_visibility = ["//visibility:public"]) # A meta target that depends on all the ftxui sub modules. alias( name = "ftxui", # Note that :component depends on :dom, which depends on :screen. Bazel # doesn't really support "public" and "private" dependencies. They are all # public. This is equivalent to depending on all the submodules. actual = ":component", visibility = ["//visibility:public"], ) # ftxui:screen is a module that provides a screen buffer and color management # for terminal applications. A screen is a 2D array of cells, each cell can # contain a glyph, a color, and other attributes. The library also provides # functions to manipulate the screen. ftxui_cc_library( name = "screen", srcs = [ "src/ftxui/screen/box.cpp", "src/ftxui/screen/color.cpp", "src/ftxui/screen/color_info.cpp", "src/ftxui/screen/image.cpp", "src/ftxui/screen/screen.cpp", "src/ftxui/screen/string.cpp", "src/ftxui/screen/string_internal.hpp", "src/ftxui/screen/terminal.cpp", "src/ftxui/screen/util.hpp", ], hdrs = [ "include/ftxui/screen/box.hpp", "include/ftxui/screen/color.hpp", "include/ftxui/screen/color_info.hpp", "include/ftxui/screen/deprecated.hpp", "include/ftxui/screen/image.hpp", "include/ftxui/screen/pixel.hpp", "include/ftxui/screen/screen.hpp", "include/ftxui/screen/string.hpp", "include/ftxui/screen/terminal.hpp", "include/ftxui/util/autoreset.hpp", "include/ftxui/util/ref.hpp", ], ) # ftxui:dom is a library that provides a way to create and manipulate a # "document" that can be rendered to a screen. The document is a tree of nodes. # Nodes can be text, layouts, or various decorators. Users needs to compose # nodes to create a document. A document is responsive to the size of the # screen. ftxui_cc_library( name = "dom", srcs = [ "src/ftxui/dom/automerge.cpp", "src/ftxui/dom/blink.cpp", "src/ftxui/dom/bold.cpp", "src/ftxui/dom/border.cpp", "src/ftxui/dom/box_helper.cpp", "src/ftxui/dom/box_helper.hpp", "src/ftxui/dom/canvas.cpp", "src/ftxui/dom/clear_under.cpp", "src/ftxui/dom/color.cpp", "src/ftxui/dom/composite_decorator.cpp", "src/ftxui/dom/dbox.cpp", "src/ftxui/dom/dim.cpp", "src/ftxui/dom/flex.cpp", "src/ftxui/dom/flexbox.cpp", "src/ftxui/dom/flexbox_config.cpp", "src/ftxui/dom/flexbox_helper.cpp", "src/ftxui/dom/flexbox_helper.hpp", "src/ftxui/dom/focus.cpp", "src/ftxui/dom/frame.cpp", "src/ftxui/dom/gauge.cpp", "src/ftxui/dom/graph.cpp", "src/ftxui/dom/gridbox.cpp", "src/ftxui/dom/hbox.cpp", "src/ftxui/dom/hyperlink.cpp", "src/ftxui/dom/inverted.cpp", "src/ftxui/dom/italic.cpp", "src/ftxui/dom/linear_gradient.cpp", "src/ftxui/dom/node.cpp", "src/ftxui/dom/node_decorator.cpp", "src/ftxui/dom/node_decorator.hpp", "src/ftxui/dom/paragraph.cpp", "src/ftxui/dom/reflect.cpp", "src/ftxui/dom/scroll_indicator.cpp", "src/ftxui/dom/selection.cpp", "src/ftxui/dom/selection_style.cpp", "src/ftxui/dom/separator.cpp", "src/ftxui/dom/size.cpp", "src/ftxui/dom/spinner.cpp", "src/ftxui/dom/strikethrough.cpp", "src/ftxui/dom/table.cpp", "src/ftxui/dom/text.cpp", "src/ftxui/dom/underlined.cpp", "src/ftxui/dom/underlined_double.cpp", "src/ftxui/dom/util.cpp", "src/ftxui/dom/vbox.cpp", ], hdrs = [ "include/ftxui/dom/canvas.hpp", "include/ftxui/dom/deprecated.hpp", "include/ftxui/dom/direction.hpp", "include/ftxui/dom/elements.hpp", "include/ftxui/dom/flexbox_config.hpp", "include/ftxui/dom/linear_gradient.hpp", "include/ftxui/dom/node.hpp", "include/ftxui/dom/requirement.hpp", "include/ftxui/dom/selection.hpp", "include/ftxui/dom/table.hpp", "include/ftxui/dom/take_any_args.hpp", ], deps = [":screen"], ) # ftxui:component is a library to create "dynamic" component renderering and # updating a ftxui::dom document on the screen. It is a higher level API than # ftxui:dom. # # The module is required if your program needs to respond to user input. It # defines a set of ftxui::Component. These components can be utilized to # navigate using the arrow keys and/or cursor. There are several builtin widgets # like checkbox/inputbox/etc to interact with. You can combine them, or even # define your own custom components. ftxui_cc_library( name = "component", srcs = [ "src/ftxui/component/animation.cpp", "src/ftxui/component/button.cpp", "src/ftxui/component/catch_event.cpp", "src/ftxui/component/checkbox.cpp", "src/ftxui/component/collapsible.cpp", "src/ftxui/component/component.cpp", "src/ftxui/component/component_options.cpp", "src/ftxui/component/container.cpp", "src/ftxui/component/dropdown.cpp", "src/ftxui/component/event.cpp", "src/ftxui/component/hoverable.cpp", "src/ftxui/component/input.cpp", "src/ftxui/component/loop.cpp", "src/ftxui/component/maybe.cpp", "src/ftxui/component/menu.cpp", "src/ftxui/component/modal.cpp", "src/ftxui/component/radiobox.cpp", "src/ftxui/component/renderer.cpp", "src/ftxui/component/resizable_split.cpp", "src/ftxui/component/screen_interactive.cpp", "src/ftxui/component/slider.cpp", "src/ftxui/component/terminal_input_parser.cpp", "src/ftxui/component/terminal_input_parser.hpp", "src/ftxui/component/util.cpp", "src/ftxui/component/window.cpp", ], hdrs = [ "include/ftxui/component/animation.hpp", "include/ftxui/component/captured_mouse.hpp", "include/ftxui/component/component.hpp", "include/ftxui/component/component_base.hpp", "include/ftxui/component/component_options.hpp", "include/ftxui/component/event.hpp", "include/ftxui/component/loop.hpp", "include/ftxui/component/mouse.hpp", "include/ftxui/component/receiver.hpp", "include/ftxui/component/screen_interactive.hpp", "include/ftxui/component/task.hpp", ], linkopts = pthread_linkopts(), deps = [":dom"], ) # FTXUI's tests cc_test( name = "tests", testonly = True, srcs = [ "src/ftxui/component/animation_test.cpp", "src/ftxui/component/button_test.cpp", "src/ftxui/component/collapsible_test.cpp", "src/ftxui/component/component_test.cpp", "src/ftxui/component/container_test.cpp", "src/ftxui/component/dropdown_test.cpp", "src/ftxui/component/hoverable_test.cpp", "src/ftxui/component/input_test.cpp", "src/ftxui/component/menu_test.cpp", "src/ftxui/component/modal_test.cpp", "src/ftxui/component/radiobox_test.cpp", "src/ftxui/component/receiver_test.cpp", "src/ftxui/component/resizable_split_test.cpp", "src/ftxui/component/slider_test.cpp", "src/ftxui/component/terminal_input_parser_test.cpp", "src/ftxui/component/terminal_input_parser_test_fuzzer.cpp", "src/ftxui/component/toggle_test.cpp", "src/ftxui/dom/blink_test.cpp", "src/ftxui/dom/bold_test.cpp", "src/ftxui/dom/border_test.cpp", "src/ftxui/dom/canvas_test.cpp", "src/ftxui/dom/color_test.cpp", "src/ftxui/dom/dbox_test.cpp", "src/ftxui/dom/dim_test.cpp", "src/ftxui/dom/flexbox_helper_test.cpp", "src/ftxui/dom/flexbox_test.cpp", "src/ftxui/dom/gauge_test.cpp", "src/ftxui/dom/gridbox_test.cpp", "src/ftxui/dom/hbox_test.cpp", "src/ftxui/dom/hyperlink_test.cpp", "src/ftxui/dom/italic_test.cpp", "src/ftxui/dom/linear_gradient_test.cpp", "src/ftxui/dom/scroll_indicator_test.cpp", "src/ftxui/dom/separator_test.cpp", "src/ftxui/dom/spinner_test.cpp", "src/ftxui/dom/table_test.cpp", "src/ftxui/dom/text_test.cpp", "src/ftxui/dom/underlined_test.cpp", "src/ftxui/dom/vbox_test.cpp", "src/ftxui/screen/color_test.cpp", "src/ftxui/screen/string_test.cpp", "src/ftxui/util/ref_test.cpp", # TODO: Enable the two tests timing out with Bazel: # - "src/ftxui/component/screen_interactive_test.cpp", # - "src/ftxui/dom/selection_test.cpp", ], includes = [ "include", "src", ], copts = cpp20() + windows_copts(), deps = [ "//:ftxui", "@googletest//:gtest_main", ], ) generate_examples()