Module textual.cli.previews.colors

Expand source code
from textual.app import App, ComposeResult
from textual.containers import Horizontal, Vertical
from textual.design import ColorSystem
from textual.widget import Widget
from textual.widgets import Button, Footer, Static


class ColorButtons(Vertical):
    def compose(self) -> ComposeResult:
        for border in ColorSystem.COLOR_NAMES:
            if border:
                yield Button(border, id=border)


class ColorBar(Static):
    pass


class ColorItem(Horizontal):
    pass


class ColorGroup(Vertical):
    pass


class Content(Vertical):
    pass


class ColorLabel(Static):
    pass


class ColorsView(Vertical):
    def compose(self) -> ComposeResult:

        LEVELS = [
            "darken-3",
            "darken-2",
            "darken-1",
            "",
            "lighten-1",
            "lighten-2",
            "lighten-3",
        ]

        for color_name in ColorSystem.COLOR_NAMES:

            items: list[Widget] = [ColorLabel(f'"{color_name}"')]
            for level in LEVELS:
                color = f"{color_name}-{level}" if level else color_name
                item = ColorItem(
                    ColorBar(f"${color}", classes="text label"),
                    ColorBar(f"$text-muted", classes="muted"),
                    ColorBar(f"$text-disabled", classes="disabled"),
                    classes=color,
                )
                items.append(item)

            yield ColorGroup(*items, id=f"group-{color_name}")


class ColorsApp(App):
    CSS_PATH = "colors.css"

    BINDINGS = [("d", "toggle_dark", "Toggle dark mode")]

    def compose(self) -> ComposeResult:
        yield Content(ColorButtons())
        yield Footer()

    def on_mount(self) -> None:
        self.call_later(self.update_view)

    def update_view(self) -> None:
        content = self.query_one("Content", Content)
        content.mount(ColorsView())

    def on_button_pressed(self, event: Button.Pressed) -> None:
        self.bell()
        self.query(ColorGroup).remove_class("-active")
        group = self.query_one(f"#group-{event.button.id}", ColorGroup)
        group.add_class("-active")
        group.scroll_visible(top=True, speed=150)


app = ColorsApp()

if __name__ == "__main__":
    app.run()

Classes

class ColorBar (renderable: RenderableType = '', *, expand: bool = False, shrink: bool = False, markup: bool = True, name: str | None = None, id: str | None = None, classes: str | None = None)

A widget to display simple static content, or use as a base class for more complex widgets.

Args

renderable : RenderableType, optional
A Rich renderable, or string containing console markup. Defaults to "".
expand : bool, optional
Expand content if required to fill container. Defaults to False.
shrink : bool, optional
Shrink content if required to fill container. Defaults to False.
markup : bool, optional
True if markup should be parsed and rendered. Defaults to True.

name (str | None, optional): Name of widget. Defaults to None. id (str | None, optional): ID of Widget. Defaults to None. classes (str | None, optional): Space separated list of class names. Defaults to None.

Expand source code
class ColorBar(Static):
    pass

Ancestors

Inherited members

class ColorButtons (*children: Widget, name: str | None = None, id: str | None = None, classes: str | None = None)

A container widget which aligns children vertically.

Expand source code
class ColorButtons(Vertical):
    def compose(self) -> ComposeResult:
        for border in ColorSystem.COLOR_NAMES:
            if border:
                yield Button(border, id=border)

Ancestors

Class variables

var COMPONENT_CLASSES : ClassVar[set[str]]

Inherited members

class ColorGroup (*children: Widget, name: str | None = None, id: str | None = None, classes: str | None = None)

A container widget which aligns children vertically.

Expand source code
class ColorGroup(Vertical):
    pass

Ancestors

Class variables

var COMPONENT_CLASSES : ClassVar[set[str]]

Inherited members

class ColorItem (*children: Widget, name: str | None = None, id: str | None = None, classes: str | None = None)

A container widget which aligns children horizontally.

Expand source code
class ColorItem(Horizontal):
    pass

Ancestors

Class variables

var COMPONENT_CLASSES : ClassVar[set[str]]

Inherited members

class ColorLabel (renderable: RenderableType = '', *, expand: bool = False, shrink: bool = False, markup: bool = True, name: str | None = None, id: str | None = None, classes: str | None = None)

