Change one word. Wear a new skin.
Thirteen complete design languages behind a single prop. Your markup never changes — the skin does, and it stays legible in every one.
WCAG 2.2 AA in every skin · Server Components ready · No Tailwind required
import "@camaleo/styles/glass.css"; <StyleProvider styleName="glass"> <Dashboard /> </StyleProvider>
now wearing glass · ·
- 13complete skins, light and dark
- 78documented components
- 2,447automated tests in the suite
- 1prop to switch between them
// 13 skins
Every skin is a whole design language.
Not a color swap. Radius, depth, type, borders, motion and the shape of every state change together. Wear one — the dashboard above changes too.
Minimal
TypographicSwiss
TypographicEditorial
TypographicProgressive
PlatformMaterial
PlatformCupertino
PlatformGlass
Soft depthNeumorphism
Soft depthClay
Soft depthNeubrutalism
BoldRetro
BoldRetro pixel
BoldY2K
BoldBuild your own →
Override a few tokens, or write a fourteenth skin from scratch.
// brand="any color"
Bring your color. We keep it legible.
Most libraries paint your hex behind white text and hope. Camaleo keeps your hue, grows an 11-step scale at fixed lightness and puts buttons on the step that passes, with black or white text, whichever reads better. Yellow, cyan and grey pass too, as a deeper shade of themselves.
White on #facc15 is hard to read. Most libraries ship it anyway and leave the fix to you.
Your hue at the lightness of step 600, so a light color turns deeper; the text is black or white, whichever has more contrast. Hover, tints and on-color text come from the same scale.
- NeubrutalismLive
- GlassLive
- RetroLive
// accessibility is the contract
Flip a preference. It still holds.
Every component runs in every skin, light and dark, against five deliberately hard brand colors — 130 combinations in the test suite. One failure and it does not ship.
Notifications
As designed — the skin exactly as it was approved.
$ pnpm test 13 skins × 2 modes × 5 brands = 130 ✓ glass dark muted 8.62 ✓ neumorphism light on-accent 4.85 ✓ y2k dark focus 9.33 ✓ retro-pixel light accent-text 6.63 ✓ clay dark border 4.78 ✓ editorial light muted 6.41 … 254 more measured pairs
one square per skin × mode × color pair, worst of 5 brands · brighter = more headroom
// inventory
78 components, ready to skin.
Built on Base UI and React Aria. Every one renders on the server, exposes stable data-slot hooks and reads its look from tokens.
// for developers
Three steps. No build plugin.
Plain scoped CSS and React components. Works with the Next.js App Router, Vite and anything that renders React 19.
Install
Two packages: the components and the styles.
$ npm i @camaleo/react @camaleo/stylesImport a skin
The base once, then only the skins you ship. minimal needs no file.
import "@camaleo/styles/base.css"; import "@camaleo/styles/glass.css";
Wrap and ship
Pick the skin, mode and brand at the root — or per island.
<StyleProvider styleName="glass" brand="#3fa34d">
- Server ComponentsSkin the whole page from a Server Component; system dark mode needs no script.
- No Tailwind requiredPlain CSS in cascade layers. Already on Tailwind v4? A few lines make them work together.
- Tree-shakeableOne entry per component, so you only ship what you import.
- Your own skinOverride tokens, scope a few rules, or write a fourteenth skin from scratch.
// examples
Whole screens, any skin.
Copy a complete screen and it arrives in the skin you chose above — currently glass.
Sales dashboard
15 componentsSign in
10 componentsAccount settings
20 componentsCheckout
11 components