Introduction
Mlola UI is a component system built on native CSS tokens, owned behaviour and a theme engine. It has no runtime dependencies beyond React for the React components, and none at all for the CSS and the framework-free behaviour.
Why Mlola
- No utility framework. Components are styled by semantic
ml-*classes the engine generates. No Tailwind, CSS-in-JS or class-merging helpers. - Themes, not palettes. 5 canonical themes move type, geometry, depth and motion together. Your brand is one JSON file.
- You own the source. The CLI copies components into your project instead of hiding them in a package.
- Readable by machines. A generated
agents.mdand registry schema tell coding agents exactly which classes and attributes exist.
Installation
Initialise your project
Writes
mlola.config.jsonandstyles/mlola/index.css, the one stylesheet you import.npx mlola-ui initAdd components
Each one is copied, with the internal helpers it needs, into your components folder.
npx mlola-ui add button card inputUse them
app/page.tsx import "@/styles/mlola/index.css"; // once, in your root layout import { Button } from "@/components/ui/button"; export default function Page() { return <Button variant="primary">Save</Button>; }
Without React
The stylesheet and the behaviour runtime work with any server or framework. Render the markup, load the CSS, and let @mlola-ui/behavior attach keyboard and state handling to what is already in the page.
<!doctype html>
<html data-theme="graphite" data-mode="light">
<head>
<link rel="stylesheet" href="/node_modules/@mlola-ui/engine/generated/mlola.css" />
</head>
<body>
<button class="ml-button" data-variant="primary">Save</button>
<script type="module">
import { observe } from "@mlola-ui/behavior";
observe();
</script>
</body>
</html>