Agora Theme Avatar

This project is not covered by Drupal’s security advisory policy.

Ágora Theme is the front end of a transparency portal. Contracts, grants, agreements, salaries, budgets, datasets — the registers a public body is obliged to publish and that almost nobody can actually read. This theme exists to make them readable: by a citizen on a phone, by a screen-reader user, by a keyboard user, and by a journalist sorting a table of 400 rows.

Accessibility here is a gate, not an intention. Every push runs an axe-core suite that blocks the pipeline. It has been seen red on a real missing alt attribute. A green that has never been red is a decoration, not a test.

It is a standalone theme: no base theme, no CSS framework, no build step, and not one line of JavaScript. You can install it on its own. It is designed to be installed by the Ágora Transparency site template, which places its blocks and ships the content model it renders.

▶ Launch a sandbox on simplytest.me  Get the site template

The sandbox installs the Ágora Transparency site template — a working portal with demo registers in it — and takes a few minutes to build. Installing the theme on its own gives you a correctly themed but empty Drupal, which is not what you want to look at first.


Four things the pipeline refuses to let regress

♿ The axe gate
6 pages scanned, 89 axe rules applied per page, 0 violations, across 362 assertions. Blocking, on every commit.
🎨 Every colour pair, measured
55 contrast pairs declared in the tokens themselves and checked against the ratio each one claims. 0 below threshold. Every token is paired — none can hide.
⌨️ Keyboard and focus
Visible focus everywhere, targets at the 24px floor of SC 2.5.8, and a masthead that is one tab stop rather than two.
📐 No sideways scroll
A 12-column register lives in a keyboard-reachable scroller instead of widening the document — SC 1.4.10 as a test, not a hope.

Why the suite counts what it counts

Two traps shaped this test suite, and both produce a green that is about nothing.

A rule that never ran looks exactly like a rule that passed. axe files an inapplicable rule in a bucket that reads like success. So the suite asserts how many rules were applied per page and on how many pages each critical rule actually landed — heading-order reported on 6 of 6 pages. If a rule quietly stops applying, the gate fails instead of going quietly greener.

An empty table has no accessibility problems. A view with no results renders no <table> at all, and axe then reports zero violations — truthfully, about nothing. So every table assertion is preceded by an assertion that there are rows to look at.

Typography, and why it is not on a CDN

The typeface is self-hosted and freely licensed (OFL). Never a font CDN — not for performance reasons, but because a font CDN sends every visitor's IP address to a third party on every page load. For a municipality publishing a transparency portal in the EU, that is a data-protection liability sitting inside the thing that was supposed to demonstrate accountability.

The same principle runs through the theme: no external request leaves the page. No analytics, no CDN, no remote asset.

What it renders

Registers

Exposed filters, sortable accessible tables with caption, scope and header association, pagers, and empty states that say so.

A composed front page

Drupal Canvas compatible. Hero, quick-access cards, aggregate figures, recent activity, service areas.

The furniture

Masthead of fixed height, footer link columns, breadcrumbs, status messages, page titles, prose and node pages.

16 template overrides, each with the reason it exists written above it. If a template here does something core does not, the comment says what went wrong without it.

Install

composer require drupal/agora_theme
drush theme:enable agora_theme
drush config:set system.theme default agora_theme

There is nothing to compile. The CSS ships as CSS: 5 stylesheets, no preprocessor, no package.json, no node_modules. What you read in the repository is what the browser receives.

What it deliberately does not do

  • No base theme. base theme: false. Nothing is inherited and then fought with.
  • No CSS framework. 25 colour tokens and a spacing scale, not a utility library.
  • No JavaScript. Zero files. Every interaction is a link, a form or CSS.
  • No admin theme opinions. It themes the public site; your editors keep Claro or Gin.

Project status

Stable releases from the 1.x branch, targeting Drupal ^11. Nine CI jobs run on every push — all blocking, none permissive: invariants, composer, composer-lint, cspell, eslint, nightwatch (the axe gate), phpcs, phpstan, stylelint.

Security coverage: this project is not yet covered by the Drupal Security Team's advisory policy. Opt-in is in progress and this note will be removed when it lands. Until then the banner above is accurate and you should read it.

No WCAG conformance is claimed. The theme targets WCAG 2.2 AA and the machine-checkable part is checked on every commit, which is a minority of AA. A formal conformance statement requires manual testing with real assistive technology, and it is not published yet.

Getting involved

Found something unreadable?

Accessibility reports are the ones that matter most here, and a report from someone using real assistive technology is worth more than any gate we can automate.

Open an issue

Using it for a real body?

Tell us which register broke first. This theme was designed against six register types and real bodies always have a seventh.

Share your case

Contribute

Patches, documentation and translations all help. The whole repository is public and every gate runs on your branch too.

Get involved


Licence: GPL-2.0-or-later. The typeface and every shipped image carry their licences, named in the repository — with a build script that regenerates the generated ones byte for byte, so the provenance table can be checked rather than believed.

AttachmentSize
agora_theme_banner.png844.35 KB

Project information

Releases