One architecture. Infinite design systems.

Patterns compose atoms, atoms reference tokens, themes override tokens. One source, infinite skins.

Toucan is a design system that builds design systems. Swap a single JSON file and every component, every pattern, every layout re-skins itself — no code changes, no overrides, no hacks.

Explore the system
Value Gap

Design systems have a coupling problem

Existing approaches tangle concerns, we ensure purposeful independence.

Your components shouldn't dictate your aesthetics

Component libraries ship with baked-in styling opinions. Want a different look? You're fighting the framework — overriding CSS, wrapping components, or forking the source. The visual layer and the structural layer are glued together.

Unstyled primitives are only half the answer

Headless libraries give you accessible structure but leave you to build the entire visual system from scratch. Every team reinvents token architecture, theme switching, and style composition. The hard part isn't the components — it's the system around them.

Copying components doesn't scale

Copy-paste approaches feel fast until you need a second theme, a design refresh, or cross-product consistency. Without a token cascade, every component is an island. Change the brand colour and you're updating fifty files.

Architecture

Three threads, zero entanglement

Toucan separates every design system into three independent concerns. Change one without touching the others.

Tokens

A complete token system ships out of the box — raw values, semantic aliases, and system-level component tokens, three tiers that cascade automatically. To theme it, you only override at the system level. The Wiz'rd GUI makes that even easier: pick colours, adjust spacing, and export a ready-made theme file.

Components

37 accessible React primitives emit semantic HTML, ARIA attributes, and data-* state hooks. They contain zero CSS, zero visual logic, zero animation. A Button renders a <button> with the right accessibility contract — what it looks like is entirely the token layer's job.

Interaction

Transitions, easing curves, type-ahead, drag gestures — all deferred to a dedicated motion layer. V1 components change state instantly. When the interaction thread ships, it plugs in without touching structure or aesthetics. This is what strict separation buys you.

The cascade that makes it all work

Three tiers of tokens. Each tier references the one below it. Themes override at any level.

Raw → Alias → System
// Raw: the actual value
"color": { "neutral": { "900": { "value": "#171717" } } }

// Alias: semantic meaning
"color": { "primary": { "value": "{color.neutral.900}" } }

// System: component binding
"button": { "surface": { "default": { "value": "{color.primary}" } } }
Theme overrides
// Custom theme: remap primary to blue
"color": { "primary": { "value": "{color.blue.600}" } }

// Every component that references color.primary
// re-skins automatically. Zero component code changes.
CSS output
/* Base (no theme attribute) */
:root {
  --color-primary: var(--color-neutral-900);
  --button-surface-default: var(--color-primary);
}

/* Custom theme */
[data-theme="ocean"] {
  --color-primary: var(--color-blue-600);
  /* --button-surface-default already references --color-primary */
  /* It updates automatically. That's the cascade. */
}

Most theming happens at the system level — partial JSON files that remap token references, with the CSS cascade doing the rest. When you need finer control, component-level overrides are there too — like giving input fields a white surface instead of inheriting surface-default. A theme that overrides nothing is identical to base.

37 primitives, built from scratch

Every component is accessible by default. No Radix, no Headless UI — hand-crafted ARIA, keyboard navigation, and focus management.

36 patterns. Theme-agnostic by design.

Patterns compose atoms. Their CSS uses token references, so they re-skin automatically under any theme.

How Toucan compares

Honest positioning. Every tool has strengths — here's where Toucan fits.

FeatureToucanMUIChakraRadixHeadless UIshadcn/ui
Accessible componentsHand-craftedYesYesYesYesVia Radix
Token architecture3-tier cascadeTheme objectTheme objectNoneNoneCSS variables
Theme switchingdata-theme attrThemeProviderChakraProviderN/AN/ACSS variables
Multi-theme from one sourceCore designPossible (work)Possible (work)N/AN/AManual
Structure/style separationStrictNoNoYesYesPartial
CSS strategyCustom propertiesEmotion/CSS-in-JSEmotion/CSS-in-JSNone (BYO)None (BYO)Tailwind
Framework-agnostic tokensYes (CSS vars)No (JS)No (JS)N/AN/ANo (Tailwind)
Component count3750+100+30+1655+
Bundle includes CSS runtimeNoYesYesNoNoNo
Animation systemV2Built-inBuilt-inNoneMinimalVia Tailwind
Production maturityPortfolioEnterpriseProductionProductionProductionProduction

Accessibility isn't a feature. It's the foundation.

Every component is built accessibility-first, not accessibility-patched.

Toucan's 37 components are built from scratch — no wrapper libraries, no accessibility plugins, no "add ARIA later". Every component starts from the WAI-ARIA Authoring Practices and implements keyboard navigation, focus management, screen reader announcements, and semantic HTML as the first code written, not the last.

Keyboard navigation

Full keyboard support across all interactive components. Tabs arrow between panels, dropdown menus support Up/Down/Home/End, dialogs trap focus, and Escape closes overlays. Tested against WAI-ARIA Authoring Practices.

Screen reader semantics

Semantic HTML first, ARIA attributes where HTML falls short. Every component exposes the right roles, states, and properties. LiveRegions announce dynamic changes. Labels are required, not optional.

Focus management

Custom useFocusTrap for modals and overlays. Focus returns to trigger elements on close. No focus-trapping libraries — built to understand exactly what's happening.

Automated testing

Every component runs axe-core in its test suite. 1,035 tests total, with accessibility assertions throughout. Not a checkbox — a continuous guarantee.

Two imports. That's it.

Base tokens and the components you need.

App.tsx
// 1. Load the design system's CSS foundation
import '@toucan-ui/tokens/css';

// 2. Use components
import { Button, Heading, Box } from '@toucan-ui/core';

function App() {
  return (
    <Box elevation={2} padding="lg">
      <Heading level={2}>Dashboard</Heading>
      <Button variant="primary">Get started</Button>
    </Box>
  );
}

@toucan-ui/tokens/css loads 762 design tokens as CSS custom properties plus the atom CSS that maps them to component classes. Components from @toucan-ui/core emit semantic HTML with the right classes and data-* attributes. The atom CSS does the rest.

No runtime. No CSS-in-JS. No build plugin. Just CSS custom properties and clean HTML.

What V1 doesn't do (and why)

Shipping incomplete is a feature when the boundaries are intentional.

No animation or transitions. V1 components change state instantly. No hover transitions, no enter/exit animations, no easing curves. This is intentional — the interaction thread is a V2 concern, and mixing it into V1 would compromise the strict three-thread separation that makes the architecture work.

No SSR optimization. Components work in SSR environments but haven't been optimized for streaming, selective hydration, or React Server Components. The docs site (Next.js 16) will stress-test this.

37 components, not 50+. Toucan ships the primitives that most design systems need. It doesn't include charts, date pickers, rich text editors, or virtualized lists. The architecture supports adding them — but V1 prioritizes depth over breadth.

React only (for now). Components are React 19. The token layer is framework-agnostic (CSS custom properties), and the component API contracts are documented independently of React for future Native Web Components and Flutter portability. But today, it's React.

V2 Roadmap

Interaction thread

Pluggable motion system — transitions, transforms, easing, enter/exit animations.

Additional themes

Out of the box themed verticals for use or inspiration, think marketing, e-commerce and editorial UI's.

Framework ports

Native Web Components and Flutter component packages using the same token layer.

Compound patterns

Multi-step forms, data grids, command palettes.

Design tool sync

Figma token plugin that reads the same JSON source.