chore: bootstrap repository with governance docs

Initialize git, add Apache-2.0 LICENSE, .gitattributes (LF line
endings), AGENTS.md (entry points, stack, discovery order, baseline
checks), RUNBOOK.md (dev boot, prod deploy with overlay, ingestion,
failures, rollback, scaling notes), .env.prod.example with rotated
credential placeholders, and dev-only warnings on .env.example.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vadim Malanov
2026-05-13 16:41:50 +03:00
commit 7f72171572
157 changed files with 11298 additions and 0 deletions

140
frontend/README.md Normal file
View File

@@ -0,0 +1,140 @@
# LegacyHUB · Frontend
React + TypeScript + Vite frontend for **LegacyHUB**, the legacy-document
indexing and AI search module of the **TeamHUB Suite**.
This package ships:
- the application shell (collapsible sidebar, top toolbar, breadcrumb nav,
global ⌘K command palette, light/dark theme, notification center,
user/profile menu);
- nine pages: Dashboard, Documents, Ingestion Jobs, Search, Document Viewer,
Tables & Figures, Quality Control, System Health, Settings;
- a hybrid AI search workspace with semantic / lexical / hybrid modes, live
suggestions, expandable filters, highlighted matches, reranker score
visualization and side-by-side chunk preview;
- typed service layer (`src/services/*`) with Axios + TanStack Query and a
mock data backend you can toggle off when the backend is reachable.
## Stack
| Concern | Library |
|----------------|-----------------------------------------|
| Bundler | Vite 5 |
| Language | TypeScript 5.6 |
| UI | React 18 |
| Styling | TailwindCSS 3 + custom design tokens |
| Components | shadcn/ui primitives (Radix + cva) |
| Animation | Framer Motion |
| Charts | Recharts |
| Server state | TanStack Query |
| Client state | Zustand |
| Routing | React Router v6 |
| HTTP | Axios |
| Icons | lucide-react |
| Toasts | sonner |
| Virtualization | @tanstack/react-virtual |
## Quick start
```bash
cd frontend
cp .env.example .env # VITE_USE_MOCK=true for offline UI development
npm install
npm run dev # http://localhost:5173
```
When the FastAPI backend is running, set `VITE_USE_MOCK=false` (or simply
`VITE_API_BASE_URL=/api/v1` and let the Vite dev proxy at port 8000 handle
routing). All API calls are isolated through `src/services/*.ts`.
## Architecture
```
frontend/src/
app/ RouterProvider, QueryClient, TooltipProvider, theme bootstrap
pages/ One file per route — composed of widgets + primitives
layouts/ AppShell, Sidebar (collapsible), Topbar, Breadcrumbs, ⌘K palette
widgets/ Domain-specific composite components (KpiCard, Charts, Result cards,
PdfPreviewPane, ChunkPreview, ServiceHealthCard, Timeline)
components/
ui/ shadcn-style primitives — Button, Card, Tabs, Dialog, Select,
Tooltip, Popover, ScrollArea, Command, Skeleton, Progress, …
common/ Domain primitives — Logo, StatusChip, ConfidenceMeter,
QualityFlag, BlockTypeIcon, Highlight, EmptyState, PageHeader,
ThemeToggle
services/ Typed API layer (Axios) + TanStack hooks (one file per resource)
mock/ Deterministic mock data + simulated latency
hooks/ Wrappers around services exposing TanStack Query hooks
stores/ Zustand stores: uiStore (theme, sidebar, palette), searchStore
styles/ Tailwind layer + design tokens (HSL CSS variables)
lib/ cn(), formatBytes/Number/Percent/Duration, relativeTime, etc.
```
### Design system
- **Palette** — white / light-gray surfaces with a single restrained green
accent (`--primary: 158 64% 32%`) matching QMS Hub.
- **Surfaces** — three tiers: sunken (page background), default card, raised
(popovers / dialogs). Glass surfaces via `backdrop-blur` for the topbar.
- **Corners** — `--radius: 14px` produces soft, premium edges across every
component.
- **Shadows** — `shadow-soft` and `shadow-elevated` only. No harsh drop
shadows.
- **Typography** — Inter variable, optical sizes, tabular numbers for data
cells, JetBrains Mono for IDs / paths / hashes.
- **Motion** — Framer Motion `layoutId` for the active sidebar pill,
`fade-in-up` for KPI cards, animated tabs and result expansion.
- **States** — skeleton shimmer instead of spinners wherever possible.
### Key flows
- **Hybrid search (`/search`)** — Debounced query → TanStack hook hits the
backend (or mock). Results are virtualized, scored, optionally reranked.
Picking a result hydrates a side-by-side ChunkPreview with the highlighted
excerpt, a page thumbnail, citation metadata, and quality flags.
- **Documents (`/documents`)** — Virtualized table (TanStack Virtual)
supports thousands of rows. Filters: status, OCR threshold, "needs review",
free-text search. Clicking a row opens the viewer.
- **Document Viewer (`/viewer/:id`)** — Split layout. Left pane: PDF page
thumbnails + synchronized large page preview with highlighted OCR blocks.
Right pane: extracted chunks / tables / figures / metadata, kept in lock-step
with the active page. Below: full pipeline timeline.
- **Ingestion (`/ingestion`)** — Submit a folder path with `recursive` /
`force` toggles → optimistic queue, run history table with live progress
bars.
- **Quality control (`/quality`)** — Three review queues (low confidence,
handwriting, failed extraction) with reviewer actions and an audit log.
### Mock vs real backend
`src/services/apiClient.ts` exports a constant `USE_MOCK`. When `true`, every
service module short-circuits to `src/services/mock/mockData.ts` which
generates deterministic, seeded data: 280 documents, dashboards, ingestion
runs, search results, health and queue snapshots, and per-document detail
(pages, chunks, tables, figures, timeline events).
This lets the frontend be developed and demoed without the Python services
running.
### Accessibility
- All interactive elements use `ring-focus` (visible 2px primary ring).
- Sidebar nav exposes tooltips when collapsed.
- Keyboard: `Ctrl/Cmd + K` opens the global command palette.
### Responsive layout
- ≥ 1280 px (xl, ultrawide) — three-column dashboards, side-by-side search.
- 10241280 px (laptop) — two-column dashboards, stacked search.
- < 1024 px — single column; sidebar collapses to icons only.
## Scripts
```bash
npm run dev # Vite dev server with /api proxy → :8000
npm run build # type-check + production bundle
npm run preview # preview build
npm run lint
npm run format
```