Changes for version 0.01 - 2026-10-11

  • First release. Full-screen terminal user interfaces from a tree of widgets, built in Perl or in a KDL layout file, laid out by Clay (through Clay::UI) and drawn with 24-bit colors through termbox2. Key presses, mouse clicks, wheel scrolling and resizes arrive as events; keyboard focus moves with Tab and the mouse.
  • Widgets: boxes, text and rich text with styled spans, scroll boxes and virtual lists, text fields and areas, buttons, check boxes, radio groups, dropdowns, sliders, star ratings, segmented controls, tables, tabs, accordions, dividers, dialogs, toasts, progress bars, spinners, canvases, pixel canvases, images and sixel pictures.
  • Charts drawn from data: line, area, bar and scatter charts, histograms, sparklines, pie, donut, polar area and radar charts.
  • Application widgets: menus, a menu bar, a status bar, prompts, a command table with key bindings, a key reference, file dialogs, color pickers and document tabs.
  • Themes in KDL files, with a theme editor.
  • An inline mode that uses a few rows below the shell's output instead of the whole screen.
  • Term::Fabulous::Static prints a widget tree once as text, with or without colors, and Term::Fabulous::Terminal::Memory runs whole programs in tests without a terminal.

Documentation

Edit Term::Fabulous themes with a live preview
Recipes for common Term::Fabulous tasks
Recipes: draw on a canvas
Recipes: curves, markers, colors, line styles and hover of charts
Recipes: time axes, live data, transforms, KDL and reports with charts
Recipes: one for each chart type
Recipes: your own widgets and events
Recipes: forms, dialogs and input widgets
Recipes: a first program, quitting and text
Recipes: key bindings and buttons
Recipes: layout, borders, colors and themes
Recipes: timers, logs and the output of commands
Recipes: menu bars, context menus, status bars, help screens and document tabs
Recipes: reports and tests without a terminal
Recipes: sort, filter, group, nest and page table rows
Recipes: column sizes, lines and colors of tables
Recipes: show, format, edit and print tables
The example programs of the distribution, with pictures
The Term::Fabulous user guide
Canvases and charts
Writing your own widgets
Events, keyboard, focus, mouse and scrolling
Progress bars, spinners, toasts, status bars, prompts and file dialogs
Forms and input widgets
The terms used in the Term::Fabulous documentation
KDL layout files
Widgets, the widget tree and layout
Text, colors and borders
Commands, menu bars, context menus and key references
The event loop, output without a terminal and testing
Tables: sorting, filtering, grouping, trees, pages and selection
Tables: colors, lines, size and printing
Tables: how they work, rows, columns, display text and cell widgets
Solutions to common problems

Modules

