CLI elements can be styled via a CSS-like language of selectors and properties. Only a small subset of CSS3 is supported, and a lot visual properties cannot be implemented on a terminal, so these will be ignored as well.
The style of an element is calculated from themes from four sources. These form a stack, and the themes on the top of the stack take precedence, over themes in the bottom.
The cli package has a builtin theme. This is always active.
When an app object is created via
start_app(), the caller can
specify a theme, that is added to theme stack. If no theme is
start_app(), the content of the
is used. Removed when the corresponding app stops.
The user may speficy a theme in the
cli.user_theme option. This
is added to the stack after the app's theme (step 2.), so it can
override its settings. Removed when the app that added it stops.
A theme is a named list of lists. The name of each entry is a CSS selector. Only a subset of CSS is supported:
Type selectors, e.g.
input selects all
Class selectors, e.g.
.index selects any element that has a class
#toc will match the element that has the ID "toc".
The descendant combinator, i.e. the space, that selects nodes
that are descendants of the first element. E.g.
div span will match
<span> elements that are inside a
The content of a theme list entry is another named list, where the
names are CSS properties, e.g.
margin-left, and the list entries themselves define the values of
the properties. See
simple_theme() for examples.
For flexibility, themes may also define formatter functions, with
fmt. These will be called once the other styles are
applied to an element. They are only called on elements that produce
output, i.e. not on container elements.
Right now only a limited set of properties are supported. These include
left, right, top and bottom margins, background and foreground colors,
bold and italic fonts, underlined text. The
properties are supported to insert text before and after the
content of the element.
More properties might be adder later.
Please see the example themes and the source code for now for the details.
Color of headings, that are only active in paragraphs with an 'output' class:
list( "par.output h1" = list("background-color" = "red", color = "#e0e0e0"), "par.output h2" = list("background-color" = "orange", color = "#e0e0e0"), "par.output h3" = list("background-color" = "blue", color = "#e0e0e0") )
Create a custom alert type:
list( ".alert-start" = list(before = symbol$play), ".alert-stop" = list(before = symbol$stop) )