## Terminal::UI

A framework for building terminal interfaces.

## Example

Create a box in full screen with some text in it, wait for a key, then exit:

    use Terminal::UI 'ui';
    ui.setup(:1pane);
    ui.pane.put("Hello world.");
    ui.get-key;
    ui.shutdown;

    ������������������������������������������������
    ���Hello world.  ���
    ���              ���
    ������������������������������������������������

## Example 2

Make a screen split with a line in the middle, with scrollable text on the top
and bottom, and a selected row in the top box.  The arrow keys (or j,k) move
the selected line up and down.  Tab switches to the other box.

    use Terminal::UI 'ui';
    ui.setup(:2panes);
    ui.panes[0].put("$_") for 1..10;
    ui.panes[1].put("$_") for <hello world>;
    ui.interact;
    ui.shutdown;

    ������������������������������������������������
    ���8             ���  <- selected in green, scrollable
    ���9             ���
    ���10            ���
    ������������������������������������������������
    ���hello         ���  <- selected in grey.
    ���world         ���
    ������������������������������������������������

## Example 3

Like example 2, but also -- pressing Enter in the top box
will some text about add the currently selected row to the 
bottom box:

    ui.setup(:2panes);
    ui.panes[0].put("$_") for 1..10;

    ui.panes[0].on: select => -> :$raw, :$meta {
      ui.panes[1].put("you chose $raw!")
    }

    ui.interact;
    ui.shutdown;

    ������������������������������������������������
    ���8             ���  <- press Enter, and���
    ���9             ���
    ���10            ���
    ������������������������������������������������
    ���you chose 8!  ���  <- ���this appears!
    ���              ���
    ������������������������������������������������


## Features and design goals

* Easy to quickly make a console interface with custom behavior, but practical defaults.

* Scrolling with some optimization, such as using ANSI scroll region escape sequences.

* Thread safe.  Concurrency friendly.  Unicode compatibile.

* Dynamic geometry calculation, for smart handling of window resizing.

## More examples

See the [eg](https://git.sr.ht/~bduggan/raku-terminal-ui/tree/master/item/eg/) directory.

## See also

[https://blog.matatu.org/terminal-ui](https://blog.matatu.org/terminal-ui)

## Description

The starting point for the reference documentation is
in [Terminal::UI](https://git.sr.ht/~bduggan/raku-terminal-ui/tree/master/item/lib/Terminal/UI.md).  Other classes
with documentation are:

* [Terminal::UI::Screen](https://git.sr.ht/~bduggan/raku-terminal-ui/tree/master/item/lib/Terminal/UI/Screen.md)
* [Terminal::UI::Frame](https://git.sr.ht/~bduggan/raku-terminal-ui/tree/master/item/lib/Terminal/UI/Frame.md)
* [Terminal::UI::Pane](https://git.sr.ht/~bduggan/raku-terminal-ui/tree/master/item/lib/Terminal/UI/Pane.md)
* [Terminal::UI::Style](https://git.sr.ht/~bduggan/raku-terminal-ui/tree/master/item/lib/Terminal/UI/Style.md)
* [Terminal::UI::Input](https://git.sr.ht/~bduggan/raku-terminal-ui/tree/master/item/lib/Terminal/UI/Input.md)

## Author

Brian Duggan (bduggan at matatu.org)