Home/Work/ui-liBerry
INDEPENDENT / IN DEVELOPMENT · 2026

UI
LIBERRY

A white-label React design system: accessible, themeable components that can be re-branded for a client in a single stylesheet.
01 — About the projectScroll to explore ↓
ui-liBerry — the Button live playground in the docs site.

ui-liBerry is built for agency work: build the interface, theme the brand, document the system, ship the work.

It is a Turborepo monorepo whose product is one npm package, @ui-liberry/core: 15 accessible React components, nine hooks, design tokens and a Tailwind preset. Around it sit Storybook, a Next.js docs site and a playground app that exercise the library.

Change the brand,
not the components.

Colours are stored as CSS variables, and a Tailwind preset maps names like brand-600, surface and content-muted onto them. Dark mode only overrides the surface and content variables.

To re-brand for a client, you override a handful of variables in a stylesheet loaded after the library's. No component changes.

The component library overview and tech stack on the ui-liBerry docs home

Three layers
of colour.

01CSS variablesRAW VALUES
02Tailwind presetSEMANTIC NAMES
03Typed tokensRUNTIME CODE

Accessibility
you do not have
to remember.

Inputs generate their own ids and wire up aria-describedby from whichever hint, success or error text is present. Buttons set aria-busy while loading. Overlays are thin wrappers over Radix, which supplies focus trapping and keyboard handling.

Every component follows the same recipe: typed variants, a class-merging helper, Radix where behaviour is hard, and forwarded refs.

Button props table and accessibility guidance in the docs
01
Tokens
02
Components
03
Hooks
04
Docs
05
Release

Built to be
published, not just
demoed.

Rollup builds CommonJS and ES bundles with a use-client banner for the Next.js App Router, bundled type definitions, the stylesheet and the Tailwind preset as three entry points. CI runs typecheck, lint, tests, a size budget and Storybook accessibility checks.

Releases go through Changesets and publish to npm with provenance.

Button variants and the typed props table in the docs site
04 / THE PRINCIPLE

A design system
is a promise
about the next screen.

Small parts,
one shape.

React + TypeScript
Components with typed variants and forwarded refs.
Radix UI
Behaviour and accessibility for dialogs, tabs, selects.
Tailwind + cva
Variants declared once, merged without conflicts.
Storybook
Stories live next to components; a11y checks in CI.
Turborepo + Changesets
Build order, versioning and npm release.
const Comp = isAsChild ? Slot : "button";
const isDisabled = isDisabledProp || isLoading;

<Comp
  ref={ref}
  disabled={isDisabled}
  aria-disabled={isDisabled}
  aria-busy={isLoading}
  className={cn(BUTTON_VARIANTS({ variant, size, fullWidth: isFullWidth, className }))}
  {...props}
/>

A design system is a lot of small decisions repeated. The ones that paid off were the dull ones: one recipe for every component, and one place where colour is decided.

Credits

Studio
Independent
Role
Design / Frontend / Tooling
Year
2026
Repository
andymutale/ui-liberry
NEXT PROJECT

SAINT LAURENS

↗
06 / CONTACT

HAVE SOMETHING INTERESTING?