CUB-194: scaffold Vite + React + TypeScript + Tailwind frontend
otto/review PR approved by Otto - frontend scaffold verified clean
ci/build Build + type-check + lint verified clean

- Initialize Vite project with React + TypeScript + Tailwind CSS
- Dark theme dashboard design (rig-dark palette, rig-accent colors)
- Minimal App with RemoteRig header + 'Dashboard coming soon' placeholder
- Directory structure: components, hooks, services, types, utils
- TypeScript types for Camera, CameraFeed, SystemHealth, StreamConfig
- Custom hooks: useCameraStatus, useSystemHealth (with mock data)
- API service layer with proxy config for /api → localhost:8080
- eslint, postcss, autoprefixer configured
- lucide-react icons integrated (Camera icon)
- .env.example, .gitignore, tsconfig basepaths configured
- Build + type-check + lint verified clean
This commit is contained in:
2026-05-19 07:31:23 -04:00
commit 5793617be3
23 changed files with 4335 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
const API_BASE = import.meta.env.VITE_API_URL || '/api'
async function request<T>(endpoint: string, options?: RequestInit): Promise<T> {
const response = await fetch(`${API_BASE}${endpoint}`, {
headers: { 'Content-Type': 'application/json' },
...options,
})
if (!response.ok) {
throw new Error(`API error: ${response.status} ${response.statusText}`)
}
return response.json()
}
export const api = {
getCameras: () => request<[]>('/cameras'),
getCameraStatus: (id: string) => request<[]>(`/cameras/${id}/status`),
getSystemHealth: () => request<[]>('/system/health'),
toggleRecording: (cameraId: string) =>
request<[]>(`/cameras/${cameraId}/recording`, { method: 'POST' }),
}