--- name: eval-ui-ux description: "Specialized UI/UX evaluator for the Evaluate-Loop. Use this for evaluating UI shell tracks, design system tracks, screen implementation tracks, or any track where the primary deliverable is visual/interactive UI. Checks design system adherence, visual consistency, layout structure, responsive behavior, component states, animations, accessibility baseline, and usability check (copy quality). Dispatched by loop-execution-evaluator when track type is 'ui', 'design-system', or 'screens'. Triggered by: 'evaluate UI', 'UI review', 'design review', 'visual audit'." --- # UI/UX Evaluator Agent Specialized evaluator for tracks whose deliverables are visual UI — screens, components, design systems, layouts. ## When This Evaluator Is Used Dispatched by `loop-execution-evaluator` when the track is one of: - Screen implementation - Design system work - Component library - UI polish or UX audit ## Inputs Required 1. Track's `spec.md` — what was supposed to be built 2. Track's `plan.md` — tasks that should be complete 3. Design system reference — your project's global CSS or token file (e.g., `src/app/globals.css`) 4. Components to evaluate — all files in `src/components/` and `src/app/` 5. Data files — content JSON files used for copy (if applicable) ## Evaluation Passes (8 checks) ### Pass 1: Design System Adherence read_file your project's CSS/token file to extract the token system, then check components: | Check | What to Look For | |-------|-----------------| | Colors | CSS custom properties (`--color-*`, `--brand-*`) used, no raw hex/rgb in components | | Spacing | Tailwind spacing classes follow consistent grid, no arbitrary `px` values | | Typography | Font families from your design system fonts, sizes from scale | | Radius | Uses token-defined radius values, no random `rounded-*` overrides | | Shadows | Shadow classes from token system, consistent elevation levels | | Glass-morphism | Backdrop-blur, bg-opacity patterns on cards/modals/overlays (if applicable) | ```markdown ### Design System Adherence: PASS / FAIL - Hardcoded colors found: [count] — [list files:lines] - Hardcoded spacing found: [count] — [list files:lines] - Typography violations: [count] — [list] - Token coverage: [X]% of visual properties use design tokens ``` ### Pass 2: Visual Consistency Compare styling patterns across screens: | Check | What to Look For | |-------|-----------------| | Spacing rhythm | Same gap/padding patterns across sections | | Color usage | Brand palette applied consistently (not random grays) | | Component styling | Same component (Card, Button) looks identical on all pages | | Icon sizing | Icons use consistent size props | | Page structure | Similar content types have similar visual treatment | ```markdown ### Visual Consistency: PASS / FAIL - Inconsistencies found: [count] - Affected screens: [list] - Specific issues: [describe each] ``` ### Pass 3: Layout & Structure | Check | What to Look For | |-------|-----------------| | Header presence | Header component rendered on every page (or layout group) | | Footer presence | Footer component rendered on every page | | Container usage | Max-width Container wraps content on all pages | | Section usage | Vertical spacing via Section component | | Visual hierarchy | h1 → h2 → body → actions ordering clear | | Content width | No full-bleed text blocks (constrained width) | ```markdown ### Layout & Structure: PASS / FAIL - Pages missing Header: [list] - Pages missing Footer: [list] - Pages missing Container: [list] - Hierarchy issues: [describe] ``` ### Pass 4: Responsive Behavior Check component classes and layout patterns: | Breakpoint | What to Check | |-----------|---------------| | 375px (mobile) | Single column, stacked layout, touch-friendly | | 768px (tablet) | 2-column grids, adjusted spacing | | 1024px+ (desktop) | Full layout, 3-4 column grids | | Check | What to Look For | |-------|-----------------| | Grid collapse | `grid-cols-1 md:grid-cols-2 lg:grid-cols-3` patterns | | Horizontal scroll | No `overflow-x` issues, no fixed-width elements | | Touch targets | Buttons/links >= 44px on mobile (`min-h-11`, `p-3`, etc.) | | Mobile menu | Header collapses to hamburger/sheet on mobile | | Text truncation | Long text doesn't break layout | ```markdown ### Responsive: PASS / FAIL - Breakpoints covered: [375/768/1024] - Pages with issues: [list] - Touch target violations: [list components] ``` ### Pass 5: Component States & Conditional Rendering Check interactive components for complete state coverage and safe rendering logic: | Component Type | Required States | |---------------|----------------| | Button | default, hover, active, focus, disabled, loading | | Input | default, focus, error, disabled, placeholder | | Card | default, hover (if interactive) | | Modal | open/close animation, backdrop, focus trap, escape-to-close | | Toast | success, error, info variants | | Loading | spinner or skeleton for every async operation | **Conditional Rendering Patterns to Check:** | Anti-Pattern | What to Flag | Fix | |--------------|--------------|-----| | Magic string comparison | `status === 'ready' && ` | Use explicit arrays: `['ready', 'locked'].includes(status)` | | Non-exhaustive switch | Missing `default` case | Add TypeScript exhaustiveness check | | Mixed visual/data state | `status = locked ? 'locked' : 'ready'` | Separate: `const isLocked = item.locked; const hasContent = !!imageUrl;` | | Status explosion | 7+ status codes | Split into orthogonal states | **Example Brittle Pattern:** ```typescript // BAD: Image disappears when status changes {imageUrl && status === 'ready' && } // When item is locked, status becomes 'locked' → image hidden! // GOOD: Explicit list of statuses that show images const STATUSES_WITH_IMAGES = ['ready', 'locked', 'outdated']; {imageUrl && STATUSES_WITH_IMAGES.includes(status) && } // BETTER: Separate concerns const shouldShowImage = imageUrl && !['generating', 'error'].includes(status); {shouldShowImage && } ``` ```markdown ### Component States & Rendering: PASS / FAIL - Missing states: [component: missing state] - Components audited: [count] - Coverage: [X]% have all required states - **Brittle conditionals found: [count] — [list files:lines]** - **Non-exhaustive switches: [count] — [list]** - **Status explosion (>7 codes): [list components]** ``` ### Pass 6: Animation & Transitions | Check | What to Look For | |-------|-----------------| | Page transitions | Page transition wrapper or framer-motion layout | | Hover effects | Subtle scale/shadow/opacity changes on interactive elements | | Loading animations | Spinner/skeleton with smooth animation | | Modal transitions | Fade/scale on open/close | | State transitions | No sudden jumps between states | ```markdown ### Animations: PASS / FAIL - Pages missing transitions: [list] - Components missing hover effects: [list] - Jarring state changes: [describe] ``` ### Pass 7: Accessibility Baseline | Check | WCAG Level | What to Look For | |-------|-----------|-----------------| | Labels | A | All `` elements have associated `