Loading...
Loading...
Use when designing, reviewing, or implementing web UIs and you need concrete MUST/SHOULD/NEVER rules for accessibility, interaction patterns, forms, layout, animation, performance, content, or visual design decisions.
npx skill4agent add dereknex/skills web-interface-guidelines| Area | Top MUST checks |
|---|---|
| Keyboard | Full keyboard support per WAI-ARIA APG; visible focus rings; manage focus (trap/move/return) |
| Forms | No paste blocking; loading buttons keep label + spinner; inline errors + focus first error |
| Navigation | URL reflects state; links are links; back/forward restores scroll |
| Motion | Respect prefers-reduced-motion; animate transform/opacity only; animations interruptible |
| Layout | Respect safe areas; avoid unwanted scrollbars; verify mobile/laptop/ultra-wide |
| Content | Accurate labels; skip link + proper headings; resilient to long user content |
| Performance | Measure reliably; batch layout reads/writes; prevent CLS from images |
:focus-visible:focus-within<input><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover">touch-action: manipulation-webkit-tap-highlight-color<input>/<textarea><textarea>autocompletenametypeinputmode+1 (123) 456-7890sk-012345…<a><Link>aria-live…overscroll-behavior: containinertprefers-reduced-motiontransformopacitytop/left/width/heighttransform-originenv(safe-area-inset-*)<title>font-variant-numeric: tabular-nums…scroll-margin-top<h1–h6>aria-labelaria-hiddenaria-labelbuttonalabeltable10 MB⌘ + KVercel SDKPOST/PATCH/DELETE:hover:active:focustype Props = {
pending: boolean;
errorId?: string;
};
export function SubmitButton({ pending, errorId }: Props) {
return (
<button
type="submit"
aria-describedby={errorId}
aria-busy={pending}
disabled={pending}
>
{pending ? (
<span aria-live="polite">
<span className="spinner" aria-hidden="true" />
Saving…
</span>
) : (
"Save"
)}
</button>
);
}transformopacity