New project
DraftGive it a name now. You can invite your team later.
Everyone you invite sees this name.
One skeleton, many skins.
Stop rebuilding the same dialog for every product. The core handles keyboard, focus and touch; a skin gives each product its own look. Plain classes for HTML, Astro, Next.js and React.
<button class="ca-button ca-button--primary ca-button--md">
Components
48
Each with a live page
Blocks
6
Page sections with layouts
Skins
4
Plus the bare skeleton
Size
15 KB
Every component in one skin, gzipped
Dependencies
1
Tailwind CSS, nothing else
01 Why Calaca
Calaca started because our own products kept rebuilding the same components, each a little different, each checked again for accessibility. So we split them: one skeleton that stays the same, and a skin for every product.
02 The idea
Every card below is the same HTML. The core gives it structure, behavior and accessibility; each skin dresses it. Your product gets its own skin, and the markup never changes.
Neutral grayscale starting point; product skins extend it and change what differs.
Give it a name now. You can invite your team later.
Everyone you invite sees this name.
The Calaca UI brand: hueso paper and tinta ink, cempasúchil marigold, rosa and jade.
Give it a name now. You can invite your team later.
Everyone you invite sees this name.
Pilot skin pushed far from base: square, heavy, offset shadows, larger targets.
Give it a name now. You can invite your team later.
Everyone you invite sees this name.
The CrossView proofing table: cool ground, bond-paper sheets, rule-grey hairlines, one red mark.
Give it a name now. You can invite your team later.
Everyone you invite sees this name.
<article class="ca-card w-full max-w-sm">
<div class="flex items-start justify-between gap-3">
<h3 class="ca-card__title">New project</h3>
<span class="ca-badge ca-badge--primary">Draft</span>
</div>
<p class="ca-card__description">Give it a name now. You can invite your team later.</p>
<div class="ca-field">
<label class="ca-field__label" for="project-name">Project name</label>
<input class="ca-input ca-input--md" id="project-name" name="project" type="text" autocomplete="off" aria-describedby="project-name-hint" />
<p class="ca-field__hint" id="project-name-hint">Everyone you invite sees this name.</p>
</div>
<div class="ca-card__footer">
<button class="ca-button ca-button--primary ca-button--md" type="button">Create project</button>
<button class="ca-button ca-button--ghost ca-button--md" type="button">Cancel</button>
</div>
</article>03 How it compares
| Calaca UI | daisyUI | shadcn/ui | Tailwind Plus | |
|---|---|---|---|---|
| What you get | CSS classes and a few small scripts | CSS classes (a Tailwind plugin) | React components you copy into your project | Paid snippets you copy (HTML, React, Vue) |
| Works in | Any HTML: plain pages, Astro, Next.js, React | Any HTML | React | HTML, React, Vue |
| Change the look | A skin: color, shape, size, type and motion | Themes: colors and a few shape settings | Edit the copied components | Edit the copied snippets |
| Updates | Update the package; your markup stays | Update the package | Copied code is yours to maintain | Copied code is yours to maintain |
04 What you get
Tailwind CSS is the only dependency. You keep your markup, your framework and your brand.
48 components for forms, overlays, navigation, feedback and data, each with a page, live examples and guidance.
Browse the components6 page sections, such as a hero, an FAQ and a footer, each with layouts you switch with one class.
Browse the blocksClass names in plain HTML, Astro, Next.js or React. No components to import, no runtime.
Install Calaca UIA dialog is a real <dialog> and a menu a real popover. Where a script is needed, it stays under 1.5 KB gzipped.
Read about browser supportFocus rings, touch targets and disabled states are part of the core, so no skin can take them away.
Read the accessibility guideChange a few color tokens, or write a skin in TypeScript and build it to CSS. The markup stays the same.
Write your own skin05 Get started
No. Calaca UI is a set of CSS classes built with Tailwind CSS. You write the HTML in plain HTML, Astro, Next.js or React and add the classes. A few components load a small script for their behavior.
No. In plain HTML you link one prebuilt stylesheet. In a project that already builds Tailwind CSS 4, you import the core and a skin, and only the classes you use end up in your CSS.
Focus rings, touch targets and disabled states live in the core. Every page of this site is checked with axe against WCAG 2.2 AA, in light and dark, in Chromium, Firefox and WebKit.
Yes. Change the color tokens for a quick match, or write a skin: a TypeScript file that maps each class to Tailwind utilities, built to CSS with the calaca command.
The current and previous versions of Chrome, Edge, Firefox and Safari. Newer browser features come with a small polyfill or a fallback.
Not yet. It will be published as @calaca/ui. Until then, the installation guide shows the steps the test projects use.
Link one stylesheet of 15 KB, less than half the font on this page, add the classes, and switch skins without touching the markup.