Start here: install the package, load CSS (and React if you want), wrap your app in
.ca-root, then wander
the product overview,
components, and
examples when you’re ready to feel the glass.
A caustic is the bright shape light makes when it passes through glass or water — like the shimmer on a pool floor, or the glow under a drinking glass.
We chose the name because that is the feeling we want on screen —
soft light through glass — and the future of design we are shaping: open and layered,
not heavy and boxed-in — thin borders, quiet highlights, and motion that stays out of
the way. The npm package is caustica-design so it stays distinct from
unrelated Blender / 3D tools that also use “caustica.”
Reach for it when you want that quiet shimmer — and a hand in what interfaces feel like next. Glass UI from OKLCH tokens and CSS, with React only when you need typed behavior.
Like light through glass — not chrome
Screens breathe. See-through surfaces, thin borders, and soft highlights — closer to the shimmer on a pool floor than a wall of solid boxes.
Color that stays calm in light and dark
Color, space, and type live in OKLCH custom properties. Themes swap semantic aliases only — the look shifts without a color engine or runtime theme scripts.
CSS owns the look; React is optional
caustica-design/css class names define the look in any stack. Add
caustica-design/core when you want typed props, portals, and
keyboard behavior.
npm install caustica-design
Pin a release with npm install caustica-design@0.2.4 if you want an exact version.
Peer dependencies for React wrappers: react and react-dom ≥ 18.
Prefer the foundation entry when you only need fonts, tokens, and body chrome. Use the
full stylesheet for component classes (.btn, .panel, …).
import 'caustica-design/css/foundation'
import 'caustica-design/css'
Or link the built file from node_modules:
<link rel="stylesheet" href="node_modules/caustica-design/dist/index.css" />
For stylesheets without a bundler, use jsDelivr or unpkg. React components still need a
bundler via caustica-design/core.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/caustica-design@0.2.4/dist/index.css" />
<!-- unpkg equivalent -->
<link rel="stylesheet" href="https://unpkg.com/caustica-design@0.2.4/dist/index.css" />
Importing only token CSS is not enough — without base.css / foundation you
lose body font, canvas glow, and grain.
Wrap the page in .ca-root. Glow and grain sit behind content either way; the
class is the recommended single stacking root for host apps.
<body>
<div class="ca-root">…</div>
</body>
Avoid nesting many blurred surfaces (sticky navbar + panel grids + cards). For dense UIs,
lower --ca-blur-glass / --glass-blur (default
32px). Hosts without backdrop-filter get stronger opaque glass
tokens automatically.
:root {
--ca-blur-glass: 16px;
--glass-blur: var(--ca-blur-glass);
}
import 'caustica-design/css'
import { Button } from 'caustica-design/core'
export function Example() {
return <Button variant="primary">Continue</Button>
}
Dark is the default. Set data-theme on <html> to switch
light/dark — the same contract as the
living style guide.
<html lang="en" data-theme="dark">
document.documentElement.setAttribute('data-theme', 'light')
// or from React: import { setTheme, useTheme } from 'caustica-design/core'
If you persist theme across full page loads, restore it with a blocking
<head> script before CSS paints — see
Avoid a theme flash.
Mask icons resolve from /icons/*.svg. Serve this package’s
public/icons (or dist/icons) from your app’s public root so
classes like .ui-icon--send resolve.