quarto-dev / quarto-dev/quarto-cli

Brand colour overrides can break dark mode sentinel, disabling `renderings` toggle

Open
#14,084 2 comments 0 reactions 1 assignee View on GitHub

@gordonwoodhull is already working on this.

Since Feb 22, 2026.

brand bug themes triaged-to
Dominant language
JavaScript
Stars
6k
Forks
458
Avg merge
1d 9h
Merged PRs (30d)
41

Description

Bug description

When using brand with colour overrides in a document that has both light and dark themes, the renderings cell option (used to show different plot outputs for light vs dark mode) can stop working. The dark rendering is always hidden and the light rendering is always shown, regardless of the active colour scheme.

The root cause is that the dark mode sentinel in _bootstrap-rules.scss (line 1939) depends on the computed blackness of $body-bg:

@if (quarto-color.blackness($body-bg) > $code-block-theme-dark-threshhold) {
  /*! dark */
} @else {
  /*! light */
}

When brand overrides $body-bg with a colour whose HWB blackness falls below the threshold (e.g., blue/#0000FF has 0% blackness despite being perceptually dark), the sentinel evaluates to /*! light */ for the dark stylesheet. This causes data-mode="light" to be set on the dark <link> tag instead of data-mode="dark", so toggleBodyColorMode() never applies the quarto-dark body class, and the CSS rules body.quarto-dark .light-content { display: none } / body.quarto-light .dark-content { display: none } never toggle.

Steps to reproduce

---
brand:
  color: 
    background:
      light: "red"
      dark: "blue"
    foreground:
      light: "green"
      dark: "yellow"
format:
  html:
    theme:
      light:
        - cosmo
        - brand
      dark:
        - darkly
        - brand
---

::: {#fig-caption-crossref}

```{r}
#| label: caption-crossref
#| renderings: [dark, light]
par(bg = "#FFFFFF", fg = "#000000")
plot(1:10) # Shown in `light` mode
title("First plot")


par(bg = "#000000", fg = "#FFFFFF", col.axis = "#FFFFFF")
plot(1:10) # Shown in `dark` mode
title("Second plot")
```

Light and dark renderings with a caption and crossref

:::

Actual behaviour

Both the light and dark bootstrap <link> tags have data-mode="light":

<link href="...bootstrap-760272c23cb19874a8d3af056b140ad0.min.css" class="quarto-color-scheme" id="quarto-bootstrap" data-mode="light">
<link href="...bootstrap-dark-65b74e4f2eba21c947a68701f2701928.min.css" class="quarto-color-scheme quarto-color-alternate" id="quarto-bootstrap" data-mode="light">

Toggling to dark mode enables the dark stylesheet but the body retains the quarto-light class. The dark rendering (dark-content) remains hidden.

Expected behaviour

The dark bootstrap <link> tag should have data-mode="dark":

<link href="...bootstrap-dark-....min.css" class="quarto-color-scheme quarto-color-alternate" id="quarto-bootstrap" data-mode="dark">

Toggling to dark mode should apply the quarto-dark body class, hiding light-content and showing dark-content.

Without brand, the same document (using only cosmo/darkly themes) works correctly: the dark CSS contains the /*! dark */ sentinel and data-mode="dark" is set as expected.

Your environment

  • IDE: VSCode
  • OS: macOS (Darwin 25.3.0)

Quarto check output

Quarto 99.9.9
[✓] Checking Quarto installation......OK
      Version: 99.9.9
      commit: d36fe5461f754f714cfb62f56d44cf9509760044
      Path: /Users/mcanouil/Projects/quarto-dev/quarto-cli/package/dist/bin

[✓] Checking tools....................OK
      TinyTeX: v2026.02
      VeraPDF: 1.28.2
      Chromium: (not installed)
      Chrome Headless Shell: (not installed)

[✓] Checking LaTeX....................OK
      Using: TinyTex
      Path: /Users/mcanouil/Library/TinyTeX/bin/universal-darwin
      Version: 2025

[✓] Checking Chrome Headless....................OK
      Using: Chrome from QUARTO_CHROMIUM
      Path: /Applications/Brave Browser.app/Contents/MacOS/Brave Browser

[✓] Checking basic markdown render....OK

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.