A widget to display simple static content, or use as a base class for more complex widgets.

Args

renderable : RenderableType, optional
A Rich renderable, or string containing console markup. Defaults to "".
expand : bool, optional
Expand content if required to fill container. Defaults to False.
shrink : bool, optional
Shrink content if required to fill container. Defaults to False.
markup : bool, optional
True if markup should be parsed and rendered. Defaults to True.

name (str | None, optional): Name of widget. Defaults to None. id (str | None, optional): ID of Widget. Defaults to None. classes (str | None, optional): Space separated list of class names. Defaults to None.

Expand source code
class ColorLabel(Static):
    pass

Ancestors

Inherited members

class ColorsApp (driver_class: Type[Driver] | None = None, css_path: CSSPathType = None, watch_css: bool = False)

The base class for Textual Applications.

Args

driver_class (Type[Driver] | None, optional): Driver class or None to auto-detect. Defaults to None.
title (str | None, optional): Title of the application. If None, the title is set to the name of the App subclass. Defaults to None.
css_path (str | PurePath | None, optional): Path to CSS or None for no CSS file. Defaults to None.
watch_css : bool, optional
Watch CSS for changes. Defaults to False.
Expand source code
class ColorsApp(App):
    CSS_PATH = "colors.css"

    BINDINGS = [("d", "toggle_dark", "Toggle dark mode")]

    def compose(self) -> ComposeResult:
        yield Content(ColorButtons())
        yield Footer()

    def on_mount(self) -> None:
        self.call_later(self.update_view)

    def update_view(self) -> None:
        content = self.query_one("Content", Content)
        content.mount(ColorsView())

    def on_button_pressed(self, event: Button.Pressed) -> None:
        self.bell()
        self.query(ColorGroup).remove_class("-active")
        group = self.query_one(f"#group-{event.button.id}", ColorGroup)
        group.add_class("-active")
        group.scroll_visible(top=True, speed=150)

Ancestors

Class variables

var BINDINGS
var CSS_PATH : CSSPathType
var SCREENS : dict[str, Screen]
var SUB_TITLE : str | None
var TITLE : str | None

Methods

def on_button_pressed(self, event: textual.widgets._button.Button.Pressed) ‑> None
Expand source code
def on_button_pressed(self, event: Button.Pressed) -> None:
    self.bell()
    self.query(ColorGroup).remove_class("-active")
    group = self.query_one(f"#group-{event.button.id}", ColorGroup)
    group.add_class("-active")
    group.scroll_visible(top=True, speed=150)
def on_mount(self) ‑> None
Expand source code
def on_mount(self) -> None:
    self.call_later(self.update_view)
def update_view(self) ‑> None
Expand source code
def update_view(self) -> None:
    content = self.query_one("Content", Content)
    content.mount(ColorsView())

Inherited members

class ColorsView (*children: Widget, name: str | None = None, id: str | None = None, classes: str | None = None)

A container widget which aligns children vertically.

Expand source code
class ColorsView(Vertical):
    def compose(self) -> ComposeResult:

        LEVELS = [
            "darken-3",
            "darken-2",
            "darken-1",
            "",
            "lighten-1",
            "lighten-2",
            "lighten-3",
        ]

        for color_name in ColorSystem.COLOR_NAMES:

            items: list[Widget] = [ColorLabel(f'"{color_name}"')]
            for level in LEVELS:
                color = f"{color_name}-{level}" if level else color_name
                item = ColorItem(
                    ColorBar(f"${color}", classes="text label"),
                    ColorBar(f"$text-muted", classes="muted"),
                    ColorBar(f"$text-disabled", classes="disabled"),
                    classes=color,
                )
                items.append(item)

            yield ColorGroup(*items, id=f"group-{color_name}")

Ancestors

Class variables

var COMPONENT_CLASSES : ClassVar[set[str]]

Inherited members

class Content (*children: Widget, name: str | None = None, id: str | None = None, classes: str | None = None)

A container widget which aligns children vertically.

Expand source code
class Content(Vertical):
    pass

Ancestors

Class variables

var COMPONENT_CLASSES : ClassVar[set[str]]

Inherited members