ui.Theme
self, preset=None, name=None, include_paths=None) ui.Theme(
Create a custom Shiny theme.
The Theme
class allows you to create a custom Shiny theme by providing custom Sass code. The theme can be based on one of the available presets, such as "shiny"
or "bootstrap"
, or a Bootswatch theme. Use the .add_*()
methods can be chained together to add custom Sass functions, defaults, mixins, and rules.
Pass the Theme
object directly to the theme
argument of any Shiny page function, such as page_sidebar or page_navbar. In Shiny Express apps, use the theme
argument of page_opts to set the app theme.
Note: Compiling custom themes requires the libsass package, which is not installed by default with Shiny. Use pip install libsass
or pip install "shiny[theme]"
to install it.
Customized themes are compiled to CSS when the theme is used. The Theme
class caches the compiled CSS so that it's only compiled for the first user to load your app, but you can speed up app loading (and avoid the runtime libsass
dependency) by pre-compiling the theme CSS and saving it to a file. To do this, use the .to_css()
method to render the theme to a single minified CSS string.
my_theme.py
from pathlib import Path
from shiny import ui
= (
my_theme "shiny")
ui.Theme(
.add_defaults(="#aa00aa",
my_purple
)
.add_mixins(="$my-purple",
headings_color
)
)
with open(Path(__file__).parent / "my_theme.css", "w") as f:
f.write(my_theme.to_css())
Run this script with python my_theme.py
to generate the CSS file. Once saved to a file, the CSS can be used in any Shiny app by passing the file path to the theme
argument instead of the Theme
object.
app.py
from pathlib import Path
from shiny import App, ui
= ui.page_fluid(
app_ui "Hello, themed Shiny!"),
ui.h2(# App content here
="My App",
title=Path(__file__).parent / "my_theme.css",
theme
)
def server(input):
pass
= App(app_ui, server) app
Parameters
preset : str | None = None
-
The name of the preset to use as a base.
"shiny"
is the default theme for Shiny apps and"bootstrap"
uses standard Bootstrap 5 styling. Bootswatch theme presets are also available. UseTheme.available_presets()
to see the full list. name : Optional[str] = None
-
A custom name for the theme. If not provided, the preset name will be used.
include_paths : Optional[str | pathlib.Path |
list
[str | pathlib.Path]] = None-
Additional paths to include when looking for Sass files used in
@import
statements in the theme. This can be a single path as a string or pathlib.Path, or a list of paths. The paths should point to directories containing additional Sass files that the theme depends on.
Raises
: ValueError
-
If the
preset
is not a valid theme preset.
Methods
Name | Description |
---|---|
add_defaults | Add custom default values to the theme. |
add_functions | Add custom Sass functions to the theme. |
add_mixins | Add custom Sass mixins to the theme. |
add_rules | Add custom Sass rules to the theme. |
available_presets | Get a list of available theme presets. |
from_brand | Create a custom Shiny theme from a _brand.yml |
to_css | Compile the theme to CSS and return the result as a string. |
to_sass | Returns the custom theme as a single Sass string. |
add_defaults
*args, **kwargs) ui.Theme.add_defaults(
Add custom default values to the theme.
Sass code added via this method will be placed before the default values of the theme preset, allowing you to override or extend the default values.
Parameters
*args : str = ()
-
Sass code, as a single or multiple strings, containing default value declarations to add.
****kwargs** : str | float | int | bool | None = {}
-
Keyword arguments containing default value declarations to add. The keys should be Sass variable names using underscore casing that will be transformed automatically to kebab-case. For example,
.add_defaults(primary_color="#ff0000")
is equivalent to.add_defaults("$primary-color: #ff0000 !default;")
.
add_functions
*args) ui.Theme.add_functions(
Add custom Sass functions to the theme.
Sass code added via this method will be placed after the function declarations from the theme preset, allowing you to override or extend the default functions.
Parameters
*args : str = ()
-
The Sass functions to add as a single or multiple strings.
add_mixins
*args, **kwargs) ui.Theme.add_mixins(
Add custom Sass mixins to the theme.
Sass code added via this method will be placed after the mixin declarations from the theme preset, allowing you to override or extend the default mixins.
Parameters
*args : str = ()
-
Sass code, as a single or multiple strings, containing mixins to add.
****kwargs** : str | float | int | bool | None = {}
-
Keyword arguments containing Sass value declarations to add. The keys should be Sass variable names using underscore casing that will be transformed automatically to kebab-case. For example,
.add_mixins(primary_color="#ff0000")
is equivalent to.add_mixins("$primary-color: #ff0000;")
.
add_rules
*args, **kwargs) ui.Theme.add_rules(
Add custom Sass rules to the theme.
Sass code added via this method will be placed after the rule declarations from the theme preset, allowing you to override or extend the default rules.
Parameters
*args : str = ()
-
Sass code, as a single or multiple strings, containing rules to add.
****kwargs** : str | float | int | bool | None = {}
-
Keyword arguments containing Sass value declarations to add. The keys should be Sass variable names using underscore casing that will be transformed automatically to kebab-case. For example,
.add_rules(primary_color="#ff0000")
is equivalent to.add_rules("$primary-color: #ff0000;")
.
available_presets
ui.Theme.available_presets()
Get a list of available theme presets.
from_brand
ui.Theme.from_brand(brand)
Create a custom Shiny theme from a _brand.yml
Creates a custom Shiny theme for your brand using brand.yml, a single YAML file that describes the brand's color and typography. Learn more about writing a _brand.yml
file for your brand at the brand.yml homepage.
As a simple example, suppose your brand guidelines include a color palette with custom orange and black colors. The orange is used as the primary accent color and the black for all text. For typography, the brand also uses Roboto and Roboto Mono from Google Fonts for text and monospace-styled text, respectively. Here's a _brand.yml
file for this brand:
_brand.yml
meta:
name: brand.yml Example
color:
palette:
orange: "#F96302"
black: "#000000"
foreground: black
primary: orange
typography:
fonts:
- family: Roboto
source: google
- family: Roboto Mono
source: google
base: Roboto
monospace: Roboto Mono
You can store the _brand.yml
file next to your Shiny app.py
or, for larger projects, in a parent folder. To use a theme generated from the _brand.yml
file, call from_brand
on __file__
and pass the result to the theme
argument of page_opts (Shiny Express) or the theme
argument of shiny.ui.page_*
functions, like page_sidebar.
app.py
from shiny.express import input, render, ui
=ui.Theme.from_brand(__file__))
ui.page_opts(theme
"n", "N", 0, 100, 20)
ui.input_slider(
@render.code
def txt():
return f"n*2 is {input.n() * 2}"
Parameters
brand : ‘str | pathlib.Path | Brand’
-
A
brand_yml.Brand
instance, or a path to help locate_brand.yml
. For a path, you can pass__file__
or a directory containing the_brand.yml
or a path directly to the_brand.yml
file.
Returns
:
-
A shiny.ui.Theme instance with a custom Shiny theme created from the brand guidelines (see
brand_yml.Brand
).
to_css
=None) ui.Theme.to_css(compile_args
Compile the theme to CSS and return the result as a string.
Parameters
compile_args : Optional[
SassCompileArgs
] = None-
A dictionary of keyword arguments to pass to
sass.compile()
.
Returns
: str
-
The compiled CSS for the theme. The value is cached such that previously compiled themes are returned immediately. Adding additional custom Sass code or changing the preset will invalidate the cache.
to_sass
ui.Theme.to_sass()
Returns the custom theme as a single Sass string.
Returns
: str
-
The custom theme as a single Sass string.