addedvariance , health legends
This commit is contained in:
@@ -47,6 +47,32 @@ function getPipelineHealth(lead) {
|
|||||||
return 32;
|
return 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------- Metric legend ----------
|
||||||
|
// Explains the Variance color convention (under vs over budget) and the Health
|
||||||
|
// score thresholds so an owner can read both columns at a glance.
|
||||||
|
const LegendDot = ({ className }) => (
|
||||||
|
<span className={`inline-block w-2 h-2 rounded-full ${className}`} />
|
||||||
|
);
|
||||||
|
|
||||||
|
const MetricLegend = ({ showVariance = true }) => (
|
||||||
|
<div className="flex flex-wrap items-center gap-x-6 gap-y-2 px-5 py-3 border-b border-zinc-200 dark:border-white/10 bg-zinc-50/60 dark:bg-white/[0.02] text-[11px] text-zinc-600 dark:text-zinc-400">
|
||||||
|
{showVariance && (
|
||||||
|
<div className="flex flex-wrap items-center gap-x-3 gap-y-1">
|
||||||
|
<span className="font-bold uppercase tracking-wider text-zinc-400 dark:text-zinc-500">Variance</span>
|
||||||
|
<span className="flex items-center gap-1.5"><LegendDot className="bg-emerald-500" /> Under budget (−)</span>
|
||||||
|
<span className="flex items-center gap-1.5"><LegendDot className="bg-red-500" /> Over budget (+)</span>
|
||||||
|
<span className="flex items-center gap-1.5"><LegendDot className="bg-zinc-400" /> On budget (0%)</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="flex flex-wrap items-center gap-x-3 gap-y-1">
|
||||||
|
<span className="font-bold uppercase tracking-wider text-zinc-400 dark:text-zinc-500">Health</span>
|
||||||
|
<span className="flex items-center gap-1.5"><LegendDot className="bg-emerald-500" /> Good 70–100</span>
|
||||||
|
<span className="flex items-center gap-1.5"><LegendDot className="bg-amber-500" /> At Risk 40–69</span>
|
||||||
|
<span className="flex items-center gap-1.5"><LegendDot className="bg-red-500" /> Critical 0–39</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
const OwnerProjectList = () => {
|
const OwnerProjectList = () => {
|
||||||
const { user } = useAuth();
|
const { user } = useAuth();
|
||||||
const { projects, vendors, kanbanLeads, kanbanColumns } = useMockStore();
|
const { projects, vendors, kanbanLeads, kanbanColumns } = useMockStore();
|
||||||
@@ -269,6 +295,9 @@ const OwnerProjectList = () => {
|
|||||||
|
|
||||||
{/* Project Table (Desktop) / Cards (Mobile) */}
|
{/* Project Table (Desktop) / Cards (Mobile) */}
|
||||||
<SpotlightCard className="overflow-hidden">
|
<SpotlightCard className="overflow-hidden">
|
||||||
|
{/* Legend — explains Variance colors & Health thresholds */}
|
||||||
|
<MetricLegend showVariance />
|
||||||
|
|
||||||
{/* Mobile Card View */}
|
{/* Mobile Card View */}
|
||||||
<div className="md:hidden divide-y divide-zinc-100 dark:divide-white/5">
|
<div className="md:hidden divide-y divide-zinc-100 dark:divide-white/5">
|
||||||
{sortedProjects.length > 0 ? sortedProjects.map(project => {
|
{sortedProjects.length > 0 ? sortedProjects.map(project => {
|
||||||
@@ -484,6 +513,9 @@ const OwnerProjectList = () => {
|
|||||||
|
|
||||||
{/* Pipeline table */}
|
{/* Pipeline table */}
|
||||||
<SpotlightCard className="overflow-hidden">
|
<SpotlightCard className="overflow-hidden">
|
||||||
|
{/* Legend — Health thresholds (no Variance column in pipeline) */}
|
||||||
|
<MetricLegend showVariance={false} />
|
||||||
|
|
||||||
{/* Mobile card view */}
|
{/* Mobile card view */}
|
||||||
<div className="md:hidden divide-y divide-zinc-100 dark:divide-white/5">
|
<div className="md:hidden divide-y divide-zinc-100 dark:divide-white/5">
|
||||||
{filteredPipelineLeads.length > 0 ? filteredPipelineLeads.map(lead => {
|
{filteredPipelineLeads.length > 0 ? filteredPipelineLeads.map(lead => {
|
||||||
|
|||||||
Reference in New Issue
Block a user