You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The body-secondary mixin, which colors blockquotes, figure/table captions, header section numbers, and margin/aside text, derives its color as theme-dim($body-color, 25%) with no contrast check:
For theme: cosmo this yields #747a7f on #ffffff = 4.34:1, below the WCAG 2.0 AA (1.4.3) minimum of 4.5:1 — axe-core flags it as color-contrast, impact serious. On quarto.org (a cosmo-derived theme with $body-color: #343a40) the same derivation yields #6d7a86 = 4.39:1, which is how this surfaced in an axe audit of the site.
All five @include body-secondary sites are affected (_bootstrap-rules.scss lines 663, 695, 702, 710, 913), e.g. the blockquote rule:
Quarto already has contrast-guarding machinery — theme-contrast() / accessibleContrast() with an explicit "AA" (4.5:1) level — used for navbar, footer, sidebar, and button foregrounds:
Routing the mixin's fallback through it, e.g. theme-contrast(theme-dim($body-color, 25%), $body-bg, "AA"), would keep the dimmed look while guaranteeing conformance for every theme.
Not every built-in theme fails: the default theme's body color dims to #5a6570 = 5.95:1, which passes. The failure depends on where $body-color lands, which is exactly why a contrast guard rather than a per-theme tweak seems right.
Related: the axe-finding family in #14373 and the accessibility epic #8706.
Investigated with AI assistance grounded in a local clone of quarto-cli (per CONTRIBUTING.md, "Using AI tools to investigate").
Steps to reproduce
---title: reproformat:
html:
theme: cosmoaxe:
output: document---> A blockquote.
Render, open in a browser.
Actual behavior
The blockquote text renders at #747a7f on #ffffff = 4.34:1. axe-core reports:
Serious · WCAG 2.0 AA (1.4.3): Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds
Elements must meet minimum color contrast ratio thresholds
p
The same color applies to `figcaption`/`caption`/`.table-caption`, `.header-section-number`, and margin/aside text.
## Expected behavior
Text colors derived by Quarto for built-in themes meet the WCAG AA 4.5:1 minimum, e.g. by passing the `body-secondary` fallback through the existing `theme-contrast(..., "AA")` machinery.
## Your environment
- IDE: Positron 2026.07.0 (build 352)
- OS: macOS 26.5.1 (build 25F80)
## Quarto check output
Quarto 1.10.12
[✓] Checking environment information...
Quarto cache location: /Users/charlottewickham/Library/Caches/quarto
[✓] Checking versions of quarto binary dependencies...
Pandoc version 3.8.3: OK
Dart Sass version 1.87.0: OK
Deno version 2.7.14: OK
Typst version 0.14.2: OK
[✓] Checking versions of quarto dependencies......OK
[✓] Checking Quarto installation......OK
Version: 1.10.12
Path: /Applications/quarto/bin
[✓] Checking tools....................OK
TinyTeX: v2026.04
Chrome Headless Shell: 150.0.7871.115
VeraPDF: 1.28.2
[✓] Checking LaTeX....................OK
Using: TinyTex
Path: /Users/charlottewickham/Library/TinyTeX/bin/universal-darwin
Version: 2026
[✓] Checking Chrome Headless....................OK
Using: Chrome Headless Shell installed by Quarto
Path: /Users/charlottewickham/Library/Application Support/quarto/chrome-headless-shell/chrome-headless-shell-mac-arm64/chrome-headless-shell
Version: 150.0.7871.115
[✓] Checking basic markdown render....OK
[✓] Checking R installation...........OK
Version: 4.6.0
Path: /Library/Frameworks/R.framework/Versions/4.6/Resources
LibPaths:
- /Users/charlottewickham/Library/R/arm64/4.6/library
- /Library/Frameworks/R.framework/Versions/4.6/Resources/library
knitr: 1.51
rmarkdown: 2.31
[✓] Checking Knitr engine render......OK
[✓] Checking Python 3 installation....OK
Version: 3.12.2
Path: /Users/charlottewickham/.pyenv/versions/3.12.2/bin/python3
Jupyter: 5.9.1
Kernels: python3
[✓] Checking Jupyter engine render....OK
[✓] Checking Julia installation...
I have:
Bug description
The
body-secondarymixin, which colors blockquotes, figure/table captions, header section numbers, and margin/aside text, derives its color astheme-dim($body-color, 25%)with no contrast check:quarto-cli/src/resources/formats/html/bootstrap/_bootstrap-mixins.scss
Lines 1 to 7 in 8577ed1
For
theme: cosmothis yields#747a7fon#ffffff= 4.34:1, below the WCAG 2.0 AA (1.4.3) minimum of 4.5:1 — axe-core flags it ascolor-contrast, impact serious. On quarto.org (a cosmo-derived theme with$body-color: #343a40) the same derivation yields#6d7a86= 4.39:1, which is how this surfaced in an axe audit of the site.All five
@include body-secondarysites are affected (_bootstrap-rules.scsslines 663, 695, 702, 710, 913), e.g. the blockquote rule:quarto-cli/src/resources/formats/html/bootstrap/_bootstrap-rules.scss
Lines 909 to 914 in 8577ed1
Quarto already has contrast-guarding machinery —
theme-contrast()/accessibleContrast()with an explicit"AA"(4.5:1) level — used for navbar, footer, sidebar, and button foregrounds:quarto-cli/src/resources/formats/html/bootstrap/_bootstrap-functions.scss
Lines 14 to 54 in 8577ed1
Routing the mixin's fallback through it, e.g.
theme-contrast(theme-dim($body-color, 25%), $body-bg, "AA"), would keep the dimmed look while guaranteeing conformance for every theme.Two notes:
$body-secondarySCSS variable when defined — quarto.org uses that as a workaround (Fix WCAG AA color contrast: muted text and appendix links (light theme) quarto-web#2102). It appears to be undocumented; worth documenting regardless of the fix here.defaulttheme's body color dims to#5a6570= 5.95:1, which passes. The failure depends on where$body-colorlands, which is exactly why a contrast guard rather than a per-theme tweak seems right.Related: the axe-finding family in #14373 and the accessibility epic #8706.
Investigated with AI assistance grounded in a local clone of quarto-cli (per CONTRIBUTING.md, "Using AI tools to investigate").
Steps to reproduce
Render, open in a browser.
Actual behavior
The blockquote text renders at
#747a7fon#ffffff= 4.34:1. axe-core reports:Quarto 1.10.12
[✓] Checking environment information...
Quarto cache location: /Users/charlottewickham/Library/Caches/quarto
[✓] Checking versions of quarto binary dependencies...
Pandoc version 3.8.3: OK
Dart Sass version 1.87.0: OK
Deno version 2.7.14: OK
Typst version 0.14.2: OK
[✓] Checking versions of quarto dependencies......OK
[✓] Checking Quarto installation......OK
Version: 1.10.12
Path: /Applications/quarto/bin
[✓] Checking tools....................OK
TinyTeX: v2026.04
Chrome Headless Shell: 150.0.7871.115
VeraPDF: 1.28.2
[✓] Checking LaTeX....................OK
Using: TinyTex
Path: /Users/charlottewickham/Library/TinyTeX/bin/universal-darwin
Version: 2026
[✓] Checking Chrome Headless....................OK
Using: Chrome Headless Shell installed by Quarto
Path: /Users/charlottewickham/Library/Application Support/quarto/chrome-headless-shell/chrome-headless-shell-mac-arm64/chrome-headless-shell
Version: 150.0.7871.115
[✓] Checking basic markdown render....OK
[✓] Checking R installation...........OK
Version: 4.6.0
Path: /Library/Frameworks/R.framework/Versions/4.6/Resources
LibPaths:
- /Users/charlottewickham/Library/R/arm64/4.6/library
- /Library/Frameworks/R.framework/Versions/4.6/Resources/library
knitr: 1.51
rmarkdown: 2.31
[✓] Checking Knitr engine render......OK
[✓] Checking Python 3 installation....OK
Version: 3.12.2
Path: /Users/charlottewickham/.pyenv/versions/3.12.2/bin/python3
Jupyter: 5.9.1
Kernels: python3
[✓] Checking Jupyter engine render....OK
[✓] Checking Julia installation...