Sets the visual direction for a new or redesigned surface, with production quality that avoids generic AI aesthetics. Use when building a new page, app, or marketing surface, defining visual identity, or doing a design pass ("make this look good"). Do not load it for routine UI edits: adding a field to an existing form, fixing spacing, wiring a button, or changing copy.
76
96%
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
This skill guides creation of distinctive, production-grade frontend interfaces. Implement real working code with strong product judgment, excellent accessibility, and a clear visual point of view.
The user may ask for a component, page, full app, dashboard, marketing surface, or restyle. Before coding, understand the audience and pick a direction that fits the product instead of defaulting to generic SaaS polish.
Before coding, decide:
Then implement working code that is cohesive, accessible, responsive, and polished in small details: typography, spacing, copy, motion, empty states, loading states, focus states, and error states.
Default to Apple/Linear-level restraint: make the primary workflow obvious, then remove everything that does not help that workflow right now. A polished UI often has fewer visible controls, fewer borders, fewer labels, and fewer explanatory surfaces than the first reasonable implementation.
Treat an all-at-once interface as a defect to fix during design, not as a styling preference. Before coding, inventory every piece of content and action on the surface, then assign each one to the smallest useful visibility level:
Use single-select accordions or simple disclosure rows for sibling panels when the user is choosing one item at a time. Inside an expanded panel, keep another layer for independent concerns instead of dumping every form, explanation, and secondary action into the first reveal. Prefer one flat panel with alignment, dividers, and whitespace over nested cards; provider or product icons should not receive decorative borders or containers unless the container communicates state or interaction. A collapsed row should still show the item name, status, and a concise summary so the user can scan the whole surface without opening everything.
Before shipping, ask: “What can disappear until the user asks for it?” Then verify collapsed, expanded, loading, empty, error, and narrow-width states. If the first viewport contains multiple forms, repeated explanatory copy, documentation links, and controls for unrelated tasks, the surface has not passed this requirement yet.
transition-all — list the properties that actually change (e.g. transition-[opacity,transform]). Use the shared easing tokens defined in packages/core/src/styles/agent-native.css instead of hand-typing curves: var(--ease-drawer) (260ms, drawers/app chrome), var(--ease-collapse) (200ms, expand/collapse), var(--ease-out-strong) (snappy entrances) — in Tailwind, ease-[var(--ease-collapse)]. Enter/exit with ease-out, never ease-in. Overlays that zoom in must set the Radix origin var (e.g. origin-[--radix-popover-content-transform-origin]). Animate transform/opacity, not width/height/padding/box-shadow. Gate looping or large-movement animations with motion-reduce:. Command palettes and keyboard-triggered actions get no animation.Beat convergence, not just defaults. You sample toward the "on-distribution" center, so naming what to avoid is not enough: every "don't" needs a "do", or you converge on the next safe option (ban Inter and you reach for Roboto; ban purple gradients and you reach for Space Grotesk + a teal accent on every screen). Commit to one named direction, pair any reference with the reason it fits ("Linear: the quiet confidence of its spacing" — a bare "Linear" collapses back to the average), and match implementation effort to the vision: maximalist wants elaborate motion and effects, minimal wants restraint and precise spacing. When building on an existing app, inspect its tokens/type/components first and treat any drift back to a default as a missing token to pin, not something to re-prompt.
@tabler/icons-react, but an app may register a different
company design system in app/design-system.ts.app/design-system.ts, ToolkitProvider, and the local UI adapter directory
before choosing a primitive. Use shadcn primitives when they are the active
adapter; use the registered company components when they are not.shadcn-ui if it exists. That skill covers components.json, CLI docs, component composition, theming, and registry workflows.app/components/ui/ before importing a shadcn component. If a primitive is missing, add it from the app root with pnpm dlx shadcn@latest add <component>, then review the generated file.@/components/ui/*. Never import
@agent-native/toolkit/ui/* directly in app product code.@agent-native/toolkit/design-system. Their props express intent, emphasis,
size, controlled values, and behavior; they do not require Tailwind, CVA, or
className.window.alert, window.confirm, window.prompt). Use AlertDialog, Dialog, or app-specific confirmation UI.useActionQuery and useActionMutation from @agent-native/core/client for action-backed UI. Standard CRUD should go through actions, not custom /api/ routes.variant, size) before overriding classes.bg-background, text-muted-foreground, border-border, bg-primary) instead of raw Tailwind colors for app chrome and reusable components.gap-* in flex/grid layouts instead of space-x-* or space-y-*.size-* when width and height are equal, and truncate instead of spelling out overflow/ellipsis/nowrap.cn() from the local utils alias for conditional classes.sr-only only when the visible design already communicates the title.SelectGroup, DropdownMenuGroup, CommandGroup, and equivalents.Card composition when the content has a title, description, content, or actions. Do not dump complex cards into a single CardContent.ToggleGroup for small option sets, Switch for binary settings, Checkbox for multi-select, RadioGroup for one-of-many, and Slider/inputs for numeric values.Field, FieldGroup, or InputGroup primitives are installed or appropriate to add, use them instead of raw layout divs.Skeleton, Progress, Spinner, or the app's existing loading primitives. Empty states should have one clear next action.Avoid:
Match verification effort to the size of the change. For one component, one
form, one page, or a restyle, run the app's existing checks — formatter,
pnpm typecheck, existing tests — and stop there.
Escalate to browser verification only when the user asks for it, or when the change is a multi-step user-visible flow that cannot be confirmed any other way. Never author a new Playwright/Puppeteer script, add a browser-automation dependency, or stand up an e2e harness to check work the user did not ask you to test that way; use an available browser tool, or say what you could not verify.
For substantial frontend work:
@agent-native/toolkit/conformance, including mixed-overlay focus,
portalContainer, and z-index stacking checks.useActionQuery/useActionMutation hooks for frontend data fetchingc1ee18b
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.