Babysitter react-development
Specialized skill for React component development, hooks patterns, state management, context API, performance optimization, and modern React best practices.
install
source · Clone the upstream repo
git clone https://github.com/a5c-ai/babysitter
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/a5c-ai/babysitter "$T" && mkdir -p ~/.claude/skills && cp -r "$T/library/specializations/web-development/skills/react-development" ~/.claude/skills/a5c-ai-babysitter-react-development && rm -rf "$T"
manifest:
library/specializations/web-development/skills/react-development/SKILL.mdsource content
React Development Skill
Expert assistance for building React applications with modern patterns, hooks, state management, and performance optimization.
Capabilities
- Generate React components with TypeScript and proper typing
- Implement custom hooks with composition patterns
- Configure state management (Context API, Redux Toolkit, Zustand)
- Optimize rendering performance with memoization
- Set up component testing with React Testing Library
- Create accessible, reusable component libraries
Usage
Invoke this skill when you need to:
- Create new React components with best practices
- Implement custom hooks for shared logic
- Set up state management architecture
- Optimize component rendering performance
- Configure React project structure
Inputs
| Parameter | Type | Required | Description |
|---|---|---|---|
| componentName | string | Yes | Name of the component (PascalCase) |
| componentType | string | No | functional, class (default: functional) |
| stateManagement | string | No | context, redux, zustand, jotai, none |
| typescript | boolean | No | Use TypeScript (default: true) |
| testing | boolean | No | Generate tests (default: true) |
| storybook | boolean | No | Generate Storybook stories (default: false) |
Component Configuration
{ "componentName": "UserProfile", "componentType": "functional", "props": [ { "name": "user", "type": "User", "required": true }, { "name": "onUpdate", "type": "(user: User) => void", "required": false } ], "hooks": ["useState", "useEffect", "useCallback"], "typescript": true, "testing": true }
Output Structure
src/ ├── components/ │ └── UserProfile/ │ ├── index.ts # Barrel export │ ├── UserProfile.tsx # Component implementation │ ├── UserProfile.types.ts # Type definitions │ ├── UserProfile.hooks.ts # Custom hooks │ ├── UserProfile.styles.ts # Styled components or CSS modules │ ├── UserProfile.test.tsx # Unit tests │ └── UserProfile.stories.tsx # Storybook stories (optional) ├── hooks/ │ ├── index.ts # Hook exports │ ├── useDebounce.ts # Debounce hook │ ├── useLocalStorage.ts # LocalStorage hook │ └── useFetch.ts # Data fetching hook └── context/ ├── index.ts # Context exports └── UserContext.tsx # User context provider
Generated Code Patterns
Functional Component Template
import { memo, useCallback, useState } from 'react'; import type { UserProfileProps } from './UserProfile.types'; import { useUserData } from './UserProfile.hooks'; export const UserProfile = memo(function UserProfile({ user, onUpdate, }: UserProfileProps) { const [isEditing, setIsEditing] = useState(false); const { updateUser, isLoading } = useUserData(); const handleSave = useCallback(async (data: UserData) => { await updateUser(data); onUpdate?.(data); setIsEditing(false); }, [updateUser, onUpdate]); return ( <div className="user-profile" role="region" aria-label="User Profile"> {/* Component content */} </div> ); }); UserProfile.displayName = 'UserProfile';
Custom Hook Template
import { useState, useEffect, useCallback } from 'react'; interface UseAsyncDataOptions<T> { initialData?: T; onError?: (error: Error) => void; } export function useAsyncData<T>( fetchFn: () => Promise<T>, deps: unknown[] = [], options: UseAsyncDataOptions<T> = {} ) { const [data, setData] = useState<T | undefined>(options.initialData); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState<Error | null>(null); const execute = useCallback(async () => { setIsLoading(true); setError(null); try { const result = await fetchFn(); setData(result); return result; } catch (err) { const error = err instanceof Error ? err : new Error(String(err)); setError(error); options.onError?.(error); } finally { setIsLoading(false); } }, deps); useEffect(() => { execute(); }, [execute]); return { data, isLoading, error, refetch: execute }; }
Context Provider Template
import { createContext, useContext, useReducer, useMemo, type ReactNode, } from 'react'; interface State { user: User | null; isAuthenticated: boolean; } type Action = | { type: 'SET_USER'; payload: User } | { type: 'LOGOUT' }; const initialState: State = { user: null, isAuthenticated: false, }; function reducer(state: State, action: Action): State { switch (action.type) { case 'SET_USER': return { ...state, user: action.payload, isAuthenticated: true }; case 'LOGOUT': return initialState; default: return state; } } const UserContext = createContext<{ state: State; dispatch: React.Dispatch<Action>; } | null>(null); export function UserProvider({ children }: { children: ReactNode }) { const [state, dispatch] = useReducer(reducer, initialState); const value = useMemo(() => ({ state, dispatch }), [state]); return ( <UserContext.Provider value={value}> {children} </UserContext.Provider> ); } export function useUser() { const context = useContext(UserContext); if (!context) { throw new Error('useUser must be used within a UserProvider'); } return context; }
Performance Optimization Patterns
Memoization
// Memoize expensive computations const sortedItems = useMemo(() => items.sort((a, b) => a.name.localeCompare(b.name)), [items] ); // Memoize callbacks to prevent child re-renders const handleClick = useCallback((id: string) => { setSelected(id); }, []); // Memoize components const MemoizedChild = memo(ChildComponent);
Code Splitting
import { lazy, Suspense } from 'react'; const LazyComponent = lazy(() => import('./HeavyComponent')); function App() { return ( <Suspense fallback={<LoadingSpinner />}> <LazyComponent /> </Suspense> ); }
Dependencies
{ "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "@testing-library/react": "^16.0.0", "@testing-library/jest-dom": "^6.0.0", "vitest": "^2.0.0" } }
Workflow
- Analyze requirements - Determine component structure and state needs
- Create type definitions - Define props, state, and context types
- Implement component - Build with hooks and proper patterns
- Add custom hooks - Extract reusable logic
- Optimize performance - Apply memoization where needed
- Write tests - Component and hook unit tests
- Add accessibility - ARIA attributes and keyboard navigation
Best Practices Applied
- TypeScript strict mode with proper typing
- Functional components with hooks (no class components)
- Custom hooks for shared logic
- Context API for app-wide state
- Memoization for performance
- Proper error boundaries
- Accessibility (a11y) compliance
- Testing with React Testing Library
References
- React Documentation: https://react.dev/
- React Hooks: https://react.dev/reference/react/hooks
- React Testing Library: https://testing-library.com/docs/react-testing-library/intro/
- web-artifacts-builder: https://github.com/anthropics/skills/tree/main/skills/web-artifacts-builder
- react-mcp: https://github.com/kalivaraprasad-gonapa/react-mcp
Target Processes
- react-application-development
- component-library-creation
- state-management-setup
- performance-optimization
- frontend-testing