Ágora Transparency Theme
Ágora Theme is a front-end theme designed for the Ágora Transparency site template. It focuses on accessibility, meeting WCAG 2.2 AA standards, and includes self-hosted fonts, accessible tables and forms, and supports Drupal Canvas.
Á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 long table.
Accessibility here is a gate, not an intention. Every push to the 1.x branch runs an axe-core suite that blocks the pipeline. It has been seen red: an image with no
altattribute, pushed on purpose to test the gate, failed the pipeline, and the log named the rule. A green that has never been red is a decoration, not a test.
It is a standalone theme: no base theme, no CSS framework and no build step, and its only script loads only where a table needs it. 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 types and registers it renders.
Site template: Ágora Transparency
Four things the pipeline refuses to let regress
The axe gateTest pages covering the front page, registers, record pages, forms and the sign-in page are scanned with axe-core in headless Chrome, with axe's target-size rule for WCAG 2.2 switched on. A single violation fails the job, and the job blocks the pipeline. Every colour pair, measured
Each colour token declares the foreground-and-background pairs it may be used in, and every pair is checked against the contrast ratio it claims — one of WCAG's own two thresholds. A pair below its threshold fails the pipeline. Every token is paired — none can hide. Keyboard and focus
Visible focus everywhere, targets sized to SC 2.5.8 and checked on every scanned page, and a site logo and name that are one link — one tab stop rather than two. No sideways scroll
A register wider than the screen scrolls inside its own keyboard-reachable box instead of widening the page, and a link the box shows only in part is brought wholly into view when it takes keyboard focus — SC 1.4.10 as a test, not a hope.
Every run prints its own figures — pages scanned, rules run on each page, colour pairs measured — in the pipelines for the 1.x branch.
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 prints how many rules axe ran on each page, and asserts that the rules it depends on — heading-order and target-size — ran and passed on every page it scanned. If one of them 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 check on a table also requires rows to be present, and an empty result fails the gate instead of passing it.
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. 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
Hero, quick-access cards, aggregate figures, recent activity and service areas. For pages built in Drupal Canvas, it ships its own components: heading, text, section and group.
The furniture
A masthead that keeps one height from page to page, footer link columns, breadcrumbs, status messages, page titles, prose and node pages.
Every template carries the reason it exists, written in a comment above its markup. 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: no preprocessor, no package.json, no node_modules, and the one script ships as written. The files in the repository are the files Drupal loads.
What it deliberately does not do
- No base theme.
base theme: false. Nothing is inherited and then fought with. - No CSS framework. Colour tokens and a spacing scale, not a utility library.
- No script where there is no table. The only script the theme loads,
js/table-scroll.js, is attached only where a table is drawn inside the theme's table scroller. When a link or control in the scroller takes keyboard focus, it scrolls that element wholly into view; it never moves the table under a mouse pointer, and it depends on nothing, not even Drupal's own JavaScript. Without JavaScript the table still works: the scroller is a tab stop and scrolls with the arrow keys. Everything else 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. Every push to 1.x runs the pipeline on git.drupalcode.org — a Composer build and validation, PHP syntax checks, PHP coding standards and static analysis, spelling, CSS and JavaScript linting, PHP tests, the repository's own invariants and the axe gate — and every job in it is blocking; none is allowed to fail. Each run's figures are in its pipeline log.
Security coverage: stable releases of this project are covered by the Drupal Security Team's advisory policy.
No WCAG conformance is claimed. The theme targets WCAG 2.2 AA. Automated checks — axe and the contrast checker — run on every push, and they cover only part of AA. A formal conformance statement requires manual testing with real assistive technology, and none has been published.
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 the registers the Ágora Transparency site template ships, and real bodies always have one more.
Contribute
Patches, documentation and translations all help. The whole repository is public, and the same pipeline runs on every merge request.
Licence: GPL-2.0-or-later. The theme ships no photographs. Its typeface ships with its own licence text, and the README names the licence and source of every third-party asset in the package — the typeface and the social-network icons in the footer — so their provenance can be checked rather than believed.
Depends on
Dependencies of the latest stable release
No dependencies recorded for this project.
Required by
Tracked projects that depend on this one
No tracked projects depend on this one yet.
Activity
Release Timeline
Releases
| Version | Type | Core | Release date | |
|---|---|---|---|---|
| 1.2.1 | Stable | 11 | Sep 24, 2026 | |
| 1.2.0 | Stable | 11 | Sep 23, 2026 | |
| 1.1.0 | Stable | 11 | Sep 5, 2026 | |
| 1.0.7 | Stable | 11 | Sep 1, 2026 | |
| 1.0.6 | Stable | 11 | Aug 31, 2026 | |
| 1.0.5 | Stable | 11 | Aug 27, 2026 | |
| 1.0.3 | Stable | 11 | Aug 27, 2026 | |
| 1.0.2 | Stable | 11 | Aug 26, 2026 | |
| 1.0.1 | Stable | 11 | Aug 26, 2026 | |
| 1.0.0 | Stable | 11 | Aug 25, 2026 |