TRM Labs · 2023 – 2026
An accessible design system, proposed and adopted
Repeated accessibility fixes in our Ant Design usage made the case for our own system. I proposed and built it on Radix UI and Tailwind; all new UI is built on it.
- Role
- Proposed and built
- Stack
- React, Radix UI, Tailwind CSS, ARIA, Playwright
- built on the design system he proposed
- All new UI
Context
TRM’s UI was built on Ant Design. As a government contract brought accessibility audits, the same problems kept coming back: focus that disappeared, controls a keyboard couldn’t reach, tab order that jumped around. Each fix was local, so the next screen had the same bug.
Decision
I proposed an in-house design system, built on Radix UI primitives and Tailwind CSS.
- Radix for behaviour. Headless primitives give us focus management, keyboard support and ARIA semantics that are already correct, so we style components instead of re-implementing accessibility.
- Our own styling. Tailwind tokens keep the components consistent with TRM’s product, not a library’s defaults.
- No big-bang migration. All new UI is built on the system; existing screens move over incrementally. The product never froze for a rewrite.
Accessibility as a feature
For the government contract I built keyboard-first data tables:
- A roving tabindex, so the table is one Tab stop and arrow keys or WASD move between cells.
aria-liveannouncements, so screen-reader users hear where they are.- An overlay that lets users discover the shortcuts.
I also fixed semantics, tooltip focus and tab order across navigation and side panels. Checks combined browser audits, Deque tooling, team review and automated tests.
Listening to users
When the first dark mode shipped, customers and colleagues found it too dark. I prototyped Dark Reader-style controls in several variants and put them in front of people; most preferred a simple “Dim” option over a panel of sliders. Prototyping cheaply first kept us from shipping complexity nobody wanted.
Impact
- All new UI at TRM is built on the design system.
- Keyboard and screen-reader support became part of the components, instead of a per-screen chore.
The homepage audits a panel live: keyboard reach, unlabeled controls and WCAG contrast, before and after.