Accessibility That Survives Rebrands: Tokens, Testing, and Governance for Inclusive UI Libraries
Most accessibility regressions don’t happen because teams don’t care—they happen because rebrands change the inputs, and accessibility isn’t encoded in the system. Here’s how to make inclusive behavior part of your UI library’s source of truth with tokens, component contracts, and CI-backed governance.
A rebrand shouldn’t be able to break your product’s accessibility—but in most organizations, it absolutely can.
New colors roll out. Focus rings get “cleaned up.” Motion gets “more delightful.” Spacing tightens to match the new visual identity. And suddenly: contrast fails, keyboard users get lost, reduced-motion users get nauseated, and support tickets spike.
The fix isn’t another one-off audit right before launch. The fix is treating accessibility like infrastructure—something you encode into the system so it survives redesigns, reskins, and agency handoffs.
If accessibility lives in guidelines, it will be forgotten. If it lives in tokens, contracts, tests, and governance, it will endure.
Why accessibility fails during redesigns (even with good intentions)
Redesigns introduce risk because they change the variables that accessibility depends on:
- Color and contrast (brand palette updates, new neutrals, new “subtle” text styles)
- Focus visibility (design trends that minimize outlines)
- Motion and microinteractions (more animation, scroll effects, parallax)
- Density and spacing (more compact layouts, smaller hit targets)
- Component variations (new button styles, new inputs, new navigation patterns)
The deeper issue: many teams treat accessibility as a layer applied to UI rather than a property of the UI system itself.
When accessibility is enforced only through:
- a Figma checklist,
- a Confluence page,
- or a quarterly audit,
…it’s easy for changes to slip through during high-pressure launches.
Concrete takeaway
If you want accessibility to survive a rebrand, you need three things:
- Tokens that encode accessible constraints (not just aesthetics)
- Component contracts that define non-negotiable behavior
- Testing + governance that prevents regressions from merging
Design tokens as accessibility infrastructure
Design tokens are often introduced as a way to scale theming: “Change the brand color once, update everywhere.” That’s useful—but incomplete.
To make accessibility durable, tokens must encode guardrails, not just values.
Tokenize contrast (not just colors)
A common anti-pattern: token sets like color.primary.500 and color.text.muted, with no explicit relationship to the surfaces they sit on.
A more resilient approach: define tokens by role and pairing, such as:
color.text.defaultcolor.text.onAccentcolor.surface.defaultcolor.surface.elevatedcolor.border.subtlecolor.action.primary.bgcolor.action.primary.fg
Then enforce contrast requirements at the token relationship level.
Practical pattern: maintain “on-*” tokens (onSurface, onAccent) so text/icon colors are always chosen in context.
Tools that help:
- Style Dictionary (Amazon) for multi-platform token builds
- Tokens Studio (Figma) for authoring and syncing
- Leonardo or Color.js for contrast-aware palette generation
Treat contrast like a dependency graph: foreground tokens depend on background tokens, not brand taste.
Tokenize focus as a first-class visual system
Focus styling is one of the first things “cleaned up” in redesigns.
Make it hard to remove by defining explicit tokens:
focus.ring.colorfocus.ring.widthfocus.ring.offsetfocus.ring.radiusfocus.ring.shadow(optional)
And define rules for when focus appears:
- Use
:focus-visibleby default - Provide a fallback for browsers without
:focus-visible(progressive enhancement) - Never set
outline: nonewithout an accessible replacement
Tokenize motion with user preferences built in
Motion isn’t just “duration and easing.” It’s a cognitive and vestibular accessibility concern.
Define motion tokens that explicitly support reduced motion:
motion.duration.fast | base | slowmotion.easing.standard | emphasized | linearmotion.scale.enter | exit(if you use transforms)motion.enabled(a conceptual token mapped toprefers-reduced-motion)
Then implement a system-level rule:
- When
prefers-reduced-motion: reduce, disable non-essential motion and avoid scroll-linked effects.
Tokenize spacing with minimum hit targets in mind
Spacing tokens typically serve layout consistency. For accessibility, they also enforce:
- Tap target size (WCAG 2.2 introduces target size guidance)
- Readable density (avoid overly compact UI that increases error rate)
Add tokens that encode minimums:
size.control.minHeight(e.g., 44px)size.control.minWidthspace.control.paddingInlinespace.control.paddingBlock
Concrete takeaway
If tokens only represent brand values, a rebrand can break accessibility. If tokens represent accessible roles and constraints, a rebrand becomes a controlled parameter change.
Component contracts: what every UI piece must guarantee
Tokens prevent many visual regressions, but accessibility also lives in behavior: keyboard interaction, semantics, and assistive tech support.
A design system needs component contracts—a published, testable set of guarantees.
The “non-negotiables” checklist
For every component, define (and document) at least:
-
Keyboard behavior
- Tab order
- Arrow key behavior (where applicable)
- Escape to dismiss
- Enter/Space activation
-
Semantics
- Correct native element choice (button vs div)
- Landmarks and headings where relevant
-
ARIA (only when necessary)
- Use ARIA to enhance, not replace native semantics
- Required attributes and states (expanded, selected, disabled)
-
Focus management
- Where focus goes on open/close
- Focus trapping (dialogs)
- Focus restoration
-
States
- Disabled vs read-only
- Error/success messaging and association
- Loading states (and announcement strategy)
Example: Button contract
A Button component contract might include:
- Must render a native
<button>by default - Must support
type="button" | "submit" | "reset" - Must have a visible focus indicator meeting contrast requirements
- Must have disabled semantics (
disabledattribute, not just styling) - Must not rely on color alone to convey state
Example: Modal/Dialog contract
For a Dialog:
- Must use
role="dialog"(oralertdialogwhen appropriate) - Must set
aria-modal="true" - Must have an accessible name (
aria-labelledbyoraria-label) - Must trap focus while open
- Must close on Escape (unless there’s a strong reason)
- Must restore focus to the trigger on close
If you don’t want to reinvent this, study proven implementations:
- Radix UI (robust primitives)
- React Aria (Adobe) for behavior-first components
- Headless UI for accessible patterns (with styling freedom)
Avoid “ARIA drift” during rebrands
Rebrands often introduce “just a wrapper” components. That’s where semantics get lost.
Prevent drift by:
- banning
div/spanclick handlers without role + keyboard handling - requiring an explicit justification when deviating from native elements
- providing a
Polymorphicpattern carefully (e.g.,asChild) with guardrails
Accessibility isn’t a feature of the page. It’s a property of the components you ship.
Concrete takeaway
Write component contracts like you’d write API contracts. If behavior isn’t specified, it will be broken—especially when visuals change.
Testing and CI: catching regressions early
If tokens and contracts are the blueprint, tests are the enforcement.
A resilient stack usually includes four layers:
1) Unit/integration tests for behavior
Use Testing Library (React Testing Library, Vue Testing Library, etc.) and test like a user:
- can it be reached by Tab?
- does Enter/Space activate it?
- does Escape close it?
- does focus move correctly?
For complex widgets, add keyboard interaction tests (e.g., arrow key navigation in menus).
2) Automated accessibility checks (axe)
Integrate axe-core via:
jest-axefor component tests- Playwright + axe for end-to-end flows
Be realistic: axe catches a lot (missing labels, color contrast in some contexts, ARIA misuse), but not everything.
3) Visual regression testing
Rebrands are visual by nature, so you need visual diffs.
Options:
- Chromatic (great with Storybook)
- Percy
- Playwright screenshots
Key move: include stories for accessibility states:
- focus visible
- hover
- active
- disabled
- error
- high-contrast theme (if supported)
4) Manual audits (targeted, scheduled)
Manual review still matters for:
- screen reader experience (VoiceOver/NVDA/JAWS)
- cognitive load and clarity
- motion comfort
- real keyboard usability (not just “it tabs”)
A pragmatic cadence:
- lightweight checks for every major release
- deeper audits for redesign milestones
CI gates that actually work
A common failure mode is running checks but not enforcing them.
Make accessibility a merge-blocker by:
- failing builds on critical axe violations
- requiring Storybook visual diffs approval
- enforcing lint rules (see governance section)
Concrete takeaway
The goal isn’t “test everything.” It’s “make it impossible to unknowingly ship known failure modes.”
Motion, microinteractions, and inclusive UX
Motion is where “brand expression” and accessibility collide.
Used well, motion provides clarity: what changed, what’s interactive, what just happened. Used poorly, it causes distraction, nausea, and fatigue.
Respect reduced motion by design (not as an afterthought)
Implement reduced motion at the foundation:
- Wrap animation definitions in a motion utility that checks
prefers-reduced-motion - Provide alternate transitions (fade instead of parallax; instant instead of spring)
Avoid the trap of simply setting durations to near-zero. Some motion types (scroll-linked transforms, zooming backgrounds) should be removed entirely.
Reduce cognitive load in microinteractions
Microinteractions should:
- reinforce state changes (selected, expanded, saved)
- avoid constant movement (looping animations, shimmering placeholders without stop)
- avoid surprise (unexpected layout shifts)
If you use skeleton loaders, ensure they:
- don’t pulse aggressively
- stop when content is ready
- respect reduced motion preferences
Be careful with scroll effects
Scroll-linked animation is trendy and often problematic:
- can create motion sickness
- can reduce readability (text moving at different speeds)
- can harm performance (which is an accessibility issue)
Rule of thumb:
- keep scroll effects subtle
- never tie critical navigation or reading to scroll-driven transforms
- provide a reduced-motion fallback that removes the effect
Concrete takeaway
Motion is part of accessibility. Treat it like color: tokenized, constrained, and tested.
Governance model for teams and agencies
Governance is what keeps your system intact when new teams, vendors, or deadlines enter the picture.
A rebrand often involves outside contributors. Without governance, they’ll unknowingly bypass your accessibility infrastructure.
Contribution rules that prevent regressions
Create a contribution checklist that includes:
- updated/added tokens (if new visual roles are introduced)
- updated component contract (if behavior changes)
- new/updated stories (including focus + error states)
- passing axe checks
- passing visual regression
- keyboard walkthrough completed
This becomes your Definition of Done for UI changes.
Linting and static analysis
Automate the boring (and high-signal) rules:
- eslint-plugin-jsx-a11y (React)
- framework-specific accessibility linters where available
- stylelint rules to prevent
outline: nonewithout replacement
You can also add custom lint rules for your system, like:
- disallowing raw
<a>withouthref - disallowing
onClickon non-interactive elements - requiring your
TextFieldwrapper instead of ad-hoc inputs
Decision-making: who can change accessibility-critical tokens?
Not all tokens are equal. Some are brand-flexible; others are safety rails.
Define token tiers:
- Tier 1 (guardrail tokens): focus ring, minimum sizes, on-surface text colors, error colors, motion defaults
- Tier 2 (brand tokens): accent palette, radii, shadows, typography scale
Require higher review standards for Tier 1 changes:
- accessibility owner approval (design + engineering)
- documented rationale
- proof via tests (contrast reports, focus visibility screenshots)
Keep a visible accessibility changelog
When teams can see what changed, they can anticipate impact.
Add an “Accessibility Notes” section to release notes:
- behavior changes (keyboard, focus)
- semantic changes
- new constraints or tokens
Concrete takeaway
Governance isn’t bureaucracy—it’s how you scale quality across time, teams, and rebrands.
Conclusion: Make accessibility part of the system, not the sprint
If you want accessibility that survives rebrands, stop relying on memory and good intentions. Encode it.
- Use tokens to lock in contrast, focus, motion, and minimum spacing.
- Define component contracts so semantics and keyboard behavior are non-negotiable.
- Build a testing stack (unit + axe + visual regression + manual audits) that catches regressions before they ship.
- Treat motion as a first-class accessibility surface.
- Establish governance so changes are reviewed, enforced, and documented.
The result is a UI library that can evolve visually without breaking the people who rely on it.
Call to action
If you’re planning a redesign or rebrand this quarter, run a quick readiness check:
- Do we have focus and motion tokens (not just colors)?
- Do our core components have written keyboard/ARIA contracts?
- Can CI fail a PR for accessibility regressions?
- Do we have a defined owner and Definition of Done for UI changes?
If any answer is “not yet,” that’s your roadmap. Build the accessibility source of truth now—so you don’t have to keep re-fixing the same problems every time the brand changes.
