Accessible on Base UI
Every interactive component is a Base UI primitive underneath — focus management, keyboard navigation, and ARIA handled for you, with hand-written accessibility notes on each component page.
LiltUI is a shadcn-compatible registry of 63 copy-paste React components, built on Base UI and Tailwind v4 and dressed in warm paper surfaces, hand-drawn icons, and a swappable pine-and-mint accent. Yours to own, edit, and rebrand.
npx shadcn add @lilt/buttonEvery tile below is the real component, rendered right here — not a screenshot. Click, drag, toggle, and press ⌘K. What you see is what gets copied into your project.
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
Penciled in for July 20. The ferns approve.
You gave it 3 of 5. The marigolds are flattered.
Planted, watered, and released into the wild.
Every prop pressed neatly, like flowers in a notebook.
A rogue semicolon. We do not speak of it.
Precise structure, restrained motion, and copy-paste ownership — the Lilt design language, distilled into components you can trust and reshape.
Every interactive component is a Base UI primitive underneath — focus management, keyboard navigation, and ARIA handled for you, with hand-written accessibility notes on each component page.
Components aren't installed from npm. The shadcn CLI copies the source into your project, so you can read every line, edit freely, and never fight a version bump.
The pale-mint accent is a guest, not a landlord. Swap four semantic tokens — primary, soft, text, and focus — and the whole registry rebrands with you.
Full semantic token sets ship for both modes. Long-form text stays AAA-minded near-black on near-white; pastels carry status and personality only.
Hierarchy comes from 1px borders and warm surface shifts. Nothing floats, nothing looms — and hover motion is capped at one 2px lift, removed entirely under reduced-motion.
Ships /llms.txt and a /context7.json manifest generated straight from the registry, so coding assistants can index LiltUI and install components accurately.
64 components, sorted into six packs so you can find the right one fast. Add any of them with a single shadcn command.
Inputs, controls, and validation, accessible by default.
Menus, dialogs, toasts, and the ⌘K palette.
Badges, avatars, meters — status and personality.
Layout, navigation, and page scaffolding.
Tables, charts, and calendars that carry real data.
Components read semantic --lilt-* variables, never raw hex. Warm paper surfaces, AAA-minded text, a deep-pine accent, and a pale-mint wash that stays a guest. Swap five tokens and the whole registry follows you into a new brand.
--lilt-canvas--lilt-surface--lilt-text--lilt-primary--lilt-primary-tint--lilt-primary-soft--lilt-warning--lilt-highlight--lilt-danger--lilt-chart-1--lilt-chart-2--lilt-chart-3--lilt-chart-4--lilt-chart-5Every accent in LiltUI traces back to the same five variables, in both light and dark. Override them once and buttons, badges, focus rings, links, and charts all shift together. No component edits, no theme fork to maintain.
Radii, motion durations, and the shared ease-out live in tokens too, so the rhythm stays consistent wherever you take it.
/* Rebrand: replace these five tokens, keep everything else. */
:root {
--lilt-primary: #167f55; /* strong fills: switch, slider, toggle */
--lilt-primary-tint: #aeeacf; /* pale wash: selection, soft hovers */
--lilt-primary-soft: #e3f7ed; /* soft fills & badges */
--lilt-primary-text: #164c35; /* text on soft fills */
--lilt-focus: #167f55; /* focus rings */
}From zero to your first component in four small steps.
Point the shadcn CLI at the LiltUI registry once, in your components.json. Works in any React project with Tailwind v4 — Next.js, Vite, and anything the CLI supports.
{
"registries": {
"@lilt": "https://lilt-ui.vercel.app/r/{name}.json"
}
}Pull in the Lilt design tokens for light and dark, then load Space Grotesk + DM Sans and wrap your app in the theme-provider.
npx shadcn add @lilt/themeAdd components by name. Dependencies and any missing theme variables merge in automatically, and Base UI is installed as needed.
npx shadcn add @lilt/button @lilt/field @lilt/dialogThe source now lives in your repo. Read it, restyle it, delete what you don't use — it's yours, with no version to fight.
import { Button } from "@/components/ui/button";
export const Ship = () => <Button icon="arrow">Ship it</Button>;The fine print, without the fine print.
Precision with a playful rhythm. Copy in the theme, add your first component, and make it yours in minutes.
npx shadcn add @lilt/theme