diff --git a/src/renderer/components/ai/AIChatPanel.tsx b/src/renderer/components/ai/AIChatPanel.tsx index 9957b2f..bd06807 100644 --- a/src/renderer/components/ai/AIChatPanel.tsx +++ b/src/renderer/components/ai/AIChatPanel.tsx @@ -121,7 +121,6 @@ export function AIChatPanel({ return () => observer.disconnect(); }, [isStreaming, streamingEl]); - // Auto-fire daily brief on home page useEffect(() => { if (!isHomePage || hasFiredBrief.current || hasTokenQuery.data !== true) return; @@ -168,7 +167,6 @@ export function AIChatPanel({ } }; - const hasMessages = messages.length > 0 || isStreaming; // Derived values for home page @@ -195,12 +193,14 @@ export function AIChatPanel({
{saved && ( - + Saved diff --git a/src/renderer/components/projects/ProjectDetail.tsx b/src/renderer/components/projects/ProjectDetail.tsx index f52a2cb..c8dfa8c 100644 --- a/src/renderer/components/projects/ProjectDetail.tsx +++ b/src/renderer/components/projects/ProjectDetail.tsx @@ -4,6 +4,7 @@ import { format } from 'date-fns'; import { useNavigate } from '@tanstack/react-router'; import { trpc } from '@/lib/trpc'; import { Button } from '@/components/ui/button'; +import { Skeleton } from '@/components/ui/skeleton'; import { Item, ItemMedia, ItemContent, ItemTitle, ItemDescription } from '@/components/ui/item'; import { Breadcrumb, @@ -167,8 +168,17 @@ export function ProjectDetail({ projectId }: ProjectDetailProps) { if (isLoading) { return ( -
- Loading project... +
+
+ + +
+
+ + + +
+
); } diff --git a/src/renderer/components/projects/ProjectSidebar.tsx b/src/renderer/components/projects/ProjectSidebar.tsx index 714c54b..0e4a606 100644 --- a/src/renderer/components/projects/ProjectSidebar.tsx +++ b/src/renderer/components/projects/ProjectSidebar.tsx @@ -322,7 +322,7 @@ export function ProjectSidebar({ selectedProjectId, onSelectProject }: ProjectSi if (editCreatingClient && editNewClientName.trim()) { // Create a new client const result = await createClientMutation.mutateAsync({ name: editNewClientName.trim() }); - let parentId = result.id; + const parentId = result.id; if (editCreatingSubClient && editNewSubClientName.trim()) { // Also create a sub-client under the new client diff --git a/src/renderer/components/tasks/PriorityBadge.tsx b/src/renderer/components/tasks/PriorityBadge.tsx index 7ccde2a..c407319 100644 --- a/src/renderer/components/tasks/PriorityBadge.tsx +++ b/src/renderer/components/tasks/PriorityBadge.tsx @@ -4,21 +4,21 @@ export function PriorityBadge({ priority }: { priority: string | null }) { switch (priority) { case 'high': return ( - + High ); case 'medium': return ( - + Medium ); case 'low': return ( - + Low diff --git a/src/renderer/components/tasks/TaskRow.tsx b/src/renderer/components/tasks/TaskRow.tsx index f852c61..33ad4b7 100644 --- a/src/renderer/components/tasks/TaskRow.tsx +++ b/src/renderer/components/tasks/TaskRow.tsx @@ -1,5 +1,7 @@ +import { Fragment } from 'react'; import { motion } from 'framer-motion'; import { Calendar, User, Pencil, Trash2 } from 'lucide-react'; +import { cn } from '@/lib/utils'; import { Checkbox } from '@/components/ui/checkbox'; import { Badge } from '@/components/ui/badge'; import { @@ -95,9 +97,13 @@ export function TaskRow({ onClick?.(task)} > {/* Row 1: checkbox + title + description */} @@ -109,7 +115,7 @@ export function TaskRow({ className="mt-0.5 shrink-0" />
-
+
{task.title}
{task.description && ( @@ -136,10 +142,12 @@ export function TaskRow({ {breadcrumb.map((part, i) => ( - + {i > 0 && } - {part} - + + {part} + + ))} diff --git a/src/renderer/routes/tasks.tsx b/src/renderer/routes/tasks.tsx index 9fdb87c..afdd363 100644 --- a/src/renderer/routes/tasks.tsx +++ b/src/renderer/routes/tasks.tsx @@ -4,7 +4,7 @@ import { useFloatingChat } from '@/context/FloatingChatContext'; import { ClipboardCheck, ListTodo, - Loader2, + Clock, CheckCircle2, Plus, Search, @@ -147,7 +147,7 @@ function TasksPage() { - + {stats.inProgress} diff --git a/src/renderer/routes/timeline.tsx b/src/renderer/routes/timeline.tsx index d7e4ac1..cf80bfc 100644 --- a/src/renderer/routes/timeline.tsx +++ b/src/renderer/routes/timeline.tsx @@ -1,12 +1,13 @@ import { createFileRoute } from '@tanstack/react-router'; import { useEffect, useRef, useState, useMemo } from 'react'; -import { Plus } from 'lucide-react'; +import { Plus, ChartGantt } from 'lucide-react'; import { useFloatingChat } from '@/context/FloatingChatContext'; import { trpc } from '@/lib/trpc'; import { Button } from '@/components/ui/button'; import { GanttChart, type GanttCheckpoint } from '@/components/timeline/GanttChart'; import { AddCheckpointDialog } from '@/components/timeline/AddCheckpointDialog'; import { EditCheckpointDialog } from '@/components/timeline/EditCheckpointDialog'; +import { Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription } from '@/components/ui/empty'; export const Route = createFileRoute('/timeline')({ component: TimelinePage, @@ -107,9 +108,17 @@ function TimelinePage() { {/* Gantt Chart */} {ganttCheckpoints.length === 0 ? ( -
- No checkpoints yet. Click "+ Add" to create your first milestone. -
+ + + + + + No milestones yet + + Click "+ Add" to create your first project checkpoint. + + + ) : (