Skip to main content
`Ctrl`+`K`

# Theme variables and CSS

This section covers a few ways that you can control the look and feel of your theme via your own CSS and theme variables.

## Custom CSS Stylesheets

You can customize the theme’s CSS by creating a custom stylesheet. This stylesheet will be used by Sphinx while building your site. Any rules in this style sheet will override the default theme rules.

See also

For a more in-depth guide in linking static CSS and JS assets in your site, see Add custom CSS and JS assets.

To add a custom stylesheet, follow these steps:

1. Create a CSS stylesheet in `_static/css/custom.css`, and update the CSS rules as desired.

2. Attach the stylesheet to your Sphinx build. Add the following to `conf.py`:

       html_static_path = ['_static']

       html_css_files = [
           'css/custom.css',
       ]

When you build your documentation, this stylesheet should now be activated.

## CSS theme variables

This theme defines several CSS variables that can be used to quickly control behavior and display across your documentation.

These are based on top of the basic Bootstrap CSS variables extended with some theme-specific variables.

### Base variables

Follow these steps to update the base variables:

1. Add a custom CSS stylesheet. This is where we’ll configure the variables.

2. Underneath a `html` section, add the variables you wish to update. For example, to change the base font size you would add the following to your `custom.css` file :

       html {
           --pst-font-size-base: 17px;
       }

Important

Note that the theme is defined with CSS variables and not SASS variables.

Refer to the managing themes section in this documentation if you desire a different behavior between the light and dark theme.

For a complete list of the theme variables that you may override, see the theme variables defaults CSS file:

    html {
      /*****************************************************************************
      * Overall Layout Variables
      */

      // Header height will impact the top offset for many sections
      // Article header is 66% of Header
      --pst-header-height: 4rem;
      --pst-header-article-height: calc(var(--pst-header-height) * 2 / 3);
      --pst-sidebar-secondary: 17rem;
    }

    /*******************************************************************************
    * Breakpoints that trigger UI changes
    *
    * Note that media-breakpoint-down begins at the next highest level!
    * So we should choose a media-breakpoint-down one *lower* than when we want to start
    * example: media-breakpoint-up(md) and media-breakpoint-down(sm) trigger at the same time
    * ref: https://github.com/twbs/bootstrap/issues/31214
    */
    $breakpoint-sidebar-primary: lg; // When we collapse the primary sidebar
    $breakpoint-sidebar-secondary: xl; // When we collapse the secondary sidebar
    $breakpoint-page-width: 88rem; // taken from sphinx-basic-ng, which we are ultimately going to inherit

    /*******************************************************************************
    * Define the animation behaviour
    */
    $animation-time: 200ms;

    /*******************************************************************************
    * UI shaping and padding
    */
    $admonition-border-radius: 0.25rem;

    // In this theme, some focus rings have rounded corners while others do not.
    // This variable sets the border radius for the rounded focus rings.
    $focus-ring-radius: 0.125rem; // 2px at 100% zoom and 16px base font.

    $navbar-link-padding-y: 0.25rem;

    // Ensure that there is no overlap of bumper disks (smallest circle that
    // contains the bounding box of the interactive element).
    // - https://github.com/Quansight-Labs/czi-scientific-python-mgmt/issues/81#issuecomment-2251325783
    $nav-icon-column-gap: 1.12rem;

    // Determines vertical space between entries in both the section (left/primary
    // sidebar) and page (right/secondary sidebar) table of contents
    $toc-item-padding-y: 0.25rem;

    html {
      /*****************************************************************************
      * Font features used in this theme
      */

      // base font size - applied at body/html level
      --pst-font-size-base: 1rem;

      // heading font sizes based on a medium contrast type scale
      // - see: https://github.com/Quansight-Labs/czi-scientific-python-mgmt/issues/97#issuecomment-2310531483
      --pst-font-size-h1: 2.625rem;
      --pst-font-size-h2: 2.125rem;
      --pst-font-size-h3: 1.75rem;
      --pst-font-size-h4: 1.5rem;
      --pst-font-size-h5: 1.25rem;
      --pst-font-size-h6: 1rem;

      // smaller than heading font sizes
      --pst-font-size-milli: 0.9rem;

      // Sidebar styles
      --pst-sidebar-font-size: 0.9rem;
      --pst-sidebar-font-size-mobile: 1.1rem;
      --pst-sidebar-header-font-size: 1.2rem;
      --pst-sidebar-header-font-weight: 600;

      // Admonition styles
      --pst-admonition-font-weight-heading: 600;

      // Font weights
      --pst-font-weight-caption: 300;
      --pst-font-weight-heading: 600;

      // Font family
      // https://modernfontstacks.com/?stack=system-ui
      --pst-font-family-base-system:
        system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
        "Segoe UI Symbol", "Noto Color Emoji";

      // https://modernfontstacks.com/?stack=monospace-code
      --pst-font-family-monospace-system:
        ui-monospace, "Cascadia Code", "Source Code Pro", "Menlo", "Consolas",
        "DejaVu Sans Mono", monospace;
      --pst-font-family-base: var(--pst-font-family-base-system);
      --pst-font-family-heading: var(--pst-font-family-base-system);
      --pst-font-family-monospace: var(--pst-font-family-monospace-system);
    }

    $line-height-body: 1.65;
    $fa-font-path: "vendor/fontawesome/webfonts/";

    html {
      /*****************************************************************************
      * Icon
      */

      // Font size across all icons
      --pst-font-size-icon: 1.5rem;

      // Font Awesome default icons
      --pst-icon-check-circle: "\f058"; // fa-solid fa-circle-check
      --pst-icon-info-circle: "\f05a"; // fa-solid fa-circle-info
      --pst-icon-exclamation-triangle: "\f071"; // fa-solid fa-triangle-exclamation
      --pst-icon-exclamation-circle: "\f06a"; // fa-solid fa-circle-exclamation
      --pst-icon-times-circle: "\f057"; // fa-solid fa-circle-xmark
      --pst-icon-lightbulb: "\f0eb"; // fa-solid fa-lightbulb
      --pst-icon-download: "\f019"; // fa-solid fa-download
      --pst-icon-angle-left: "\f104"; // fa-solid fa-angle-left
      --pst-icon-angle-right: "\f105"; // fa-solid fa-angle-right
      --pst-icon-external-link: "\f35d"; // fa-solid fa-up-right-from-square
      --pst-icon-search-minus: "\f010"; // fa-solid fa-magnifying-glass-minus
      --pst-icon-github: "\f09b"; // fa-brands fa-github
      --pst-icon-gitlab: "\f296"; // fa-brands fa-gitlab
      --pst-icon-share: "\f064"; // fa-solid fa-share
      --pst-icon-bell: "\f0f3"; // fa-solid fa-bell
      --pst-icon-pencil: "\f303"; // fa-solid fa-pencil

      // Bootstrap icons
      --pst-breadcrumb-divider: "\f105";
    }

    html {
      /*****************************************************************************
      * Admonitions
      **/

      --pst-icon-admonition-default: var(--pst-icon-bell);
      --pst-icon-admonition-note: var(--pst-icon-info-circle);
      --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle);
      --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle);
      --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle);
      --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle);
      --pst-icon-admonition-error: var(--pst-icon-times-circle);
      --pst-icon-admonition-hint: var(--pst-icon-lightbulb);
      --pst-icon-admonition-tip: var(--pst-icon-lightbulb);
      --pst-icon-admonition-important: var(--pst-icon-exclamation-circle);
      --pst-icon-admonition-seealso: var(--pst-icon-share);
      --pst-icon-admonition-todo: var(--pst-icon-pencil);
    }

    html {
      /*****************************************************************************
      * versionmodified
      **/

      --pst-icon-versionmodified-default: var(--pst-icon-exclamation-circle);
      --pst-icon-versionmodified-added: var(--pst-icon-exclamation-circle);
      --pst-icon-versionmodified-changed: var(--pst-icon-exclamation-circle);
      --pst-icon-versionmodified-deprecated: var(--pst-icon-exclamation-circle);
      --pst-icon-versionmodified-removed: var(--pst-icon-exclamation-circle);
    }

