cc-dashboard/web/src/styles/globals.css
Vadym Samoilenko 732e692c8a fix: implement 5-phase contract fixes, devops page, AI summaries, expanded assistant
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>
2026-05-06 21:13:28 +01:00

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);
}
}