feat: frame-based positioning and mark system foundation

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
This commit is contained in:
2026-07-24 20:19:47 +08:00
parent 299f58e883
commit 5951aca086
38 changed files with 12107 additions and 1666 deletions

View File

@@ -1,15 +1,62 @@
html, body {
background-color: var(--background-color) !important;
color: var(--text-primary);
font-family: 'DM Sans', 'Noto Sans TC', -apple-system, BlinkMacSystemFont, sans-serif;
margin: 0;
}
:root {
--primary-color: #2563eb;
--primary-color-rgb: 37, 99, 235;
--secondary-color: #64748b;
--success-color: #22c55e;
--warning-color: #f59e0b;
--error-color: #ef4444;
--background-color: #f8fafc;
--card-background: #ffffff;
--card-background: rgba(255, 255, 255, 0.88);
--text-primary: #1e293b;
--text-secondary: #64748b;
--border-color: rgba(0, 0, 0, 0.08);
--border-light: rgba(0, 0, 0, 0.05);
--border-dark: rgba(0, 0, 0, 0.12);
--hover-background: rgba(0, 0, 0, 0.04);
--input-background: rgba(255, 255, 255, 0.95);
--input-border: rgba(0, 0, 0, 0.1);
--danger-color: #d93025;
--danger-hover: #c5221f;
--danger-background: rgba(217, 48, 37, 0.08);
--success-text: #1e8e3e;
--warning-text: #e37400;
--muted-text: #9aa0a6;
--border-radius: 8px;
--shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
--shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
[data-theme="dark"] {
--primary-color: #3b82f6;
--primary-color-rgb: 59, 130, 246;
--secondary-color: #94a3b8;
--success-color: #22c55e;
--warning-color: #f59e0b;
--error-color: #ef4444;
--background-color: #0f172a;
--card-background: rgba(30, 41, 59, 0.92);
--text-primary: #e2e8f0;
--text-secondary: #94a3b8;
--border-color: rgba(51, 65, 85, 0.5);
--border-light: rgba(51, 65, 85, 0.3);
--border-dark: #475569;
--hover-background: rgba(51, 65, 85, 0.4);
--input-background: rgba(30, 41, 59, 0.95);
--input-border: rgba(71, 85, 105, 0.5);
--danger-color: #ef4444;
--danger-hover: #dc2626;
--danger-background: rgba(69, 10, 10, 0.4);
--success-text: #22c55e;
--warning-text: #f59e0b;
--muted-text: #64748b;
--border-radius: 8px;
--shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
}
body {