# Frontend Scaffold & Recommendations
## ๐จ Recommended Tech Stack
```
Next.js 14
โโโ React 18
โโโ TypeScript
โโโ Tailwind CSS
โโโ React Flow (for reasoning graphs)
โโโ Axios (API client)
```
---
## ๐ Suggested Project Structure
```
frontend/
โโโ public/
โ โโโ assets/
โโโ src/
โ โโโ app/
โ โ โโโ layout.tsx # Root layout
โ โ โโโ page.tsx # Home page
โ โ โโโ upload/
โ โ โ โโโ page.tsx # Paper upload
โ โ โโโ analysis/
โ โ โ โโโ page.tsx # Analysis dashboard
โ โ โ โโโ [id]/
โ โ โ โโโ page.tsx # Analysis details
โ โ โโโ protocols/
โ โ โ โโโ [id]/
โ โ โ โโโ page.tsx # Protocol view/edit
โ โ โโโ admin/
โ โ โโโ page.tsx # Admin panel
โ โโโ components/
โ โ โโโ ui/ # Reusable UI
โ โ โ โโโ Button.tsx
โ โ โ โโโ Card.tsx
โ โ โ โโโ Modal.tsx
โ โ โ โโโ layout/
โ โ โโโ features/ # Feature components
โ โ โ โโโ UploadZone.tsx
โ โ โ โโโ ContradictionView.tsx
โ โ โ โโโ ProtocolEditor.tsx
โ โ โ โโโ ReasoningTracer.tsx
โ โ โ โโโ GraphVisualizer.tsx
โ โ โโโ layout/
โ โ โโโ Header.tsx
โ โ โโโ Sidebar.tsx
โ โ โโโ Footer.tsx
โ โโโ lib/
โ โ โโโ api/
โ โ โ โโโ client.ts # Axios instance
โ โ โ โโโ endpoints.ts # API URLs
โ โ โ โโโ types.ts # TypeScript interfaces
โ โ โโโ hooks/
โ โ โ โโโ useAnalysis.ts
โ โ โ โโโ usePapers.ts
โ โ โ โโโ useProtocols.ts
โ โ โโโ utils/
โ โ โโโ formatting.ts
โ โ โโโ validation.ts
โ โโโ store/ # Zustand or Redux
โ โ โโโ analysisStore.ts
โ โ โโโ userStore.ts
โ โโโ styles/
โ โ โโโ globals.css # Tailwind imports
โ โโโ types/
โ โโโ analysis.ts
โ โโโ protocol.ts
โ โโโ paper.ts
โโโ package.json
โโโ tsconfig.json
```
---
## ๐ Getting Started
### 1. Create New Next.js Project
```bash
# Using create-next-app
npx create-next-app@latest scoinvestigator-frontend \
--typescript \
--tailwind \
--eslint
cd scoinvestigator-frontend
```
### 2. Install Dependencies
```bash
npm install \
axios \
react-flow-renderer \
zustand \
react-icons \
react-toastify
# Optional: for advanced visualizations
npm install \
d3 \
cytoscape \
react-cytoscape
```
### 3. Environment Setup
```bash
# .env.local
NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1
NEXT_PUBLIC_WS_URL=ws://localhost:8000
```
---
## ๐ Key Pages & Components
### ๐ Upload Papers (`/upload`)
```tsx
// Features:
- Drag & drop zone
- Multiple file upload
- PDF preview
- Progress indicator
- Metadata extraction preview
// Key component: UploadZone.tsx
```
### ๐ Analysis Dashboard (`/analysis`)
```tsx
// Features:
- List of all analyses
- Status indicators
- Timeline view
- Quick actions (view, export, delete)
- Filtering & search
// Key component: AnalysisList.tsx
```
### ๐ Analysis Details (`/analysis/[id]`)
```tsx
// Features:
- Tabs: Summary | Contradictions | Hypotheses | Gaps | Protocols
- Reasoning trace visualization
- Metrics display
- Document references
- Export options
// Key components:
// - ContradictionView.tsx (table with severity scores)
// - ReasoningTracer.tsx (step-by-step breakdown)
// - GraphVisualizer.tsx (document relationships)
```
### ๐งช Protocol Designer (`/protocols/[id]`)
```tsx
// Features:
- Protocol editor (rich text or form)
- Variable specification
- Risk assessment form
- Cost/duration estimator
- Version history
- Export (PDF, DOCX, LaTeX)
// Key component: ProtocolEditor.tsx
```
### ๐ Reasoning Trace Visualization
```tsx
// Using React Flow:
Nodes: Analysis steps
Edges: Dependencies
Styling: Color-coded by status (pending/active/complete)
Interaction: Click to see details
// Key component: GraphVisualizer.tsx with react-flow-renderer
```
---
## ๐ก API Integration
### API Client Setup
```typescript
// lib/api/client.ts
import axios from 'axios';
const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL,
timeout: 30000,
});
// Add token to requests
apiClient.interceptors.request.use((config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
export default apiClient;
```
### Main Endpoints to Integrate
```typescript
// lib/api/endpoints.ts
export const endpoints = {
// Analysis
analysis: {
run: '/analysis/run',
status: (id: string) => `/analysis/${id}/status`,
results: (id: string) => `/analysis/${id}/results`,
},
// Papers
papers: {
upload: '/papers/upload',
list: (projectId: string) => `/papers/${projectId}`,
},
// Protocols
protocols: {
generate: '/protocols/generate',
list: '/protocols',
detail: (id: string) => `/protocols/${id}`,
export: (id: string, format: string) => `/protocols/${id}/export?format=${format}`,
},
// Health
health: '/health/ready',
};
```
### Custom Hooks
```typescript
// lib/hooks/useAnalysis.ts
import { useState, useEffect } from 'react';
import apiClient from '@/lib/api/client';
export function useAnalysis(analysisId: string) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchAnalysis = async () => {
try {
const response = await apiClient.get(
`/analysis/${analysisId}/results`
);
setData(response.data);
} catch (err) {
setError(err);
} finally {
setLoading(false);
}
};
fetchAnalysis();
}, [analysisId]);
return { data, loading, error };
}
```
---
## ๐จ UI Components (Tailwind)
### Theme & Colors
```tsx
// Suggested color scheme
Primary: Blue-600 (reasoning)
Secondary: Emerald-600 (validation)
Danger: Red-600 (contradictions)
Warning: Amber-600 (gaps)
```
### Key Components to Build
#### ContradictionCard
```tsx
interface Contradiction {
id: string;
variable: string;
confidence: number;
statement_a: string;
statement_b: string;
severity: 'low' | 'medium' | 'high';
}
{error.message}