From 5cc38b3aae31c12783a64a292fd98bfe0d829297 Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Wed, 13 May 2026 11:16:15 +0100 Subject: [PATCH] refactor(project-detail): EmptyState, Skeleton loading, spacing - Replace "No data" / "No sessions" / "No tools" terse text with EmptyState components (FileText, Wrench, CalendarDays icons) - Add Skeleton placeholders for header, chart, and grid during loading - Replace raw elements in edit mode with shared Input component - Replace raw save/cancel buttons in edit mode with Button component - Upgrade summarize button touch target from h-6/w-6 to h-8/w-8 - Add focus-visible rings on interactive buttons and links - Use space-y-8 between top-level sections, space-y-2 for label+input pairs Co-Authored-By: Claude Sonnet 4.6 --- web/src/views/ProjectDetailView.vue | 102 ++++++++++++++++------------ 1 file changed, 57 insertions(+), 45 deletions(-) diff --git a/web/src/views/ProjectDetailView.vue b/web/src/views/ProjectDetailView.vue index a1b9e26..ab3cfd5 100644 --- a/web/src/views/ProjectDetailView.vue +++ b/web/src/views/ProjectDetailView.vue @@ -7,9 +7,14 @@ import CardHeader from '@/components/ui/CardHeader.vue' import CardTitle from '@/components/ui/CardTitle.vue' import CardContent from '@/components/ui/CardContent.vue' import Spinner from '@/components/ui/Spinner.vue' +import Skeleton from '@/components/ui/Skeleton.vue' +import Input from '@/components/ui/Input.vue' +import Button from '@/components/ui/Button.vue' +import EmptyState from '@/components/ui/EmptyState.vue' import { formatDuration, formatDateTime } from '@/lib/utils' import { useAuthStore } from '@/stores/auth' import { toast } from 'vue-sonner' +import { FileText, Wrench, CalendarDays } from 'lucide-vue-next' import type { ProjectDetail } from '@/types' const route = useRoute() @@ -110,13 +115,19 @@ async function summarizeSession(sessionId: string) {