Skip to main content

Celadon

Celadon

A modern TUI library taking the right lessons from the web.

pip install sh40-celadon

rule

Development Note

Since the project is in early stages a lot of optimization remains on the table. It already runs well on most machines, but certain domains (such as styling & layouts) might hog older computers.

This will be remedied in the future, once the related framework is in place to allow for more generalized testing.

rule

Purpose

Celadon is a library for creating good looking and performant UIs in the terminal. While it is possible to use standalone, you generally wanna use it through a framework like celx.

rule

Feature highlights

YAML Styling

Celadon includes a powerful CSS-inspired engine for styling your applications. It supports your basic #id, .group (.class in CSS land) selector primitives, as well as direct (Parent > Widget) and indirect hierarchal matching (Parent *> Widget, where Widget is a part of Parent but not necessarily a first-degree descendant).

It replaces CSS' notion of a 'pseudoclass' with a more direct notion of widget state, controlled by a state machine internal to all widgets.

Button:
    fill_style: '@ui.primary'
    # Automatically use either white or black, based on the W3C contrast
    # guidelines
    content_style: ''

    # On hover, become a bit brighter
    /hover: # Equivalent to 'Button/hover'
        fill_style: '@ui.primary+1'

    # Become a bit taller if in the 'big' group
    .big:
        height: 3

    # If part of a Row in the 'button-row' group, fill available width.
    # '&' stands for the selector in the previous nesting layer, `Button`
    # in this case.
    Row.button-row > &:
        width: null

A great layout system

Layouts are one of the biggest difficulties in any UI environment, especially on the web. We try to solve most of these issues by stripping down the amount of settings you need to be aware of (no more "align-items or justify-items?") and controlling almost all layout parameters within widget dimension settings.

A dimension can be one of three types:

  • int: Sets a static size, i.e. button.width = 5 will make that button take up 5 cells of space horizontally, regardless of its parent's size.
  • float: Sets a relative size to the parent's size of the same dimension, i.e. button.width = 0.5 will make the button be half the width of the parent.
  • None: Sets a so-called fill height, meaning the parent will divide its space remaining after sizing the widgets with the previous two dimension types, and divide it evenly amongst the fill sized.

Exhibit A: Traditional 'web' Header-Body-Footer layout

app += Page(
    Tower(
        Row(
            Text("I mimick the web"),
            Text("For it cannot mimick me"),
            eid="header",
        ),
        Tower(Text.lorem(), eid="body", group="center"),
        Row(
            Button("Ctrl-C : Quit"),
            Button("F12 : Screenshot"),
            eid="footer",
        ),
    ),
    rules="""
    Tower#body:
        frame: [null, heavy, null, heavy]

    Row#header, Row#footer:
        alignment: [center, start]
        height: 1
""",
)

Here, specifying a static dimension for both header and footer's height allows the body to fill up the remaining space, and not specifying a width for either (leaving it to the default None) makes them take up the entire width.

Exhibit B: N*K grid

By making use of the fill dimension type, we can create responsive grids that work regardless of the amount of widgets we have in each column / row.

rows, cols = [10] * 2
grid = Tower(eid="grid")

for _ in range(rows):
    grid += Row(*[Button("Grid Item") for _ in range(cols)])

app += Page(
    grid,
    rules="""
    Tower#grid *> Button:
        width: null
        height: null

        # ...or, you could apply the pre-defined `fill` group to the widget
        groups: [fill]
""",
)

rule

Documentation

Once the library gets to a settled state (near 1.0), documentation will be hosted both online and as a celx application. Until then peep the examples folder, or check out some of the widget references by using python3 -m pydoc <name>.

rule

See also

  • Slate: The terminal interfacing library that forms much of Celadon's backend.
  • Zenith: The markup language & palette generator used for styling content in Celadon.
  • celx: A hypermedia-driven TUI application framework written on top of Celadon.

Metadata

Release files for sh40-celadon 0.10.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sh40-celadon 0.10.0
File Size Uploaded
sh40_celadon-0.10.0.tar.gz 41.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sh40-celadon 0.10.0
File Interpreter ABI Platform
sh40_celadon-0.10.0-py3-none-any.whl Python 3 none any Details

Total release size: 90.6 kB

Release files / sh40_celadon-0.10.0.tar.gz

Download URL sh40_celadon-0.10.0.tar.gz
Size 41.3 kB
Tags Source
SHA-256 checksum
How to use checksums
87e34553841c2f8eecae288ace8105fe1949a196940c49410aaa70aba38edc22
BLAKE2b-256 checksum
How to use checksums
13fa1f2137b76c9e3d89125d47a90fdfc25498aa5b725231dbf66363a04e6fd7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via python-httpx/0.27.0

Release files / sh40_celadon-0.10.0-py3-none-any.whl

Download URL sh40_celadon-0.10.0-py3-none-any.whl
Size 49.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a5390e66d8eaa93bc22c2f95ad219354f5c45070883743a70ed615bb7a436d70
BLAKE2b-256 checksum
How to use checksums
da53347be095c1b9f151b958f2119eb261d2004074b63ee495a85642aed647cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via python-httpx/0.27.0

Release history Release notifications | RSS feed

This release

0.10.0 This release

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page