# 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", "windows_copts") load(":bazel/ftxui.bzl", "pthread_linkopts") # A meta target depending on all of the ftxui submodules. # Note that component depends on dom and screen, so ftxui is just an alias for # component. # ┌component──┐ # │┌dom──────┐│ # ││┌screen─┐││ # └┴┴───────┴┴┘ alias(name = "ftxui", actual = ":component") # @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", # Private header from ftxui:dom. "src/ftxui/dom/node_decorator.hpp", # Private header from ftxui:screen. "src/ftxui/screen/string_internal.hpp", "src/ftxui/screen/util.hpp", ], 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", ":screen", ], ) # 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/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", # Private header from ftxui:screen for string_test.cpp. "src/ftxui/screen/string_internal.hpp", # Private header from ftxui::component for # terminal_input_parser_test.cpp. "src/ftxui/component/terminal_input_parser.hpp", # Private header from ftxui::dom for # flexbox_helper_test.cpp. "src/ftxui/dom/flexbox_helper.hpp", # 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 = windows_copts(), deps = [ ":screen", ":dom", ":component", "@googletest//:gtest", "@googletest//:gtest_main", ], ) generate_examples()