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
altattribute. 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
RegistersExposed filters, sortable accessible tables with caption, |
A composed front pageDrupal Canvas compatible. Hero, quick-access cards, aggregate figures, recent activity, service areas. |
The furnitureMasthead 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_themeThere 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. |
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. |
ContributePatches, documentation and translations all help. The whole repository is public and every gate runs on your branch too. |
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.
| Attachment | Size |
|---|---|
| agora_theme_banner.png | 844.35 KB |
Project information
613 sites report using this theme
- By andresmoreno28 on , updated
This project is not covered by the security advisory policy.
Use at your own risk! It may have publicly disclosed vulnerabilities.
Releases
Presentation fixes: the masthead now reads as one block and the banner is a third shorter, and the register grid no longer treats its own explanatory sentence as a card.

