Playground
Try check_ui on a real design system.
Edit the code or pick a draft. It is checked against the demo design system by the same rules the MCP server and the CLI run, on a server that parses the code and never runs it.
The settings card from the demo above: one problem per rule.
Findings8 errors · 3 warnings
8 errors · 3 warnings
- errorno-hardcoded-color
Hardcoded color
border-[#ef4444]. Nearest token destructive (ΔE 0.071) →border-destructive. - warningno-hardcoded-spacing
Hardcoded spacing
p-[13px](13px) is off the scale. Nearest:p-3(12px). - errorno-unknown-component
<Card.Description> does not exist: Card is composed from flat parts. Use <CardDescription> (import { CardDescription } from "@/components/ui/card").
- errorno-unknown-prop
<Badge> has no prop "tone". Did you mean "variant" ("default" | "secondary" | "destructive" | "success" | "outline")?
Suggests variant; the change needs a decision, so there is no automatic fix.
- errorno-unknown-variant
"danger" is not a valid variant for <Button>. Allowed: default, destructive, outline, secondary, ghost, link. Did you mean "destructive"?
Icon-only <Button> has no accessible name. Add aria-label="Delete" describing the action, or visually hidden text.
Native <button> where the design system has <Button>. Use <Button> (import { Button } from "@/components/ui/button"); its variants replace the custom classes.
- warningno-hardcoded-radius
Hardcoded radius
rounded-[7px](7px) is off the scale. Nearest:rounded-sm(6px). - errorno-hardcoded-color
bg-gray-100is Tailwind's default palette, not a design-system color. Matches token muted (ΔE 0.004, same value as secondary, accent) →bg-muted. - errorno-hardcoded-color
Hardcoded color
#737373in style.color. Matches token muted-foreground (exact match) →text-muted-foregroundorvar(--muted-foreground). - warningno-hardcoded-spacing
Hardcoded spacing
marginTop: 6in style. Usemt-1.5(6px) in className instead of an inline style.Suggests mt-1.5; the change needs a decision, so there is no automatic fix.
What the demo design system has
Five shadcn/ui-style components built with cva and Radix, and Tailwind v4 tokens: 20 colors and 8 radius steps on Tailwind's spacing scale. Anything else is unknown to the checker, as it would be in your project.
Import from @/components/ui/…, or leave imports out: names resolve either way.
<Badge> renders <span>
A small status label: counts, states ("Active", "Overdue") or categories. Not interactive by default; pass
asChildto render a link.variant: default · secondary · destructive · success · outline
<Button> renders <button>
Triggers an action or event, such as submitting a form, opening a dialog or deleting a record. Use
variant="destructive"for irreversible actions andvariant="link"for navigation that should look like a button.variant: default · destructive · outline · secondary · ghost · link
size: default · sm · lg · icon
<Card> renders <div>
A bordered surface that groups related content and actions.
parts: CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent
<Dialog>
A modal window that interrupts the user to confirm a decision or collect input. Use it to confirm destructive actions before they happen.
parts: DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger
<Input> renders <input>
A single-line text field. Always pair it with a visible
<label htmlFor>or anaria-label; setaria-invalidto show the error state.