### Color variables

This theme specifies color variables for the primary and secondary colors (`--pst-color-primary` and `--pst-color-secondary`, respectively). These are meant to complement one another visually across the theme, if you modify these, choose colors that look good when paired with one another. There are also several other color variables that control the color for admonitions, links, menu items, etc.

Each color variable has two values, one corresponding to the “light” and one for the “dark” theme. These are used throughout many of the theme elements to define text color, background color, etc.

Here is an overview of the colors available in the theme (change theme mode to switch from light to dark versions).

primary secondary accent success info warning danger background on-background surface on-surface target

To modify the colors for these variables for light and dark themes, add a custom CSS stylesheet with a structure like so:

    html[data-theme="light"] {
        --pst-color-primary: black;
    }

    html[data-theme="dark"] {
        --pst-color-primary: white;
    }

This theme uses shadows to convey depth in the light theme mode and opacity in the dark one. It defines 4 color variables that help build overlays in your documentation.

- `background`: color of the back-most surface of the documentation

- `on-background` elements that are set on top of this background (e.g. the header navbar on dark mode).

- `surface` elements set on the background with a light-grey color in the light theme mode. This color has been kept in the dark theme (e.g. code-block directives).

- `on-surface` elements that are on top of `surface` elements (e.g. sidebar directives).

The following image should help you understand these overlays:

background

on-background

surface

on-surface

For a complete list of the theme colors that you may override, see the `PyData theme CSS colors stylesheet`.

## Configure pygments theme

As the Sphinx theme supports multiple modes, the code highlighting colors can be modified for each one of them by modifying the `pygments_light_style` and `pygments_dark_style`. You can check available Pygments colors on this pygments demo page.

    html_theme_options = {
       ...
       "pygments_light_style": "tango",
       "pygments_dark_style": "monokai"
    }

Note that the PyData Sphinx theme uses the accessible pygments styles for its default syntax highlighting themes. The accessible pygments themes are designed to meet WCAG AA or AAA standards for color contrast and some included themes are also suitable for colorblind users or low-light conditions. You can check all the available styles at the accessible pygments demo page.

Danger

The native Sphinx option `pygments_style` will be overwritten by this theme.