| name | frontend-ui-integration |
| description | Implement or extend a user-facing workflow in a web application, integrating with existing backend APIs. Use when the feature is primarily a UI/UX change backed by existing APIs, affects only the web frontend, and requires following design system, routing, and testing conventions. |
Skill: Frontend UI integration
Purpose
Implement or extend a user-facing workflow in our primary web application, integrating with existing backend APIs and following our design system, routing, and testing conventions.
When to use this skill
- The feature is primarily a UI/UX change backed by one or more existing APIs.
- The backend contracts, auth model, and core business rules already exist.
- The change affects only the web frontend (no schema or service ownership changes).
Inputs
- Feature description: short narrative of the user flow and outcomes.
- Relevant APIs: endpoints, request/response types, and links to source definitions.
- Target routes/components: paths, component names, or feature modules.
- Design references: Figma links or existing screens to mirror.
- Guardrails: performance limits, accessibility requirements, and any security constraints.
Out of scope
- Creating new backend services or changing persistent data models.
- Modifying authentication/authorization flows.
- Introducing new frontend frameworks or design systems.
Conventions
- Framework: React with TypeScript.
- Routing: use the existing router and route layout patterns.
- Styling: use the in-house design system components (Buttons, Inputs, Modals, Toasts, etc.).
- State management: prefer the existing state libraries (e.g., React Query, Redux, Zustand) and follow established patterns.
Required behavior
- Implement the UI changes with strong typing for all props and API responses.
- Handle loading, empty, error, and success states using existing primitives.
- Ensure the UI is keyboard accessible and screen-reader friendly.
- Respect feature flags and rollout mechanisms where applicable.
Required artifacts
- Updated components and hooks in the appropriate feature module.
- Unit tests for core presentation logic.
- Integration or component tests for the new flow (e.g., React Testing Library, Cypress, Playwright) where the repo already uses them.
- Minimal CHANGELOG or PR description text summarizing the behavior change (to be placed in the PR, not this file).
Implementation checklist
- Locate the relevant feature module and existing components.
- Confirm the backend APIs and types, updating shared TypeScript types if needed.
- Implement the UI, wiring in API calls via the existing data layer.
- Add or update tests to cover the new behavior and edge cases.
- Run the required validation commands (see below).
Verification
Run the following (adjust commands to match the project):
npm run lintnpm testnpm run build
The skill is complete when:
- All tests, linters, and type checks pass.
- The new UI behaves as specified across normal, error, and boundary cases.
- No unrelated files or modules are modified.
Safety and escalation
- If the requested change requires backend contract changes, stop and request a backend-focused task instead.
- If design references conflict with existing accessibility standards, favor accessibility and highlight the discrepancy in the PR description.
Implementation Workflow
Discovery Phase
- Understand the feature requirements and acceptance criteria
- Explore codebase structure:
- Use
Globto find similar components and patterns - Use
Grepto understand naming conventions and implementations - Use
Readto examine relevant files and type definitions
- Use
- Check API contracts and backend code
- Map requirements to component architecture
Implementation Loop
Plan Phase:
- Identify which components need creation vs modification
- Map API contracts to component props and state
- Plan component hierarchy (parent → child)
- Document any new types needed in
lib/types.ts
Build Phase:
- Create files with proper TypeScript typing
- Import from existing design system and shared utilities
- Wire API calls via existing data layer (hooks)
- Follow established naming conventions (PascalCase components, camelCase functions)
- Build lower-level components first, then compose upward
Verify Phase:
- Run
npm run buildto check TypeScript compilation - Run
npm run lintto catch style issues - Verify no console errors in output
- Test interactive behavior if applicable
- Run
Review Phase:
- Review changes for completeness against requirements
- Ensure all acceptance criteria are met
- Check component interfaces are clean and typed
- Verify styling matches design system
Multi-Component Features
For features spanning multiple components:
- Build lower-level components first (primitives, reusable UI)
- Compose them in container/page-level components
- Test integration with existing pages
- Keep component responsibilities focused and single-purpose
Meal App Specifics
Backend APIs
- Chat:
POST /api/v1/chatwith SSE streaming- Request:
{ message: string, imageBase64?: string, conversationHistory?: Message[] } - Response: SSE events (thinking, message, actions, complete, error)
- Request:
- Inventory Summary:
GET /api/v1/inventory/summary- Response:
{ containers: Container[], contents: Content[], stats: InventoryStats }
- Response:
Design System
- Colors (CSS variables):
--color-cream,--color-herb,--color-tomato,--color-citrus,--color-clay - Typography:
--font-display(Playfair),--font-body(Source Sans) - Components: Custom React components (not ShadCN - using Framer Motion for animations)
- Spacing:
--space-4(1rem),--space-6(1.5rem), etc.
State Management Pattern
// Hook pattern (preferred)
function useSomething() {
const [state, setState] = useState<Type>(initial);
const handleAction = useCallback(() => { /* ... */ }, []);
return { state, handleAction };
}
// Avoid: Context unless multiple levels of prop drilling
// Avoid: Redux/Zustand - keep state local to components when possible
Component Organization
src/components/
├── chat/ # Chat-related components
│ ├── ChatContainer.tsx
│ ├── ChatInput.tsx
│ ├── MessageBubble.tsx
│ └── ThinkingIndicator.tsx
├── dashboard/ # Dashboard views
├── inventory/ # Inventory management
├── layout/ # Layout wrappers
├── ui/ # Primitive/reusable UI
└── alerts/ # Toast/alert components
Testing Strategy
- Component rendering: React Testing Library snapshots
- User interactions: fireEvent or userEvent
- API integration: Mock fetch responses in tests
- Check test patterns in existing test files before writing new ones
Common Patterns
SSE Streaming Hook:
async function* streamFromAPI(endpoint: string, body: any) {
const response = await fetch(endpoint, {
method: 'POST',
body: JSON.stringify(body),
});
const reader = response.body?.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const text = decoder.decode(value);
// Parse SSE format: "event: type\ndata: json\n\n"
yield parseSSEEvent(text);
}
}
API Error Handling:
try {
// API call
} catch (error) {
if (error instanceof Error) {
// Handle with toast or error state
}
}
Keyboard & Accessibility
- All inputs must be focusable with Tab key
- Buttons need :focus-visible outline
- Use semantic HTML (button, input, textarea, etc.)
- Test with screen readers for interactive components
- Ensure color contrast meets WCAG AA standards
Performance Considerations
- Use
useCallbackfor event handlers passed to child components - Memoize expensive computations with
useMemo - Keep component tree shallow to avoid deep re-renders
- Lazy load heavy components (images, modals) when possible
- Monitor bundle size with
npm run buildanalysis