Phase 1 — Contract bugs:
- Add progress_pct/budget_hours to ProjectHours schema and compute from ProjectBudget
- Add hours/pct to ToolUsage schema, compute in project_detail endpoint
- Fix ProjectDetailView to use correct nested data shape (data.project.*, data.sessions, etc.)
- Fix GenerateReportIn: rename field date → period_date; update reports router
- Fix tasks list date filter: use Query(alias='date') instead of positional arg
- Fix AzureIntegration/AzureWorkItem types: org→organization, id type, ado_id, sync_enabled
- Fix devops API payload and SettingsView to use organization field
- Fix TaskForm ADO work item selector to use wi.ado_id for display, wi.id for value
- Add light theme CSS variables in :root, keep dark in .dark class
- Remove hardcoded class='dark' from HTML, add theme persistence script
- TopBar: persist dark/light to localStorage on toggle
- DashboardView: switch monthly() → timeline() endpoint for charts
- DOW endpoint: add from/to date range filtering
Phase 2 — Planner:
- Add projects API endpoint and Pinia store
- Add project picker to TaskForm
- Fix ADO work item display (#ado_id not #id)
Phase 3 — Calendar:
- getWeekDays() accepts weekLength 5|7 parameter
- Calendar store: add weekLength ref, setWeekLength(), update fetchCurrentView range
- CalendarToolbar: add 5d/7d toggle buttons; fix dateLabel to use days[days.length-1]
- CalendarView: clicking session block navigates to project-detail/:id/:date
- project-detail route: add optional :date? param; ProjectDetailView filters by date
- DnD resize: send start_at alongside end_at (PlannedBlockIn requires both fields)
Phase 4 — AI session summaries:
- Add ai_title/ai_result columns to Session model
- Alembic migration 0006 for new columns
- New ai_session_summary service using Claude Haiku
- Session summarize endpoint: POST /api/dashboard/sessions/{id}/summarize
- Scheduler job: summarize sessions without ai_title every 10 minutes
- SessionOut schema: add ai_title/ai_result fields
- ProjectDetailView: show ai_title as primary, ai_result as subtitle; sparkle button to generate
Phase 5 — Expanded AI assistant:
- Add 14 new tools: list/create/update/delete/complete tasks, prioritize_day,
schedule_task, auto_schedule_day, list_projects, list/delete manual entries,
generate_report, search_sessions, list_work_items
- Import PlannedBlock and AzureWorkItem in assistant service
- Update SYSTEM_PROMPT to describe full agent capabilities
- Agentic loop: 5 → 10 rounds max
- AssistantWidget: add tool labels for all new tools, update quick hints
New files: DevopsView.vue, projects store/API, ai_session_summary.py, migration 0006
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
136 lines
3.7 KiB
CSS
136 lines
3.7 KiB
CSS
@import url('https://api.fontshare.com/v2/css?f[]=satoshi@700,500,400&display=swap');
|
|
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap');
|
|
|
|
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
@layer base {
|
|
:root {
|
|
/* ── Light theme ─────────────────────────────────────────────── */
|
|
--background: 0 0% 98%;
|
|
--foreground: 222 47% 11%;
|
|
|
|
--card: 0 0% 100%;
|
|
--card-foreground: 222 47% 11%;
|
|
|
|
--popover: 0 0% 100%;
|
|
--popover-foreground: 222 47% 11%;
|
|
|
|
/* Brand cyan */
|
|
--primary: 191 91% 37%;
|
|
--primary-foreground: 0 0% 100%;
|
|
|
|
--secondary: 210 40% 94%;
|
|
--secondary-foreground: 222 47% 11%;
|
|
|
|
--muted: 210 40% 94%;
|
|
--muted-foreground: 215 16% 47%;
|
|
|
|
--accent: 191 91% 92%;
|
|
--accent-foreground: 191 91% 25%;
|
|
|
|
--destructive: 0 84% 60%;
|
|
--destructive-foreground: 0 0% 100%;
|
|
|
|
--border: 214 32% 88%;
|
|
--input: 214 32% 88%;
|
|
--ring: 191 91% 37%;
|
|
|
|
--radius: 0.5rem;
|
|
|
|
--sidebar-background: 210 40% 96%;
|
|
--sidebar-foreground: 222 47% 11%;
|
|
--sidebar-primary: 191 91% 37%;
|
|
--sidebar-primary-foreground: 0 0% 100%;
|
|
--sidebar-accent: 191 91% 92%;
|
|
--sidebar-accent-foreground: 191 91% 25%;
|
|
--sidebar-border: 214 32% 88%;
|
|
--sidebar-ring: 191 91% 37%;
|
|
|
|
/* Success / Warning */
|
|
--success: 158 64% 40%;
|
|
--warning: 38 92% 50%;
|
|
}
|
|
|
|
/* Dark theme — operational dashboard dark navy / cyan */
|
|
.dark {
|
|
--background: 226 49% 8%; /* #0b1020 */
|
|
--foreground: 220 40% 92%; /* #dce4f4 */
|
|
|
|
--card: 220 44% 10%; /* #0f1629 panel L1 */
|
|
--card-foreground: 220 40% 92%;
|
|
|
|
--popover: 220 44% 12%; /* #111c34 panel L2 */
|
|
--popover-foreground: 220 40% 92%;
|
|
|
|
/* Cyan accent #57c7ff */
|
|
--primary: 200 100% 67%;
|
|
--primary-foreground: 226 49% 8%;
|
|
|
|
--secondary: 220 30% 14%;
|
|
--secondary-foreground: 220 20% 75%;
|
|
|
|
--muted: 220 30% 12%;
|
|
--muted-foreground: 220 12% 52%;
|
|
|
|
--accent: 220 30% 14%;
|
|
--accent-foreground: 220 40% 92%;
|
|
|
|
--destructive: 0 72% 51%;
|
|
--destructive-foreground: 220 40% 98%;
|
|
|
|
--border: 220 28% 17%;
|
|
--input: 220 28% 17%;
|
|
--ring: 200 100% 67%;
|
|
|
|
/* Success / Warning */
|
|
--success: 158 64% 52%;
|
|
--warning: 38 92% 60%;
|
|
}
|
|
}
|
|
|
|
@layer base {
|
|
* {
|
|
@apply border-border;
|
|
}
|
|
|
|
body {
|
|
@apply bg-background text-foreground;
|
|
font-family: 'Satoshi', 'Inter', system-ui, -apple-system, sans-serif;
|
|
font-feature-settings: "rlig" 1, "calt" 1;
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
/* Monospace for numeric values */
|
|
.tabular-nums,
|
|
[data-value],
|
|
.kpi-value {
|
|
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
/* Thin scrollbar */
|
|
::-webkit-scrollbar { width: 4px; height: 4px; }
|
|
::-webkit-scrollbar-track { background: transparent; }
|
|
::-webkit-scrollbar-thumb {
|
|
background: hsl(220 28% 20%);
|
|
border-radius: 9999px;
|
|
}
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: hsl(220 28% 30%);
|
|
}
|
|
}
|
|
|
|
/* ── Utility: panel glow on hover ─────────────────────────────────── */
|
|
@layer utilities {
|
|
.panel-glow {
|
|
box-shadow: 0 0 0 1px hsl(var(--border)), 0 4px 24px -4px hsl(226 49% 4% / 0.6);
|
|
}
|
|
.panel-glow-hover:hover {
|
|
box-shadow: 0 0 0 1px hsl(200 100% 67% / 0.18), 0 8px 32px -4px hsl(200 100% 67% / 0.08);
|
|
}
|
|
.accent-glow {
|
|
box-shadow: 0 0 16px -2px hsl(200 100% 67% / 0.35);
|
|
}
|
|
}
|