Jaime Burbano
Menu

Earth Design System

A 3-package, WCAG 2.1 AA design system built from scratch at FrankCrum and adopted by 2 product teams — cutting frontend delivery time 30–40%.

UX Engineer · -
Earth Design System

Problem

Two product teams (~10 engineers) were shipping inconsistent UI with duplicated components, each with its own accessibility gaps and visual drift, and no shared source of truth to design or build against — every new feature meant re-litigating the same styling and interaction decisions.

Solution

Architected Earth from scratch as three packages: earth (CSS tokens for cross-framework reuse), earth-react (~50 components across foundations, navigation, layout, and utilities), and earth-form (15 form components with Zod and React Hook Form wired in internally — validation, error handling, and field state managed for consumers). Enforced WCAG 2.1 AA across every component, audited with Axe and validated with screen readers and full keyboard navigation, and backed it with behavior-focused unit tests so teams could adopt without coordination overhead.

30–40% faster

Frontend delivery time

50+

Components shipped

2 (~10 engineers)

Teams adopted

Tech stack

ReactTypeScriptStorybookTailwindZodReact Hook FormFigma

Architecture

Earth ships as three separate packages instead of one monolith, each with a distinct job:

  • earth — framework-agnostic CSS tokens (color, spacing, radius, typography) so the same visual language works outside React too, wherever FrankCrum needs it.
  • earth-react — ~50 components consuming those tokens, organized into eight categories: Foundations (colors, typography, spacing, radius, logo), Form (button, input, select, combobox, date picker, switch, chip, and more base primitives), Feedback (alert, toast, dialog, drawer, popover, tooltip, spinner), Data Display (tag, table, avatar, divider, stacked data), Navigation (tabs, breadcrumbs, pagination, stepper, sidebar, menu), Surfaces (card, accordion, footer, bottom sticky bar), Layout, and Utilities.
  • earth-form — 15 field-level components (text, number, phone, SSN, bank account, date, file upload, combobox, and more) that wrap earth-react’s form primitives with React Hook Form registration, Zod validation, and input masking already wired in.

The split matters in practice: a team building a simple marketing page pulls only earth and a handful of earth-react primitives, while a team building a data-heavy internal tool pulls in earth-form and gets validation, masking, and accessible error states for free instead of assembling React Hook Form, Zod, and IMask by hand for every field.

Design tokens

Every component traces back to a small set of tokens rather than one-off values: a brand color scale (primary, secondary, tertiary, each with its own foreground pairing) plus semantic text and surface tokens. Change a token and every consuming component updates — no find-and-replace across two codebases.

Brand color palette — primary, secondary, and tertiary tokens

General color palette — text, surface, and border tokens

Button color palette built on top of the same tokens

A shared semantic language

Status and category components — alerts, tags, form errors — all speak the same six-variant vocabulary: Neutral, Informational, Guidance, Error, Warning, Success. A warning reads as a warning whether it shows up in a banner, a tag, or a validation message, instead of every team inventing its own shade of “something’s wrong.”

Alert component showing all four status variants

Tag component variants using the same shared semantic palette

Typography and navigation primitives

The type system runs on a defined scale — headings, headlines, subtitles, body, and label styles — all built on Inter, so a heading in one product looks and behaves like a heading in another.

Earth's typography scale, from heading-1 down to label

Navigation components follow the same discipline. The Stepper, for example, renders a three-state progress flow (default, current, complete) with full keyboard support and aria-current="step" wired in — one of several navigation primitives (tabs, breadcrumbs, pagination, sidebar) built as real semantic HTML rather than div soup. On small screens it collapses to a compact summary instead of squeezing the full vertical list into place.

Stepper component showing default, current, and complete states

Stepper collapsed into a compact mobile summary — current step and progress count

Accessible drag-and-drop

Not every interaction is a static component. DragArea is a compound component (DragArea / DraggableItem / DragHandle) built on dnd-kit for reorderable lists — and like everything else in Earth, it’s fully usable without a mouse: focus a handle, press Space to pick it up, move it with the arrow keys, and confirm with Space or Enter (Escape cancels). dnd-kit injects live-region announcements automatically, so a screen reader user gets the same “picked up,” “moved to position 3,” “dropped” feedback a sighted user gets visually.

Reordering a list with DragArea using only the keyboard — Space to lift, arrows to move, Enter to drop

Governance

Earth isn’t a single-owner side project — it runs under a written governance agreement between design and engineering: a cross-functional working group reviews and approves new components, contributions go through an RFC-style proposal template reviewed by both a developer and a designer, and releases follow semantic versioning so consuming teams always know whether an update is safe to pull. That process is what let two product teams adopt the system without needing to coordinate directly with each other.

Beyond the components

SSR-compatible with both a React SPA and .NET BFF services, so teams on either stack could adopt it without a rewrite. Alongside the system rollout, led a parallel codebase modernization — standardized patterns, hardened security, and set up the contribution workflow described above.

The most interesting piece: an internal AI agent orchestrator connecting Figma to Earth via MCP, letting non-technical designers and product stakeholders prototype directly against the real system — Figma tokens mapped 1:1 to Earth’s design tokens, components bootstrapped automatically, every output gated behind human code review before merge.


The source is FrankCrum’s private repository and can’t be linked here. Every screenshot above is from the real, running Storybook — no business data, just the component library itself.