Repository navigation
paul v1.0.3
"Never build this button again." — A sticky note on a monitor in Graz, Austria
The story
paul started with a simple frustration: every new project rebuilt the same button, the same input, the same modal — slightly differently, with slightly different accessibility, slightly different dark mode. One decision made poorly, repeated everywhere.
So we built paul. One design system, one set of tokens, one accessibility standard — applied across React, Vue 3, Svelte 5, and Angular 18. Built with care (and too much coffee) in Graz, Austria.
v1.0.3 is the final release of the v1.0.x series. It ships everything: 56 accessible components across four frameworks, full APCA/WCAG 3.0 contrast compliance, EN 301 549 conformance, property-based testing, and documentation that's honest about what's done and what's still coming.
♿ The new European Standard for Inclusive Digital Products
paul is built to fully comply with EN 301 549 v3.2.1 — the technical standard underpinning the European Accessibility Act (EAA), enforceable since June 28, 2025.
It also uses the Accessible Perceptual Contrast Algorithm (APCA) from the WCAG 3.0 working draft — a more accurate, perception-based contrast model than WCAG 2.x ratios.
34/34 token pairs passing — 100% compliant
| Threshold | Use case | Equivalent |
|---|---|---|
| Lc 75 | Body text | ≈ WCAG 2.x AAA (7:1) |
| Lc 60 | Large text & UI components | ≈ WCAG 2.x AA (4.5:1) |
Two dark mode tokens adjusted to meet thresholds (lightness only — hue and saturation unchanged):
| Token | Before | After | Lc before → after |
|---|---|---|---|
--muted-foreground (dark) |
240 5% 71% |
240 5% 82.7% |
Lc 57.1 → 75.5 |
--destructive-text (dark) |
0 90% 70% |
0 90% 78.5% |
Lc 48.0 → 60.3 |
APCA validation runs automatically in CI — failures block merges.
WCAG 3.0 is a working draft. paul maintains backward compatibility with WCAG 2.2 Level AAA during the transition period.
🧰 APCA Tooling
pnpm --filter @meetpaul/tokens validate:apca # Validate all tokens
pnpm --filter @meetpaul/tokens validate:apca:json # JSON report
pnpm --filter @meetpaul/tokens recalculate:tokens # Recalculate lightness
pnpm --filter @meetpaul/tokens recalculate:tokens:dry-run # Preview only🧪 Property-Based Testing
147 tests using fast-check and vitest — Lc range, polarity, hue/saturation preservation, parser round-trips, and error handling. All passing.
🖼️ 56 Accessible Components — 4 Frameworks
Every component ships in React, Vue 3, Svelte 5, and Angular 18 with full parity.
Accordion · Alert · AlertDialog · AspectRatio · Avatar · Badge · Button · ButtonGroup · Calendar · Card · Carousel · Chart · Checkbox · Collapsible · Combobox · Command · ContextMenu · DataTable · DatePicker · Dialog · Drawer · DropdownMenu · Empty · Field · Form · HoverCard · Input · InputGroup · InputOTP · Kbd · Label · Menubar · NavigationMenu · Pagination · Popover · Progress · RadioGroup · ResizablePanels · ScrollArea · Select · Separator · Sheet · Sidebar · Skeleton · Slider · Sonner · Switch · Table · Tabs · Textarea · Toast · Toggle · ToggleGroup · Tooltip · Typography
🔐 Accessible Authentication Patterns (WCAG 3.3.8)
| Pattern | Description |
|---|---|
InputOTP |
autocomplete="one-time-code", single real <input>, slots aria-hidden |
MagicLink |
Password-free, autocomplete="email", aria-live="polite" state announcements |
PasskeyButton |
WebAuthn/biometric, aria-busy, live-region for success/error/unsupported |
HoneypotField |
CAPTCHA-free bot prevention, aria-hidden, tabindex="-1" |
📏 Touch Target Compliance (WCAG 2.5.5 — 44×44 px)
All interactive elements audited and fixed across all four frameworks — Slider, Toggle, TabsList, Button icon variant, Calendar day cells, and Pagination all meet the 44×44 px minimum.
🎨 Multi-Framework Storybook
Four independent Storybook apps composing into a single hub — 56 stories each for React, Vue 3, Svelte 5, and Angular 18.
📦 Packages
| Package | Version |
|---|---|
@meetpaul/tokens |
1.0.3 |
@meetpaul/ui |
1.0.3 |
@meetpaul/ui-vue |
1.0.3 |
@meetpaul/ui-svelte |
1.0.3 |
@meetpaul/ui-angular |
1.0.3 |
🚀 Install
npm install @meetpaul/tokens # Tokens only
npm install @meetpaul/ui # React
npm install @meetpaul/ui-vue # Vue 3
npm install @meetpaul/ui-svelte # Svelte 5
npm install @meetpaul/ui-angular # Angular 18⚠️ Breaking Changes
None.
Full changelog: CHANGELOG.md · Built with care in Graz by @SirPauls