Web interface guidelines
Review and improve web interfaces for usability, accessibility, interaction behavior, responsive design, and performance. Use for UI/UX reviews, accessibility audits, or frontend interface improvements.From its SKILL.md
npx -y skills add EastSun5566/skills --skill web-interface-guidelinesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
11.7 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
Web Interface Guidelines
Modernized version based on https://interfaces.rauno.me/
This document is a practical checklist for building good web interfaces. Use this checklist when reviewing or improving a web interface. Apply only the guidance relevant to the product, platform, and existing design system.
When reviewing an interface:
- Inspect the implementation, not only screenshots.
- Test important flows with keyboard, touch, reduced motion, zoom, slow networks, and realistic data.
- Report concrete findings grouped as must fix, should fix, and nice to have.
- For each finding, explain the problem, impact, and smallest practical fix.
This checklist supplements WCAG 2.2, WAI-ARIA, and the ARIA Authoring Practices Guide. It is not a conformance audit and does not replace those standards.
Core Principles
- Prefer native HTML elements and browser behavior before custom controls.
- Use ARIA only when native HTML cannot express the required semantics.
- Preserve accessible name, role, state, value, keyboard behavior, focus behavior, and form behavior when building custom controls.
- Keep behavior predictable, reversible when possible, and close to the user's action.
- Preserve basic usability when JavaScript, custom fonts, images, or animation fail.
- Follow the existing design system unless it conflicts with usability or accessibility.
- Measure performance before optimizing.
Forms
- Give every control a visible label or accessible name; do not use placeholder text as the only label.
- Associate labels with controls so clicking or tapping the label focuses the control.
- Wrap submitted controls in a
<form>so standard submission, including <kbd>Enter</kbd>, works. - Use the appropriate input
type,autocompletetoken, validation attributes, and mobile keyboard hints. - Disable autocomplete or spellcheck only when their output would be harmful or meaningless.
- Keep helper text and validation messages close to the relevant control.
- Explain how to correct an error; do not rely only on color or a generic failure message.
- Connect helper and error text with
aria-describedbywhen appropriate. - Set
aria-invalid="true"when rendering a custom invalid state. - Move focus to an error summary only when it helps users recover from a failed submission.
- Preserve user input after validation, network, or server errors.
- Communicate required and optional fields consistently.
- Use native
disabledwhen a control should be unavailable and undiscoverable by keyboard. - If an unavailable control must remain focusable, use
aria-disabled="true", prevent activation in code, and explain how to enable it.
Interaction and Feedback
- Use
<button>for actions and<a>for navigation. - Make the complete visible control clickable; avoid small icon-only hit areas or dead space between list items.
- Make pointer targets at least 24×24 CSS pixels, or provide sufficient spacing or an equivalent alternative.
- Provide clear hover, active, focus, selected, loading, success, and error states where relevant.
- Do not depend on hover for essential information or actions.
- Show feedback near the action; reserve global notifications for cross-page or asynchronous events.
- Keep immediate input feedback independent from slow network requests, analytics, and logging.
- Use optimistic updates only when failure can be clearly communicated and safely reversed.
- Prefer undo for frequent, low-risk destructive actions; confirm irreversible, expensive, or security-sensitive actions.
- Give important drag, swipe, and long-press actions a keyboard or direct-control alternative.
- Use
user-select: noneonly where text selection actively interferes with interaction. - Give decorative overlays
pointer-events: nonewhen they could intercept input. - Make empty states explain what is missing and suggest a useful next action.
Accessibility and Keyboard
- Give every interactive element an accessible name.
- Give icon-only controls a name through visible text,
aria-labelledby, oraria-label; hide decorative icons from assistive technologies.
<button type="button" aria-label="Close">
<svg aria-hidden="true" focusable="false">...</svg>
</button>
- Use meaningful
alttext for informative images and emptyalt=""for decorative images. - Do not use color, motion, position, or sound as the only way to communicate state.
- Maintain sufficient contrast for text, controls, focus indicators, and important states.
- Keep focus indicators clearly visible; prefer
:focus-visibleand do not remove outlines without an equivalent replacement. - Ensure sticky headers, floating toolbars, and overlays do not obscure focused elements.
- Keep content usable at 200% zoom and after text resizing.
- Remove hidden or off-screen controls from keyboard and accessibility navigation with
hidden,inert, or conditional rendering. - Follow ARIA APG keyboard patterns for custom widgets instead of inventing behavior.
- Preserve expected keyboard behavior: <kbd>Tab</kbd> moves between controls, <kbd>Enter</kbd> or <kbd>Space</kbd> activates buttons, and arrow keys navigate composite widgets.
- Document destructive shortcuts and make their effects reversible when possible.
- Test complex custom controls with keyboard and at least one screen reader.
- Test forced-colors and high-contrast modes; do not rely only on gradients, shadows, or opacity for state.
Dialogs, Popovers, and Tooltips
- Use
<dialog>withshowModal()when the background must become inert. - Use
popoverfor non-modal menus, teaching bubbles, and lightweight contextual panels when it fits the target browser policy; otherwise provide equivalent non-modal behavior. - For custom modals, implement focus containment, inert background content, scroll handling, Escape behavior, and focus restoration.
- Close non-critical dialogs, menus, popovers, and tooltips with <kbd>Escape</kbd>.
- Avoid stacked modals and focus traps without an obvious exit.
- Keep tooltips non-interactive; use a dialog, popover, or disclosure when content contains controls.
- Show tooltips on keyboard focus as well as hover, and keep them dismissible.
Motion and Touch
- Respect
prefers-reduced-motion; disable or simplify motion per component instead of applying a global reset. - If code waits for
transitionendoranimationend, provide an immediate completion path when motion is disabled. - Keep frequent animations short, subtle, non-blocking, and limited to properties such as transform and opacity.
- Avoid layout-heavy animation, large zooms, parallax, and persistent background motion unless they materially aid understanding.
- Pause looping animations and media when they are off-screen.
- Do not use animation as the only way to communicate a state change.
html {
scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
.dialog,
.popover,
.toast {
animation: none;
transition: none;
}
}
- Apply hover styles only on devices that support hover.
- Avoid autofocus on touch devices when it would unexpectedly open the keyboard.
- Keep text inputs at a size that avoids unwanted mobile zoom, commonly at least
16px. - Do not disable pinch zoom globally.
- Use the narrowest
touch-actionthat preserves native scrolling and zooming.
Layout, Typography, and Content
- Keep layouts usable across supported viewport sizes, zoom levels, text expansion, and input methods.
- Avoid fixed-height containers that clip content after text resizing or translation.
- Use readable font sizes, line heights, contrast, and tested font weights.
- Avoid font or weight changes on hover that cause layout shift.
- Load fonts intentionally and reduce layout shift with suitable fallbacks and font metrics.
- Use tabular numbers for timers, counters, prices, and numeric tables.
- Do not truncate important text without a way to inspect the full value.
- Use locale-aware date, time, number, currency, and plural formatting.
- Prefer explicit dates when relative or numeric dates could be ambiguous.
- Avoid sentence fragments that translators cannot reorder.
- Test supported interfaces with long text, CJK, emoji, code, mixed directionality, and right-to-left content.
Performance
- Optimize interaction responsiveness as well as initial loading.
- Keep typing, clicking, dragging, scrolling, and route changes free from long main-thread tasks.
- Split expensive work and defer non-critical rendering or computation.
- Lazy-load non-critical images and iframes, but do not lazy-load the likely LCP image.
- Set explicit media dimensions and use responsive image sources to reduce layout shift and unnecessary transfer.
- Pause, lazy-load, or unmount off-screen video and other expensive media.
- Virtualize only genuinely long lists; avoid the complexity for small collections.
- Use
IntersectionObserverandResizeObserverinstead of continuous polling when appropriate. - Debounce or throttle expensive high-frequency handlers.
- Use
will-changeonly for measured problems and remove it when no longer needed. - Test on representative devices and networks with browser performance tools and real-user metrics when available.
Resilience and Trust
- Preserve user work across validation errors, reloads, navigation, temporary network loss, and failed saves when possible.
- Show clear saving, saved, failed, conflict, and offline states for persistent edits.
- Make failures retryable and never silently discard user-authored content.
- Preserve layout during loading; use skeletons only when they resemble the final content and the wait is long enough to justify them.
- Write human-readable, action-oriented errors; do not expose raw backend errors.
- Protect destructive actions with undo, trash, version history, or confirmation according to their risk.
- Complete authentication and authorization checks before rendering protected content.
- Keep secrets and sensitive data out of URLs, page titles, analytics, referrers, screenshots, and error messages.
- Support copy, paste, and password managers in password, token, API key, and recovery-code fields.
- Label generated or automatically transformed content when provenance affects trust.
- Let users review, edit, accept, reject, or undo generated changes.
- Require explicit confirmation before generated actions affect other users, billing, permissions, publishing, or deletion.
Visual Design
- Make hierarchy and primary actions clear without creating multiple competing primary buttons.
- Keep destructive actions visually distinct from primary actions.
- Prefer inline editing for nearby content and modal flows for focused blocking tasks.
- Use progressive disclosure for advanced or infrequent settings.
- Choose safe, useful, and reversible defaults.
- Keep the interface understandable without relying on visual polish alone.
References
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.