agents/dot-agents/skills/my-frontend-design/SKILL.md
Build and review frontend with accessibility, design constraints, and Vercel guidelines
npx skillsauth add nathankoerschner/dotfiles my-frontend-designInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A comprehensive frontend skill that combines accessibility review, opinionated UI constraints, and Vercel Web Interface Guidelines compliance.
$ARGUMENTS provided): Review specified files against all guidelines| Check | WCAG | What to look for |
|-------|------|------------------|
| Images without alt | 1.1.1 | <img> without alt attribute |
| Icon-only buttons | 4.1.2 | <button> with only SVG/icon, no aria-label |
| Form inputs without labels | 1.3.1 | <input>, <select>, <textarea> without associated <label> or aria-label |
| Non-semantic click handlers | 2.1.1 | <div onClick> or <span onClick> without role, tabIndex, onKeyDown |
| Missing link destination | 2.1.1 | <a> without href using only onClick |
| Check | WCAG | What to look for |
|-------|------|------------------|
| Focus outline removed | 2.4.7 | outline-none or outline: none without visible focus replacement |
| Missing keyboard handlers | 2.1.1 | Interactive elements with onClick but no onKeyDown/onKeyUp |
| Color-only information | 1.4.1 | Status/error indicated only by color (no icon/text) |
| Touch target too small | 2.5.5 | Clickable elements smaller than 44x44px |
| Check | WCAG | What to look for |
|-------|------|------------------|
| Heading hierarchy | 1.3.1 | Skipped heading levels (h1 -> h3) |
| Positive tabIndex | 2.4.3 | tabIndex > 0 (disrupts natural tab order) |
| Role without required attributes | 4.1.2 | role="button" without tabIndex="0" |
motion/react (formerly framer-motion) when JavaScript animation is requiredtw-animate-css for entrance and micro-animations in Tailwind CSScn utility (clsx + tailwind-merge) for class logicBase UI, React Aria, Radix)Base UI for new primitives if compatible with the stackaria-label to icon-only buttonsAlertDialog for destructive or irreversible actionsh-screen, use h-dvhsafe-area-inset for fixed elementsinput or textarea elementstransform, opacity)width, height, top, left, margin, padding)background, color) except for small, local UI (text, icons)ease-out on entrance200ms for interaction feedbackprefers-reduced-motiontext-balance for headings and text-pretty for body/paragraphstabular-nums for datatruncate or line-clamp for dense UIletter-spacing (tracking-*) unless explicitly requestedz-index scale (no arbitrary z-*)size-* for square elements instead of w-* + h-*blur() or backdrop-filter surfaceswill-change outside an active animationuseEffect for anything that can be expressed as render logicaria-label<label> or aria-labelonKeyDown/onKeyUp)<button> for actions, <a>/<Link> for navigation (not <div onClick>)alt (or alt="" if decorative)aria-hidden="true"aria-live="polite"<button>, <a>, <label>, <table>) before ARIA<h1>-<h6>; include skip link for main contentscroll-margin-top on heading anchorsfocus-visible:ring-* or equivalentoutline-none / outline: none without focus replacement:focus-visible over :focus (avoid focus ring on click):focus-within for compound controlsautocomplete and meaningful nametype (email, tel, url, number) and inputmodeonPaste + preventDefault)htmlFor or wrapping control)spellCheck={false})... and show example patternautocomplete="off" on non-auth fields to avoid password manager triggersbeforeunload or router guard)prefers-reduced-motion (provide reduced variant or disable)transform/opacity only (compositor-friendly)transition: all-list properties explicitlytransform-origin<g> wrapper with transform-box: fill-box; transform-origin: center... not ..." " not straight "10 MB, Cmd K, brand names...: "Loading...", "Saving..."font-variant-numeric: tabular-nums for number columns/comparisonstext-wrap: balance or text-pretty on headings (prevents widows)truncate, line-clamp-*, or break-wordsmin-w-0 to allow text truncation<img> needs explicit width and height (prevents CLS)loading="lazy"priority or fetchpriority="high"virtua, content-visibility: auto)getBoundingClientRect, offsetHeight, offsetWidth, scrollTop)<link rel="preconnect"> for CDN/asset domains<link rel="preload" as="font"> with font-display: swap<a>/<Link> (Cmd/Ctrl+click, middle-click support)useState, consider URL sync via nuqs or similar)touch-action: manipulation (prevents double-tap zoom delay)-webkit-tap-highlight-color set intentionallyoverscroll-behavior: contain in modals/drawers/sheetsinert on dragged elementsautoFocus sparingly-desktop only, single primary input; avoid on mobileenv(safe-area-inset-*) for notchesoverflow-x-hidden on containers, fix content overflowcolor-scheme: dark on <html> for dark themes (fixes scrollbar, inputs)<meta name="theme-color"> matches page background<select>: explicit background-color and color (Windows dark mode)Intl.DateTimeFormat not hardcoded formatsIntl.NumberFormat not hardcoded formatsAccept-Language / navigator.languages, not IPvalue need onChange (or use defaultValue for uncontrolled)suppressHydrationWarning only where truly neededhover: state (visual feedback)& over "and" where space-constraineduser-scalable=no or maximum-scale=1 disabling zoomonPaste with preventDefaulttransition: alloutline-none without focus-visible replacementonClick navigation without <a><div> or <span> with click handlers (should be <button>).map() without virtualizationaria-labelIntl.*)autoFocus without clear justificationWhen reviewing files, output:
=====================================
MY FRONTEND DESIGN REVIEW: [filename]
=====================================
CRITICAL (X issues)
-------------------
[A11Y] Line 24: Button missing accessible name
<button><CloseIcon /></button>
Fix: Add aria-label="Close"
WCAG: 4.1.2
[UI-SKILL] Line 42: Using h-screen
Fix: Replace with h-dvh
SERIOUS (X issues)
------------------
[WIG] Line 55: transition: all
Fix: List properties explicitly
=====================================
SUMMARY: X critical, X serious, X moderate
Score: XX/100
=====================================
development
Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Use when asked to simplify, refactor lightly, clean up, or improve recently modified code without behavior changes.
tools
Write a path-free, clipboard-ready handoff prompt that lets another agent investigate, discuss, or pick up a specific task.
testing
Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
development
Run a Pi-based structured code review as a closeout check on local, branch, PR, or commit changes before commit or ship.