Lens Design System

A code-truthful spec for a cross-browser accessibility extension. The palette is warm parchment + forest green — low-contrast fatigue at the system level. The typeface is Atkinson Hyperlegible, designed by the Braille Institute for readers with low vision. Every token maps to a real value in src/tokens.css and the live site CSS; when code and this doc disagree, code wins.

1 font family 8 color-blindness filters 3 themes in tokens v1.0
01 · Identity

The extension that knows you.

Lens is a profile that travels with you. Three principles hold the design together — break any one and it stops feeling trustworthy.

Profile-first, always.Every visual decision flows from the user's stored profile, not a house style. The design defers to the person.
Legibility over beauty.Atkinson Hyperlegible is chosen for its low-vision benefit, not aesthetics. The right technical choice happens to look clean.
Trust through transparency.Sensitive-domain pausing, explicit consent, a clear "show original" toggle. The extension never acts without showing you it is.
02 · Color

Forest green on warm parchment. Never cold white.

The palette reduces eye strain at the system level: warm parchment replaces harsh white; near-black ink replaces pure black; forest green communicates trust without the clinical coldness of a standard blue primary.

Backgrounds — warm parchment

Canvas
#faf9f5
Page wash, popup background
Surface soft
#f5f0e8
Settings sections, hover
Parchment card
#efe9de
Card surfaces, stage bg

Text — near-black scale

Ink
#141413
Primary titles, headings
Body strong
#3d3d3a
Body text, descriptions
Muted
#6c6a64
Captions, helper labels

Brand — forest green family

Forest
#2a4d3a
Primary CTA, active states
Mid forest
#4a6f5a
Hover, secondary brand
Sage
#b4cbc3
Button bg, "show original"
Sage soft
#d8e6db
Tinted cards, filter badges
Success
#5b8d6a
Saved, confirmed state
Error
#b34a3a
Errors, dangerous actions
03 · Typography

Atkinson Hyperlegible — the accessible choice is the right choice.

Designed by the Braille Institute specifically for readers with low vision. Exaggerated letterform distinctions — I vs l vs 1, O vs 0 — reduce misreads without looking clinical. It's the only typeface that earns a spot in an accessibility product on merit, not aesthetics. JetBrains Mono appears only on system-flavoured labels.

Atkinson Hyperlegible 700Display · hero headings
Your profile, every page.
Atkinson Hyperlegible 700Panel header · popup title · 28px
Adapt this page
Atkinson Hyperlegible 400Body · settings · instructions · 16px
Adjust font size, contrast, and colour filters to match your reading profile. Changes apply instantly and persist across every site you visit.
JetBrains Mono 600Micro · eyebrows · version tags · 11px
MV3 · CLOUDFLARE WORKERS · v1.0
04 · Spacing

A 4 px base scale.

Eight steps, doubling loosely from 4 px to 96 px section rhythm. Mirrors the --lens-space-* tokens in the shipped src/tokens.css.

sp-xxs
4px
sp-xs
8px
sp-sm
12px
sp-md
16px
sp-lg
24px
sp-xl
32px
sp-xxl
48px
sp-section
96px
05 · Radius

Soft but not ambiguous — corners stay legible.

Four steps from pill to chip. Soft enough to reduce visual sharpness on high-contrast displays; distinct enough that buttons and cards keep their shape.

Pill Tags, badges, nav links
r-pill · 9999px
Card Panels, popup container
r-card · 16px
Button Primary and ghost CTAs
r-btn · 12px
Chip Small labels, filter badges
r-chip · 6px
06 · Elevation

Shadows are near-black alpha — never grey, never blue.

On a warm parchment canvas, grey shadows read as clashing cool tones. Near-black alpha (--shadow-rgb: 20, 20, 19) keeps every surface feeling like it belongs on the same warm page.

sh-sm
sh-card
glow-forest
glow-sage
07 · Components

The popup, buttons, and filter badges.

Key components rendered on the parchment stage — what a user sees when they click the Lens toolbar icon.

Buttons

Extension popup

Color-blindness filter badges (8 supported)

Deuteranopia Protanopia Tritanopia Achromatopsia Protanomaly Deuteranomaly Tritanomaly Achromatomaly
08 · Motion

Motion that explains what happened, nothing more.

Short, purposeful, never decorative. With prefers-reduced-motion on, every animation here collapses to a plain opacity fade — a hard requirement for a product used by people with vestibular disorders.

Streaming in paragraphs cascade in as SSE delivers them
Saved
Profile save text scales 1 → 1.15 → 1, 300ms
Popup open scales 0.94 → 1, fades in, 220ms
Toggle on thumb slides + brief pulse, 180ms
09 · Voice

Plain, calm, honest. No medical language.

The copy respects the user without medicalising them. "Adapted for your reading profile" rather than "disability accommodation." Straightforward, lowercase-comfortable, and clear about what Lens is and isn't doing.

We say

"Adapted for your reading profile."

"Lens is paused here for your safety."

"Show original" — not "disable Lens"

We don't say

"Accessibility mode enabled."

"Disability settings applied."

"Warning: this page may not be accessible."

10 · Doing it wrong

Five ways to break the trust.

If a new screen does any of these, it isn't Lens anymore.

  • Don't use a pure-white background. #ffffff creates the eye strain Lens was built to reduce. Always use the warm parchment canvas.
  • Don't use grey shadows. All shadows use near-black alpha. Grey turns the warm canvas cold.
  • Don't substitute another typeface for the extension UI. Atkinson Hyperlegible is non-negotiable for Lens's own chrome. The user's reading view is a different matter — they may choose their font.
  • Don't send content to the backend passively. Adaptation only runs on explicit user action. No background scanning, no passive observation, no "improving the experience" data collection.
  • Don't adapt sensitive domains by default. The hardcoded block list exists for a reason. No new feature should silently override it.
11 · Source of truth

Where every token actually lives.

This page documents the system; the shipped CSS defines it. When they disagree, code wins.

Tokenssrc/tokens.css
Extensionsrc/ — content, popup, options, onboarding
Color filterssrc/color-blindness.css
Backendbackend/src/worker.js
Site CSSsite/index.html <style>
Live sitesite-steel-alpha.vercel.app → Live design pagesite-steel-alpha.vercel.app/design/ →