Review UI code for alignment with the emcn design system — components, tokens, patterns, and conventions
61
72%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/emcn-design-review/SKILL.mdArguments:
User arguments: $ARGUMENTS
This codebase uses emcn, a custom component library built on Radix UI primitives with CVA variants and CSS variable design tokens. All UI must use emcn components and tokens.
apps/sim/components/emcn/index.ts (re-exports components, Calendar, Table*, and icons) to know what's available; for the full icon set read apps/sim/components/emcn/icons/index.tsapps/sim/app/_styles/globals.css for CSS variable tokens@/components/emcn barrel, never subpaths@/components/emcn/icons or lucide-reactcn from @/lib/core/utils/cn for conditional classesUse CSS variable pattern (text-[var(--text-primary)]), never Tailwind semantics (text-muted-foreground) or hardcoded colors (text-gray-500, #333).
Text: --text-primary, --text-secondary, --text-tertiary, --text-muted, --text-body (canonical value text), --text-icon, --text-placeholder, --text-subtle, --text-inverse, --text-error
Surfaces: --bg, --surface-1 through --surface-7, --surface-hover, --surface-active
Borders: --border, --border-1, --border-muted
Brand/accent: --brand-secondary, --brand-accent
Z-Index: --z-dropdown (100), --z-modal (200), --z-popover (300), --z-tooltip (400), --z-toast (500)
Shadows: shadow-subtle, shadow-medium, shadow-overlay, shadow-card
Badges: --badge-* semantic families (success/error/gray/blue/purple/orange/amber/teal/cyan/pink, each with -bg/-text)
Intent-to-variant mapping (read the actual buttonVariants in apps/sim/components/emcn/components/button/button.tsx for the full variant set — it exposes more than listed here):
| Action | Variant |
|---|---|
| Toolbar, icon-only | ghost |
| Create, save, submit | primary |
| Cancel, close | default |
| Delete, remove | destructive |
| Selected state | active |
| Toggle | outline |
ChipModal size='sm', title "Delete/Remove {ItemType}", destructive confirm button, plain Cancel (follow the chip footer layout in .claude/rules/emcn-components.md). Use text-[var(--text-error)] for irreversible warnings.
toast.success(), toast.error(), toast() from @/components/emcn. Never custom notification UI.
red=error/failed, gray-secondary=metadata/roles, type=type annotations, green=success/active, gray=neutral, amber=processing, orange=paused, blue=info. Use dot prop for status indicators.
Default: size-[14px]. Color: text-[var(--text-icon)]. Scale: 14px > 16px > 12px > 20px. Use the size-* shorthand — flag h-[Npx] w-[Npx] and h-N w-N pairs as refactor targets.
<button>/<input>, or legacy Input/Textarea/Modal, instead of the canonical chip components (ChipInput/ChipTextarea/ChipModal)ChipModalBody instead of ChipModalFieldtext-gray-*, #hex, rgb())text-muted-foreground) instead of CSS variablescn()6f514c1
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.