F6Shipped
Accessibility
WCAG 2.2 AA target for all Charply surfaces. Radix handles component behavior — this foundation covers design rules, keyboard expectations, and extension constraints.
Our approach
Accessible components are the baseline. Full journeys — sign in, generate, insert reply — still need keyboard testing and correct composition in each screen.
Design-time
Contrast, labels, hierarchy, touch targets
Components
Radix primitives, focus rings, ARIA defaults
Surfaces
Popup, side panel, content script isolation
Design considerations
Visuals
- •Do not use color alone — pair errors with text and icons
- •Check contrast in both light and dark themes
- •Extension supporting text: 12px min; body: 14px
Interaction
- •Design focus, hover, active, selected, and disabled states
- •Disabled controls leave tab order — put help on adjacent active elements
- •One primary action per surface
Comprehension
- •Visible labels on every form field
- •Logical heading hierarchy per panel
- •Descriptive button and link text
Extension surfaces
- •Dense popup (450×600) — scannable headings, short copy
- •Content scripts must not break host page semantics
Engineering considerations
Prefer semantic HTML and Radix
import { Button, Dialog, DialogTitle, Label, Input } from "@charply/design"
<Label htmlFor="email">Email</Label>
<Input id="email" type="email" aria-invalid={hasError} />
{/* DialogTitle is required for screen readers */}
<DialogTitle>Confirm delete</DialogTitle>Keyboard navigation
| Component | Expected behavior |
|---|---|
| Button / Link | Enter / Space activates |
| Tabs | Arrow keys navigate; Home / End jump |
| Switch | Space toggles when focused |
| Dialog | Escape closes; Tab cycles within |
| Tooltip | Shows on focus; supplemental only |
Content scripts
Extension isolation rules
- Scope theme to
.webreply-theme-*only - Never set
:rootorbodystyles - Portal UI must be focusable and labeled
- No global CSS resets in host pages
Guidelines
docs/design/foundation/accessibility.mdDo
- ✓Test popup and side panel flows with keyboard only before shipping
- ✓Include `DialogTitle` in every dialog
- ✓Use `EmptyState` with clear title + action for zero-data views
- ✓Run contrast checks when introducing new surface color combinations
Don't
- ✗Use placeholder as the only field label
- ✗Remove focus rings without an accessible alternative
- ✗Import full Tailwind preflight into content scripts
- ✗Rebuild Dialog/Tabs/Switch behavior outside Radix
- ✗---