Full-screen terminal user interfaces with layouts, widgets, keyboard and mouse
How lines connect the points of a series
Easing functions for the curves of charts
Number and date labels of charts
The character sets charts draw with
Color palettes and color arithmetic for the chart widgets
Geometry of round charts in terminal cells
A drawing surface with several subpixels per terminal cell
What the scales of chart axes have in common
An axis of named categories
A numeric axis with evenly spaced ticks
A logarithmic numeric axis
A date and time axis
One data series of an XY chart
The cells of a chart while it is drawn
Prepare the data of a chart series: normalize, smooth, accumulate, resample
Validate the values of widget properties
An immutable RGBA color, parsed from many notations
Something the user can do, with a name and keys
The commands of a program, and the keys that run them
Text, cursor, selection, undo and clipboard of a text input
The border styles a widget can be drawn with
The CSS named colors as Term::Fabulous::Color objects
The user activated a button
The user answered a prompt or a file dialog
A canvas got a new size
The user changed the value of an input widget
The user chose an item of a menu
A dialog, a toast or a popup menu went away
The user closed a row or a group of a table
The user chose which columns of a table are shown
The cursor of a table moved to another line
The user opened a row or a group of a table
The user typed into a filter field of a table
A key press from the terminal
The user followed a link of a RichText
A mouse click, release, drag or wheel turn from the terminal
The mouse pointer moved with no button held
The user turned the page of a table or changed its page size
The terminal changed size
The user activated a row of a table
The user opened or closed an item of an accordion, or chose a tab
The user changed which rows of a table are selected
The mouse moved onto another series, point or slice of a chart
The user changed how a table is sorted
The terminal is open and its size is known
The user pressed Enter in a text field
The user asked for a new document tab
The user asked to close a document tab
A mouse button pressed on a character of a text
The value of an input widget became valid or invalid
Build a widget tree from a KDL layout description
The options of a choice and the one selected
A value in a range, on a grid of steps
Role that paints Clay render commands into terminal cells
Turn colors into termbox2 truecolor attributes
Paint widget borders in their border styles
Paint canvas widgets, only their changed cells when possible
What one frame paints, command by command
Snap Clay's layout boxes to terminal cells, and step lines through a raster
Paint widget backgrounds
Cell target that keeps the painted cells in memory
Base role of the cell targets: protect kept cells during a frame
Role of the cell targets that show sixel pictures
Paint lines of text
Let a widget class be built from a KDL layout
Border glyphs per side, and borders that take space
A widget whose options come from a layout
A widget whose range comes from a layout in one piece
Named data series of a chart
What Term::Fabulous needs from a terminal
How a widget reads its colors and borders from the theme
An input widget whose value can be checked
Which entry an arrow key moves to
Render a widget tree to text once, without a terminal
termbox2 compiled into Term::Fabulous
One termbox2 input event
A terminal in memory, for tests
The real terminal, through termbox2
Cell target that paints into the terminal through termbox2
Parse "[bold red]text[/]" markup into text, styled spans and links
Parse style strings such as "bold red on #202020"
Lay out the text of an editor in a view of rows and columns
Colors and borders for every widget, with variants per class
A theme file you can read, check and change, keeping its comments and layout
Edit Term::Fabulous themes with a live preview of every widget
The form mode of the theme editor
The text area of the theme editor's text mode
The gallery of widgets in the theme editor's preview
The table of settings in the theme editor's form
A theme open in the theme editor
The UI of the theme editor, with a preview in another theme
The dialog that edits one setting in the theme editor
Measure text in terminal cells, exactly as termbox2 draws it
Checks the value of an input widget
The arithmetic of a scrolled view
Abstract base class of the Term::Fabulous container widgets
Sections that open and close under their headers
One section of an accordion
Lines with the area below them filled
Values as bars, grouped, stacked or horizontal
The general-purpose container widget
A box that can be clicked, focused and activated
A widget you draw on cell by cell
What all chart widgets have in common: title, legend, colors and hover
A box the user can check and uncheck
A field, sliders and swatches for choosing a color
A box that opens over the whole screen and keeps the focus
The screen-filling layer behind an open dialog
Common base class of the widgets that paint themselves from their own state
A line between widgets, with an optional text
A row of tabs for the open documents of a program
A pie chart with a hole
Choose one of several options from a list that opens
The option list of an open dropdown
The Clay::UI roles behind Term::Fabulous::Widget
A dialog that asks for a file to open or save, or for a folder
The line that names the folder a file dialog shows, and its message line
The focus role behind Term::Fabulous::Widget::RichText
How values are distributed: counts in bins
Show a picture in half-block pixels
Common base class of the input widgets
A dialog that lists the keys of a program and what they do
A chart of lines through data points
A list of commands, as a context menu, in a menu bar or on its own
A row of menus at the top of the screen
A pie chart: parts of a whole as slices
A canvas of square-ish pixels, two per cell
Slices of equal angle whose length shows their value
How much of a task is done
A dialog that asks a question and waits for the answer
Several values per series on axes around a center
One choice of a radio group
A group of radio buttons of which one is selected
Text with styled spans and links: bold words, colored phrases, highlighted ranges, links to follow
Points by two numbers, with trend lines
A box whose content scrolls
A scrollbar for a scroll container
Choose one of a few options shown side by side
Show a picture in sixel graphics
Choose a number from a range by moving a thumb
A small chart without axes, one row high
Show that something is going on
Rate something with a row of stars
A row at the bottom of the screen for messages and the program's state
Rows and columns with sorting, filtering, grouping, trees, pages and selection
Work out the grid lines of a table
What a table column shows and how
The list where the user picks the columns of a table
Conditions that decide which rows a table shows
A frame around a table that shows its focus
The header of a table, scrolled sideways with its body
The rows of a table and how it shows them
Ready-made mutators for table columns
The page controls below a table
Check the style hashes of a table
The marker that opens and closes a row or group of a table
Read numbers and dates from table values
Pages behind a row of tabs
A row of tabs, one of them active
The button of one tab in a tab bar
The line that joins the tabs of a bar with the page
One page of a Tabs widget
A piece of text inside a box
Multi-line text input
Single-line text input
Common base class of the text input widgets
The Clay::UI text role behind Term::Fabulous::Widget::Text
A notification that appears in a corner and goes away by itself
The column of toasts in one corner of the screen
A ScrollBox that attaches only the items near the viewport
The common base of charts with an x and a y axis

Examples