Awesome-omni-skill auditor-frontend-ui-ux
Audit frontend code quality, UI/UX, forms, state management, and translations. Typically loaded by the audit-orchestrator skill via sub-agents, but can be used standalone.
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/auditor-frontend-ui-ux" ~/.claude/skills/diegosouzapw-awesome-omni-skill-auditor-frontend-ui-ux && rm -rf "$T"
manifest:
skills/development/auditor-frontend-ui-ux/SKILL.mdsource content
Frontend UI/UX Checklist
Verification Patterns (Stub Detection)
Before checking code quality, verify implementations are real — not stubs or placeholders.
Principle: Existence ≠ Implementation. A file existing does not mean the feature works.
4-Level Verification
| Level | Check | How |
|---|---|---|
| Exists | File is at expected path, exports component/function | File + export check |
| Substantive | Returns real JSX, not placeholder div | Check for meaningful content, state usage, event handlers with logic |
| Wired | Connected to the app — imported and used somewhere | grep for imports, route registration |
| Functional | Renders correctly, interactions work | Build passes, tests pass, visual verification |
Red Flags (auto-fail)
- Components returning
,<div>Placeholder</div>
, or<div>{/* TODO */}</div>null - Event handlers that are empty:
,onClick={() => {}}
with no other logiconSubmit={(e) => e.preventDefault()} - Hooks returning hardcoded values:
return { user: null, login: () => {} } - State that exists but is never rendered in JSX
- Fetch/API calls that exist but whose responses are ignored
- Components with only static content where dynamic content is expected
-only handlersconsole.log
Wiring Checks
- Component → API: Component has fetch/axios/useQuery call AND uses the response in render
- Form → Handler: onSubmit calls API/mutation AND handles success/error, not just
preventDefault() - State → Render: State variables appear in JSX (
, interpolation), not just defined.map() - Route → Component: Component is registered in router AND renders at expected path
- Hook → Consumer: Custom hook is imported and called somewhere, return values are consumed
Code Quality
Pattern Consistency
- Component structure matches existing (folder layout, file naming)
- Naming conventions match codebase (components, hooks, utils)
- Import ordering and grouping consistent
- Export style matches (default vs named, barrel files)
- Hook patterns match existing (custom hooks location, naming)
- Event handler naming consistent (handleX, onX)
- State management approach matches (context, stores, local)
- API call patterns match (hooks, services, inline)
- Styling approach matches (CSS modules, Tailwind, styled-components)
Clean Code
- No deep nesting (max 3 levels, extract components)
- No magic numbers/strings (use constants/theme)
Type Safety
- TypeScript types explicit (no
, no implicit any)any - Props fully typed (interfaces/types)
- Return types declared for functions
- Null/undefined handled properly (optional chaining, defaults)
- No type assertions without reason (
casts)as
Visual & Layout
Consistency
- Colors match design system
- Typography follows hierarchy
- Spacing is consistent (use design tokens)
- Icons are from the same family
- Borders/shadows follow patterns
Layout
- Responsive at all breakpoints (mobile, tablet, desktop)
- No horizontal scroll on mobile
- Content doesn't overflow containers
- Proper alignment (left, center, right)
- Grid/flex used appropriately
Interactions
- Hover states present and consistent
- Focus states visible (accessibility)
- Loading states for async actions
- Error states are clear
- Success feedback provided
Usability
- Actions are discoverable
- Labels are clear and concise
- Forms have proper validation feedback
- Navigation is intuitive
- Empty states are handled
Accessibility
- Sufficient color contrast (WCAG AA)
- Keyboard navigation works
- Screen reader friendly (ARIA labels)
- Focus order is logical
- Text is resizable
Forms
Validation
- Required fields enforced
- Input types validated (email, phone, URL)
- Length limits enforced (min/max)
- Custom validation rules applied
- Server-side validation mirrors client-side
Error Display
- Errors shown next to relevant field
- Error messages are actionable (not just "Invalid")
- Errors clear when user corrects input
- Multiple errors shown (not just first)
- Server validation errors mapped to fields
Submission
- Submit button disabled while submitting
- Loading indicator during submission
- Success feedback provided
- Error feedback on failure
- No double submission possible
Form State
- Dirty state tracked (unsaved changes warning)
- Form resets properly after submit
- Default values populated correctly
- Edit mode loads existing data
Form UX
- Tab order is logical
- Enter key submits form (where appropriate)
- Autofocus on first field
- Inline validation (on blur, not just submit)
Form Accessibility
- Labels linked to inputs (htmlFor/id)
- Error messages announced to screen readers
- Required fields marked (aria-required)
- Invalid fields marked (aria-invalid)
- Focus moves to first error on submit failure
State Management
State Location
- State lives at the right level (not too high, not too low)
- Server state vs client state separated
- URL is source of truth for navigation state
- Form state is local unless needed elsewhere
- No duplicate state (derived data stored separately)
Data Flow
- No prop drilling beyond 2-3 levels
- Context used for truly global state only
- Data flows one direction (parent → child)
- Side effects are explicit and traceable
Performance
- No unnecessary re-renders from state changes
- Large lists are virtualized or paginated
- Expensive computations are memoized
- Selectors used for derived state
Data Fetching
- Loading states handled
- Error states handled
- Stale data strategy defined (refetch, cache)
- Race conditions prevented (abort, latest-only)
- Optimistic updates rollback on failure
Normalization & Persistence
- Relational data is normalized (no nested duplicates)
- Entities stored by ID in lookup objects
- Persisted state handles schema changes
- Sensitive data not stored in localStorage
- Hydration doesn't cause flicker
Translations
- All supported languages have entries for new strings
- Interpolation variables preserved (match source language exactly)
- Length works in UI (no truncation in longer languages)
- Keys follow project naming convention