annotations v2: redesign
ci/woodpecker/push/build-arm Pipeline failed

Reskin to v2 surface/accent tokens + JetBrains Mono headings to match
_docs/ui_design/v2/plugin/annotations.html. Add scrubber with class-colored
annotation marks, canvas top bar (zoom/cursor/dims), floating AI-detection
banner, multi-band gradient rows in the annotations sidebar, class-distribution
summary footer, and DOM-overlay bbox labels with affiliation icon + readiness
dot. Split VideoPlayer chrome out into the page-level controls row
(transport/frame-step/save/delete/AI-detect/mute/volume) and a new Scrubber
component; player events replace 200ms polling.

Other:
- Auth dev bypass via VITE_DEV_AUTH_BYPASS (gated on import.meta.env.DEV).
- Mount SavedAnnotationsProvider in App so AnnotationsPage doesn't crash.
- Extract hexToRgba to src/class-colors and time helpers to
  src/features/annotations/time.ts (dedup across CanvasEditor / Sidebar /
  AnnotationsPage).
- CanvasEditor: shallow-compare label chips before commit, NaN-guard
  annotation-time parser, cancel cursor RAF on unmount.
- AnnotationsPage: track AI-banner close timer, push initial volume to the
  <video> on media change, drop the duplicate parent muted state.
- Fixed sidebar widths (resize handles removed per design).
This commit is contained in:
Armen Rohalov
2026-05-28 02:28:10 +03:00
parent cfffb4bdd7
commit f754afff46
17 changed files with 1279 additions and 415 deletions
+15 -13
View File
@@ -1,6 +1,6 @@
import { Routes, Route, Navigate } from 'react-router-dom'
import { AuthProvider, ProtectedRoute } from './auth'
import { Header, FlightProvider } from './components'
import { Header, FlightProvider, SavedAnnotationsProvider } from './components'
import { LoginPage } from './features/login'
import { FlightsPage } from './features/flights'
import { AnnotationsPage } from './features/annotations'
@@ -18,19 +18,21 @@ export default function App() {
element={
<ProtectedRoute>
<FlightProvider>
<div className="flex flex-col h-screen">
<Header />
<div className="flex-1 overflow-hidden">
<Routes>
<Route path="/flights" element={<FlightsPage />} />
<Route path="/annotations" element={<AnnotationsPage />} />
<Route path="/dataset" element={<DatasetPage />} />
<Route path="/admin" element={<AdminPage />} />
<Route path="/settings" element={<SettingsPage />} />
<Route path="*" element={<Navigate to="/flights" replace />} />
</Routes>
<SavedAnnotationsProvider>
<div className="flex flex-col h-screen">
<Header />
<div className="flex-1 overflow-hidden">
<Routes>
<Route path="/flights" element={<FlightsPage />} />
<Route path="/annotations" element={<AnnotationsPage />} />
<Route path="/dataset" element={<DatasetPage />} />
<Route path="/admin" element={<AdminPage />} />
<Route path="/settings" element={<SettingsPage />} />
<Route path="*" element={<Navigate to="/flights" replace />} />
</Routes>
</div>
</div>
</div>
</SavedAnnotationsProvider>
</FlightProvider>
</ProtectedRoute>
}