# Calaca UI > One skeleton, many skins. Calaca UI is a set of CSS component classes built with Tailwind CSS 4, for plain HTML, Astro, Next.js and React. The core gives each component its structure, behavior and accessibility; a skin dresses it. Markup is the API: there are no framework components. Rules for writing markup: - Class names follow BEM: `ca-`, `ca-__`, `ca---` (variant, size or layout). - Use only the classes listed below; anything else starting with `ca-` does not exist. - A button needs the component class, one variant and one size, plus `type="button"` unless it submits a form. - Dialogs are native `` elements opened with `commandfor` and `command="show-modal"`; load `ca-commands.js` for older browsers. - A block (such as `ca-hero`) needs exactly one layout modifier; parts other than its content wrapper and title are optional. - Dropdowns are a button with `popovertarget` and a `[popover]` menu; actions close it with `popovertargetaction="hide"`. Do not add `role="menu"`. - Tabs use the WAI-ARIA tabs roles and states in the markup and need `ca-tabs.js` (or `import "@calaca/ui/behavior/tabs"`) once per page. - A tooltip wraps its trigger in `ca-tooltip`; the trigger points at the `role="tooltip"` element with `aria-describedby`. Load `ca-tooltip.js` for Escape. - A combobox is an input with `role="combobox"`, `aria-controls`, `aria-expanded` and `aria-autocomplete="list"`, plus a `role="listbox"` (with `popover="manual"` to float) of `role="option"` elements, which may be links; `data-filter="none"` lets your code render the options; load `ca-combobox.js`. - Toasts come from `toast(message, { tone, duration, action })` in `@calaca/ui/behavior/toast` (or `ca-toast.js`); a button with `data-ca-toast="message"` shows one without code. - Tailwind utilities may be added next to `ca-*` classes for one-off changes; they win over the skin. - Every field has a `