--- name: Frontend Implementation description: Frontend development with React, Vue, Angular, modern web technologies. Use for frontend, ui, react, vue, angular, web, component tags. Provides validation commands, component patterns, accessibility guidance. allowed-tools: Read, Write, Edit, Bash, Grep, Glob --- # Frontend Implementation Skill Domain-specific guidance for frontend UI development, component implementation, and user interactions. ## When To Use This Skill Load this Skill when task has tags: - `frontend`, `ui`, `react`, `vue`, `angular`, `web` - `component`, `jsx`, `tsx`, `styling`, `responsive` ## Validation Commands ### Run Tests ```bash # Full test suite npm test # With coverage npm test -- --coverage # Watch mode npm test -- --watch # Specific test file npm test -- UserProfile.test.tsx # Specific test pattern npm test -- -t "should render profile" ``` ### Build Project ```bash # Production build npm run build # Development build npm run build:dev # Type checking (TypeScript) npm run type-check # Linting npm run lint ``` ### Run Application ```bash # Development server npm start # With specific port PORT=3001 npm start ``` ## Success Criteria (Before Completing Task) ✅ **ALL tests MUST pass** (0 failures) ✅ **Build MUST succeed** without errors ✅ **No TypeScript/linting errors** ✅ **Component renders without errors** ✅ **Responsive design works** (mobile, tablet, desktop) ✅ **Accessibility standards met** (ARIA labels, keyboard navigation) ## Common Frontend Tasks ### Component Development - Create functional components (React hooks, Vue composition API) - Props and state management - Event handling - Conditional rendering - List rendering with keys ### Styling - CSS modules or styled-components - Responsive design (media queries) - Mobile-first approach - Consistent with design system ### Forms and Validation - Form state management (Formik, React Hook Form) - Input validation (client-side) - Error display - Submit handling ### API Integration - Fetch data with useEffect/axios - Loading states - Error handling - Data transformation ## Testing Principles for Frontend ### Component Testing (Preferred) ✅ **Test user interactions:** ```tsx test('submits form with valid data', () => { render() fireEvent.change(screen.getByLabelText('Email'), { target: { value: 'user@example.com' } }) fireEvent.change(screen.getByLabelText('Password'), { target: { value: 'password123' } }) fireEvent.click(screen.getByText('Login')) expect(mockSubmit).toHaveBeenCalledWith({ email: 'user@example.com', password: 'password123' }) }) ``` ### What to Test ✅ **DO test:** - Component renders without errors - Correct content displays - User interactions work (clicks, inputs) - Conditional rendering logic - Form validation - Error states - Accessibility (ARIA attributes, keyboard navigation) ❌ **DON'T test:** - Implementation details (state variable names) - Third-party library internals - Styling specifics (unless critical) ### Test User-Facing Behavior ```tsx // ✅ GOOD - Tests what user sees expect(screen.getByText('Welcome, John')).toBeInTheDocument() expect(screen.getByRole('button', { name: 'Submit' })).toBeEnabled() // ❌ BAD - Tests implementation details expect(component.state.username).toBe('John') expect(mockFunction).toHaveBeenCalledTimes(1) ``` ## Common Blocker Scenarios ### Blocker 1: API Not Ready **Issue:** Frontend needs API endpoint that doesn't exist yet **What to try:** - Check if backend task is marked complete - Mock API responses for development - Create mock data file **If blocked:** Report to orchestrator - backend task may be incomplete ### Blocker 2: Design Assets Missing **Issue:** Need icons, images, colors not provided **What to try:** - Check design system documentation - Use placeholder assets temporarily - Check with design team **If blocked:** Report to orchestrator - need design assets or specifications ### Blocker 3: TypeScript Type Errors **Issue:** Complex types from API don't match frontend expectations **What to try:** - Check API response format (console.log actual response) - Generate types from API schema (OpenAPI, GraphQL) - Use `unknown` type and validate at runtime **Common causes:** - API changed but types not updated - Optional fields not marked with `?` - Nested objects not properly typed ### Blocker 4: Test Environment Issues **Issue:** Tests fail in CI but pass locally **What to try:** - Check Node version consistency - Check test environment variables - Check for timing issues (add waitFor) - Check for browser-specific APIs used without polyfills ### Blocker 5: Responsive Design Conflicts **Issue:** Component works on desktop but breaks on mobile **What to try:** - Test in browser dev tools mobile view - Check media queries - Check for fixed widths vs responsive units - Check for overflow issues ## Blocker Report Format ``` ⚠️ BLOCKED - Requires Senior Engineer Issue: [Specific problem - API endpoint 404, missing design specs, etc.] Attempted Fixes: - [What you tried #1] - [What you tried #2] - [Why attempts didn't work] Root Cause (if known): [Your analysis] Partial Progress: [What work you DID complete] Context for Senior Engineer: - Error output: [Console errors, network errors] - Screenshots: [If visual issue] - Related files: [Files involved] Requires: [What needs to happen] ``` ## Quick Reference ### React Functional Component ```tsx import React, { useState, useEffect } from 'react'; interface UserProfileProps { userId: string; onUpdate?: (user: User) => void; } export const UserProfile: React.FC = ({ userId, onUpdate }) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch(`/api/users/${userId}`) .then(res => res.json()) .then(data => { setUser(data); setLoading(false); }) .catch(err => { setError(err.message); setLoading(false); }); }, [userId]); if (loading) return
Loading...
; if (error) return
Error: {error}
; if (!user) return
User not found
; return (

{user.name}

{user.email}

); }; ``` ### Form with Validation ```tsx import { useState } from 'react'; export const LoginForm = ({ onSubmit }) => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [errors, setErrors] = useState({}); const validate = () => { const newErrors = {}; if (!email) newErrors.email = 'Email required'; if (!email.includes('@')) newErrors.email = 'Invalid email'; if (!password) newErrors.password = 'Password required'; if (password.length < 8) newErrors.password = 'Min 8 characters'; return newErrors; }; const handleSubmit = (e) => { e.preventDefault(); const newErrors = validate(); if (Object.keys(newErrors).length > 0) { setErrors(newErrors); return; } onSubmit({ email, password }); }; return (
setEmail(e.target.value)} aria-invalid={!!errors.email} aria-describedby={errors.email ? "email-error" : undefined} /> {errors.email && {errors.email}}
setPassword(e.target.value)} aria-invalid={!!errors.password} /> {errors.password && {errors.password}}
); }; ``` ## Accessibility Checklist ✅ **ARIA labels** for all interactive elements ✅ **Keyboard navigation** works (Tab, Enter, Escape) ✅ **Focus indicators** visible ✅ **Color contrast** meets WCAG AA standards ✅ **Screen reader** compatible ✅ **Semantic HTML** (button, nav, main, header) ✅ **Alt text** for images ✅ **Form labels** associated with inputs ## Common Patterns to Follow 1. **Mobile-first responsive design** 2. **Component composition** over inheritance 3. **Props for configuration, state for interaction** 4. **Lifting state up** when shared between components 5. **Error boundaries** for error handling 6. **Loading states** for async operations 7. **Accessibility by default** (ARIA, keyboard support) ## What NOT to Do ❌ Don't use inline styles for complex styling ❌ Don't forget key prop in lists ❌ Don't mutate state directly ❌ Don't skip accessibility features ❌ Don't hardcode API URLs (use environment variables) ❌ Don't skip loading and error states ❌ Don't forget mobile responsiveness ## Focus Areas When reading task sections, prioritize: - `requirements` - What UI needs to be built - `technical-approach` - Component structure, state management - `design` - Visual specifications, layout - `ux` - User interactions, flows ## Remember - **Test user interactions** - what users see and do, not implementation - **Accessibility is mandatory** - ARIA labels, keyboard navigation - **Mobile-first** - design for mobile, enhance for desktop - **Error and loading states** - always handle async operations - **Report blockers promptly** - missing APIs, design assets, specifications - **Follow existing patterns** - check codebase for similar components - **Validation is mandatory** - ALL tests must pass before completion ## Additional Resources For deeper patterns and examples, see: - **PATTERNS.md** - React hooks patterns, state management (load if needed) - **BLOCKERS.md** - Detailed frontend-specific blockers (load if stuck) - **examples.md** - Complete component examples (load if uncertain)