Install ReUI (MCP, skill, @reui registry, Tailwind v4, shadcn base-nova) and move the shared UI onto it: Button, Tag, Check, Input/Textarea, Segmented, Alert, Panel, Dialog, Tooltip, Menu and Select (Popover), Toast (sonner), the Table frame (DataGrid), the Dashboard KPI strip, the shnt Ops palette, Geist and the type scale. Design only: behaviour, texts and roles are unchanged. Tests that asserted the old DOM were updated; the tests now format numbers in English wherever they run. docs/reui-migration-plan.md records the plan and its decisions. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
3.7 KiB
Theming: styles, radius, density and sizes
Read your style
components.json style is <base>-<style>: the part after the first - names the style (base-nova is nova on Base UI). The style is baked into components/ui and components/reui at install, so the installed files hold your real values: read your installed button.tsx (usually components/ui/button.tsx) for heights, radius and padding before you build anything that sits beside a control.
The style ladder
| Style | Button sm / default / lg |
Button radius | Card radius, shadow | Card spacing | Button text |
|---|---|---|---|---|---|
| vega | h-8 / h-9 / h-10 |
rounded-md |
rounded-xl, shadow-xs |
6, sm 4 | text-sm |
| nova | h-7 / h-8 / h-9 |
rounded-lg |
rounded-xl |
4, sm 3 | text-sm |
| maia | h-8 / h-9 / h-10 |
rounded-4xl |
rounded-2xl |
6, sm 4 | text-sm |
| lyra | h-7 / h-8 / h-9 |
rounded-none |
rounded-none |
4, sm 3 | text-xs |
| mira | h-6 / h-7 / h-8 |
rounded-md |
rounded-lg |
4, sm 3 | text-xs/relaxed |
| luma | h-8 / h-9 / h-10 |
rounded-4xl |
rounded-4xl, shadow-md |
6, sm 4 | text-sm |
| sera | h-9 / h-10 / h-11 |
rounded-none |
square, shadow-sm |
8, sm 5 | text-xs, uppercase |
| rhea | h-7 / h-8 / h-9 |
rounded-2xl |
rounded-[min(var(--radius-4xl),24px)], shadow-sm |
5, sm 4 | text-sm |
Card spacing is the --card-spacing step (--spacing(n)) a Card pads with; Card size="sm" uses the sm step. The default Button text weight is font-medium (sera: font-semibold).
What the style owns
- Never set what the style owns on its parts: radius (except
rounded-full), height, horizontal padding, shadow, ring or font size. Picksizeandvariantinstead. - A panel is a
Cardor aFrame, never a div withrounded-*,borderandbg-card; set density withCard size="sm"or Framespacing. - A bespoke element beside a control (a chip, a custom trigger) takes its height and radius from that control's row above.
- A focusable control you build copies the focus classes of your installed
input.tsx. - A variant before a class:
classNameis for layout (placement, width, gap).size-*when width equals height,cn()for conditional classes (never a template literal), a scale step before an arbitrary value (w-60, notw-[240px]), no inlinestylefor color or spacing, and noz-indexon dialogs, sheets or popovers. - Change the look through the theme CSS variables in
:rootand.dark(--radius,--primaryand the rest) or with a style switch (a newstyleincomponents.json, which means reinstalling the components; ask the user first). Never edit installed files to restyle them.
Components with no per-style values
event-calendar, gantt, icon-stack, kanban, rating, scrollspy, sortable and timeline install the same file in every style. Their look comes from your theme tokens and the parts you put inside them (a Card in a kanban column follows the style), so never copy another style's radius onto them.