frontend/src/
├── main.ts # App bootstrap (Pinia, Router, VueQuery)
├── App.vue # Root: AppShell if auth'd, else raw RouterView
├── router/index.ts # 17 routes with auth guards
├── stores/
│ ├── auth.ts # User profile, JWT, isPremium, login/logout
│ └── ui.ts # Mobile menu state, search query
├── lib/
│ ├── api.ts # Axios instance with Bearer interceptor + 401 redirect
│ └── utils.ts # cn(), formatCurrency, formatDate, daysUntil
├── components/
│ ├── layout/ # AppShell, TopNav, SearchBar, UserMenu
│ └── shared/ # Reusable across pages
│ ├── DataTable.vue # Sortable, paginated, expandable rows
│ ├── KpiCard.vue # Metric + delta + subtitle
│ ├── StatusBadge.vue # Color-coded status pills
│ ├── AlertStrip.vue # Dismissible alert banner
│ ├── DealEditModal.vue # Full deal edit form in modal
│ ├── ContractViewer.vue # MinIO presigned URL download modal
│ └── SaveToast.vue # Floating save indicator (saving/saved/error)
└── pages/ # 15 page components