a11y: all `about` templates render the title block, image, and links outside `<main>`

Open
#14,605 0 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
74/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Quiet
Tech stack
typescript

Research direction

Start with src/project/types/website/about/website-about.ts around lines 301-357, then inspect the templates under src/resources/projects/website/about. Reproduce the issue with the linked minimal website and compare the about output with a normal page. Done means all five templates keep the title block, image, and links within the single main landmark and the three axe violations no longer occur.

Written by the indexing model from the issue text.

Description

accessibility bug html
I have:
  • searched the issue tracker for similar issues
  • installed the latest version of Quarto CLI
  • formatted my issue following the Bug Reports guide
Bug description

On a website page that uses an about: template, the about chrome — the title
block (#title-block-header), the profile image, and the links — is rendered
outside the page's <main> landmark. This produces three axe-core
violations on every built-in about template (jolla, trestles, marquee,
solana, broadside):

  • landmark-no-duplicate-banner#title-block-header is a <header> that is
    no longer nested in <main>, so it implicitly becomes a second banner
    landmark alongside the navbar's #quarto-header.
  • landmark-unique — the two banners have no distinguishing accessible name.
  • region — the image and links sit outside every landmark.

An otherwise identical page with no about: has none of these: there the title
block renders inside <main> (so it is not a banner), and there is no stray
image/links.

This is related to #14375 / #14376 / #14377, but a distinct code path: those
arise from a listing page with title-block-banner: true, whereas this comes
from the about post-processor re-emitting the title block as a sibling of
<main>. The element targets (.about-image / .about-links) are not the ones
listed in #14377.

I traced the cause to the about post-processor and the EJS templates. It lifts
#title-block-header out of the DOM and captures <main class="content"> as a
string, then each template emits the title (a <header>), the image, and the
links as siblings of <main> inside a plain <div class="quarto-about-*">:

Investigation was AI-assisted and grounded in a local clone of quarto-cli
(per CONTRIBUTING.md, "Using AI tools to investigate").

Steps to reproduce

Full reproducible website (one page per template + a control):
https://github.com/cwickham/quarto-about-template-a11yquarto preview
and open any page to see the axe report overlay.

Minimal version — a two-file website project (the navbar supplies the first
banner, so a website project is needed to surface landmark-no-duplicate-banner):

_quarto.yml

project:
  type: website
website:
  navbar:
    right:
      - text: Home
        href: index.qmd
format:
  html:
    axe:
      output: document

index.qmd

---
title: "Alicia"
subtitle: "Data Scientist"
image: profile.jpg
image-alt: "A descriptive alt text"
about:
  template: jolla
  links:
    - icon: github
      text: Github
      href: https://github.com
---

A little bit about me.

Then quarto preview and open the page. Swapping template: to trestles,
marquee, solana, or broadside reproduces the same three violations.

Actual behavior

All five about templates emit the title block, image, and links outside
<main>, producing three violations each:

Template landmark-no-duplicate-banner landmark-unique region
(no about)
jolla img, .about-links
trestles img, .about-links
marquee .about-image-container, .about-footer
solana .about-links, img
broadside .about-links (image is a CSS background)

The page body itself stays inside <main> on every template — only the title
block, image, and links are stranded outside it.

Expected behavior

The about page's title block, image, and links are page-specific primary
content, not site chrome. They should be contained within the page's single
<main> landmark
, and the navbar should be the only banner — matching
the structure of a normal (non-about) Quarto page, where #title-block-header
already renders inside <main>. With that, none of the three violations fire.

Your environment
  • IDE: n/a — reproduced with the Quarto CLI directly from the terminal (editor: Positron)
  • OS: macOS 26.5.1 (build 25F80)
Quarto check output
Quarto 1.10.8
[✓] 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.8
      Path: /Applications/quarto/bin

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

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

[✓] Checking Chrome Headless....................OK
      Using: Chrome found on system
      Path: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
      Source: MacOS known location

[✓] Checking basic markdown render....OK
[✓] Checking R installation...........OK
      Version: 4.6.0
      knitr: 1.51
      rmarkdown: 2.31
[✓] Checking Knitr engine render......OK
[✓] Checking Python 3 installation....OK
      Version: 3.12.2
      Jupyter: 5.9.1
      Kernels: python3
[✓] Checking Jupyter engine render....OK
[✓] Checking Julia installation.......OK
Dominant language
JavaScript
Stars
6k
Forks
458
Avg merge
1d 9h
Merged PRs (30d)
41

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.

More from quarto-dev/quarto-cli

All issues in quarto-dev/quarto-cli

Similar issues

More JavaScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.