Files
fusion/packages/dashboard/app/components/ProjectGridSkeleton.tsx
gsxdsm c6be1323d1 feat(FN-674): implement multi-project dashboard UX
- Add Project Overview page with responsive grid and health status cards
- Add Project Selector dropdown in header for quick project switching
- Add Setup Wizard for registering new projects with auto-detection
- Implement project drill-down: click project to view its tasks
- Add global activity feed with cross-project activity log
- Add project health monitoring with real-time status polling
- Add deep linking support for tasks via ?task= URL parameter
- Add useTasks hook with project context filtering
- Add ntfy notification deep link to open tasks in dashboard
- Fix terminal error message formatting for agent failures
- Unify comment style across codebase (// instead of /** */)
- Add comprehensive tests for multi-project components
2026-04-01 01:36:24 -07:00

81 lines
3.7 KiB
TypeScript

import { Folder, Activity, CheckCircle, AlertCircle } from "lucide-react";
/**
* ProjectGridSkeleton - Loading skeleton for project grid
*
* Shows 6 skeleton cards in a responsive grid layout with pulse animation.
* Uses CSS variables for theming compatibility.
*/
export function ProjectGridSkeleton() {
return (
<div className="project-overview project-overview--loading">
{/* Header stats skeleton */}
<div className="project-overview__header-skeleton">
<div className="project-overview__stats-row">
<div className="project-overview__stat-skeleton">
<div className="project-skeleton project-skeleton--icon">
<Folder size={20} className="project-skeleton-icon" />
</div>
<div className="project-skeleton project-skeleton--value" />
<div className="project-skeleton project-skeleton--label" />
</div>
<div className="project-overview__stat-skeleton">
<div className="project-skeleton project-skeleton--icon">
<Activity size={20} className="project-skeleton-icon" />
</div>
<div className="project-skeleton project-skeleton--value" />
<div className="project-skeleton project-skeleton--label" />
</div>
<div className="project-overview__stat-skeleton">
<div className="project-skeleton project-skeleton--icon">
<CheckCircle size={20} className="project-skeleton-icon" />
</div>
<div className="project-skeleton project-skeleton--value" />
<div className="project-skeleton project-skeleton--label" />
</div>
<div className="project-overview__stat-skeleton">
<div className="project-skeleton project-skeleton--icon">
<AlertCircle size={20} className="project-skeleton-icon" />
</div>
<div className="project-skeleton project-skeleton--value" />
<div className="project-skeleton project-skeleton--label" />
</div>
</div>
</div>
{/* Filter tabs skeleton */}
<div className="project-overview__filters-skeleton">
<div className="project-skeleton project-skeleton--tab" />
<div className="project-skeleton project-skeleton--tab" />
<div className="project-skeleton project-skeleton--tab" />
<div className="project-skeleton project-skeleton--tab" />
</div>
{/* Grid skeleton - 6 cards */}
<div className="project-grid project-grid--skeleton">
{Array.from({ length: 6 }).map((_, index) => (
<div key={index} className="project-card project-card--skeleton">
<div className="project-card-skeleton__header">
<div className="project-skeleton project-skeleton--icon-circle" />
<div className="project-skeleton__text-group">
<div className="project-skeleton project-skeleton--title" />
<div className="project-skeleton project-skeleton--path" />
</div>
<div className="project-skeleton project-skeleton--badge" />
</div>
<div className="project-card-skeleton__health">
<div className="project-skeleton project-skeleton--metric" />
<div className="project-skeleton project-skeleton--metric" />
<div className="project-skeleton project-skeleton--metric" />
</div>
<div className="project-card-skeleton__footer">
<div className="project-skeleton project-skeleton--activity" />
<div className="project-skeleton project-skeleton--actions" />
</div>
</div>
))}
</div>
</div>
);
}