# Frontend Implementation

> 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.

- Skill: `majiayu000/frontend-implementation-2` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add majiayu000/frontend-implementation-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/frontend-implementation-2/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/frontend-implementation-2

---


# 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(<LoginForm onSubmit={mockSubmit} />)

  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<UserProfileProps> = ({ userId, onUpdate }) => {
  const [user, setUser] = useState<User | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(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 <div>Loading...</div>;
  if (error) return <div>Error: {error}</div>;
  if (!user) return <div>User not found</div>;

  return (
    <div className="user-profile">
      <h2>{user.name}</h2>
      <p>{user.email}</p>
    </div>
  );
};
```

### 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 (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor="email">Email</label>
        <input
          id="email"
          type="email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
          aria-invalid={!!errors.email}
          aria-describedby={errors.email ? "email-error" : undefined}
        />
        {errors.email && <span id="email-error" role="alert">{errors.email}</span>}
      </div>
      <div>
        <label htmlFor="password">Password</label>
        <input
          id="password"
          type="password"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
          aria-invalid={!!errors.password}
        />
        {errors.password && <span role="alert">{errors.password}</span>}
      </div>
      <button type="submit">Login</button>
    </form>
  );
};
```

## 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)

