- height:100vh (not min-height) so align-items:stretch actually works
- Footer shows when expanded, hides when collapsed (dynamic class)
- Remove align-self:stretch (unnecessary with flex stretch)
- Restore flex-shrink on divider
- Replace v-show with CSS .gs-nav-label + .collapsed display: none
- Use CSS class .gs-hidden instead of v-show for footer/divider
- Fix content not re-displaying after collapse/expand
- Import BuildVersion component
- Add to template (top-right corner fixed)
- Visible on all views
Build version format: 20260725133504-gitHash
Shows in top-right corner with monospace font
Core Changes:
- Fix SearchView to use start_frame/end_frame directly (no time*fps conversion)
- Add hard_delete support to delete_trace API
- VideoPlayer: Main timeline + Mark system foundation
- Proxy: Add local routes for auth, media, identity-matches, cluster-results
- Add .gitignore to exclude build artifacts and dependencies
Design Documents:
- Multi-track Mark system design (.opencode/plans/)
- Video editing positioning standards research
Files Modified:
- src/views/SearchView.vue: Frame positioning, ensureMinDuration (240 frames)
- src/views/PeopleView.vue: batchDeleteGroups with hard_delete
- src/api/index.ts: delete_trace with hard_delete body
- src/components/VideoPlayer.vue: Timeline + Mark UI
- src-tauri/src/proxy.rs: New local routes
- AGENTS.md: Update documentation
- Core API: bind/unbind accept id (integer PK) when face_id is null
- Tauri proxy: stream video responses instead of buffering for seek bar
- VideoPlayer: remove muted attribute, unmute by default
- LibraryView: call invalidateFiles() before ensureFiles() on register/unregister
- PeopleView: close sort panel on click-outside, not just hamburger toggle
- bind_face: prefer face_id, fallback to id when face_id is null