Files
textual/docs/styles/border.md
Dave Pearson b7de48cca3 Border colour percentage (#1954)
* Allow setting an additional alpha on a border

See #1863.

* Update the ChangeLog

* Add snapshot tests for the border alpha value

* Extend the border snapshot tests

While this doesn't test *every* permutation, it covers enough bases that if
something were to change it should catch it.

* Tweak a typo in the border style examples

* Add border transparency percentage to the border docs

* Add a CSS example for using border transparency

* Add Color.multiply_alpha

* Update the CHANGELOG

* Multiply the alpha on a colour rather than replace it

As requested in
https://github.com/Textualize/textual/pull/1954#pullrequestreview-1328170386

(actually required while talking in person with Will, but noted in the
above)

* Multiply the alpha on a border colour rather than replace it

As requested in
https://github.com/Textualize/textual/pull/1954#pullrequestreview-1328170386

(actually requested while talking in person with Will, but noted in the
above)
2023-03-07 14:14:17 +00:00

4.6 KiB

Border

The border rule enables the drawing of a box around a widget.

!!! note

Due to a Textual limitation, [`border`](./border.md) and [`outline`](./outline.md) cannot coexist in the same edge of a widget.

Syntax

--8<-- "docs/snippets/syntax_block_start.md" border: [<border>] [<color>] [<percentage>];

border-top: [<border>] [<color>] [<percentage>]; border-right: [<border>] [<color> [<percentage>]]; border-bottom: [<border>] [<color> [<percentage>]]; border-left: [<border>] [<color> [<percentage>]]; --8<-- "docs/snippets/syntax_block_end.md"

The style border accepts an optional <border> that sets the visual style of the widget border, an optional <color> to set the color of the border, and an optional <percentage> to specify the color transparency.

Borders may also be set individually for the four edges of a widget with the border-top, border-right, border-bottom and border-left rules.

Multiple edge rules

If multiple border rules target the same edge, the last rule that targets a specific edge is the one that is applied to that edge. For example, consider the CSS below:

Static {
    border-top: dashed red;
    border: solid green;  /* overrides the border-top rule above */
    /* Change the border but just for the bottom edge: */
    border-bottom: double blue;
}

The CSS snippet above will add a solid green border around Static widgets, except for the bottom edge, which will be double blue.

Defaults

If <color> is specified but <border> is not, it defaults to "solid". If <border> is specified but <color>is not, it defaults to green (RGB color "#00FF00"). If <percentage> is not specified it defaults to 100%.

Border command

The textual CLI has a subcommand which will let you explore the various border types interactively:

textual borders

Alternatively, you can see the examples below.

Examples

Basic usage

This examples shows three widgets with different border styles.

=== "Output"

```{.textual path="docs/examples/styles/border.py"}
```

=== "border.py"

```python
--8<-- "docs/examples/styles/border.py"
```

=== "border.css"

```sass hl_lines="4 10 16"
--8<-- "docs/examples/styles/border.css"
```

All border types

The next example shows a grid with all the available border types.

=== "Output"

```{.textual path="docs/examples/styles/border_all.py"}
```

=== "border_all.py"

```py hl_lines="2 6 10 14 18 22 26 30 34 38 42 46 50 54 58"
--8<-- "docs/examples/styles/border_all.py"
```

=== "border_all.css"

```sass
--8<-- "docs/examples/styles/border_all.css"
```

Borders and outlines

The next example makes the difference between border and outline clearer by having three labels side-by-side. They contain the same text, have the same width and height, and are styled exactly the same up to their outline and border rules.

This example also shows that a widget cannot contain both a border and an outline:

=== "Output"

```{.textual path="docs/examples/styles/outline_vs_border.py"}
```

=== "outline_vs_border.py"

```python
--8<-- "docs/examples/styles/outline_vs_border.py"
```

=== "outline_vs_border.css"

```sass hl_lines="5-7 9-11"
--8<-- "docs/examples/styles/outline_vs_border.css"
```

CSS

/* Set a heavy white border */
border: heavy white;

/* Set a red border on the left */
border-left: outer red;

/* Set a rounded orange border, 50% transparency. */
border: round orange 50%;

Python

# Set a heavy white border
widget.styles.border = ("heavy", "white")

# Set a red border on the left
widget.styles.border_left = ("outer", "red")

See also

  • box-sizing to specify how to account for the border in a widget's dimensions.
  • outline to add an outline around the content of a widget.