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 lint - •
npm test - •
npm 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
typescript
// 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
code
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:
typescript
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:
typescript
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