import React from 'react'; import { motion } from 'framer-motion'; import { TrendingUp, TrendingDown, Layout, ChevronRight, ChevronLeft, Info } from 'lucide-react'; import { ResponsiveContainer, AreaChart, Area, PieChart, Pie, Cell, Tooltip, Treemap, BarChart, Bar } from 'recharts'; // ============================================================================ // UTILS & SHARED // ============================================================================ const formatValue = (v: number) => { if (v >= 1000000) return `$${(v / 1000000).toFixed(1)}M`; if (v >= 1000) return `$${(v / 1000).toFixed(1)}K`; return v.toLocaleString(undefined, { maximumFractionDigits: 0 }); }; const formatPercent = (v: number) => `${v > 0 ? '+' : ''}${v.toFixed(1)}%`; const CHART_COLORS = ['#3B82F6', '#10B981', '#F59E0B', '#8B5CF6', '#EF4444', '#06B6D4']; interface WidgetProps { data: any; theme?: any; config?: any; } // ============================================================================ // EXECUTIVE KPI CARD (Image 2 style) // ============================================================================ export const ExecutiveKPICard: React.FC = ({ data }) => { const comp = data.comparison || { change_pct: 0, prev_value: 0, is_positive: true }; return (
{data.title}

{formatValue(data.value)}

{comp.is_positive ? : } {formatPercent(comp.change_pct)}
PY: {formatValue(comp.prev_value)}
{data.sparkline && ( )}
); }; // ============================================================================ // REGIONAL MATRIX (Image 2 style) // ============================================================================ export const RegionalMatrix: React.FC = ({ data }) => { return (

{data.title}

{data.columns?.map((col: string) => ( ))} {data.data.map((row: any, i: number) => ( {data.columns?.map((col: string) => ( ))} ))}
Region{col}
{row.dimension}{formatValue(row[col])}
); }; // ============================================================================ // RANKING OVERVIEW PRO (Image 2 style) // ============================================================================ export const RankingOverviewPro: React.FC = ({ data }) => { const [mode, setMode] = React.useState<'top' | 'bottom'>('top'); const items = mode === 'top' ? data.top : data.bottom; return (

{data.title}

{items?.map((item: any, i: number) => (
{mode === 'top' ? `#${i + 1}` : `-${i + 1}`}
{item.name} {formatValue(item.value)}
))}
); }; // ============================================================================ // MASTER PORTFOLIO TABLE (Image 1 style) // ============================================================================ export const MasterPortfolioTable: React.FC = ({ data }) => { const rows = Array.isArray(data) ? data : (data?.data || []); return (
{rows.map((row: any, i: number) => { const health = row.Health || (i % 3 === 0 ? 100 : (i % 2 === 0 ? 60 : 30)); const healthColor = health > 70 ? 'bg-emerald-500' : health > 40 ? 'bg-amber-500' : 'bg-rose-500'; const status = row.Status || (health > 70 ? 'Ready' : 'In Progress'); return ( ); })}
Project Name Status Progress
{row.Project || row.dimension || 'Untitled'} {status}
{health}%
Page 1 of 4
); }; // ============================================================================ // DONUT WIDGET (Image $ style - Light) // ============================================================================ export const DonutWidget: React.FC = ({ data }) => { return (

{data.title}

{data.data.map((_: any, index: number) => ( ))}
); }; // ============================================================================ // TREEMAP // ============================================================================ export const TreemapWidget: React.FC = ({ data }) => { return (

{data.title}

); }; // ============================================================================ // PERFORMER SNAPSHOT // ============================================================================ export const PerformerWidget: React.FC = ({ data }) => { if (!data.performance_snapshot || data.performance_snapshot.length === 0) return null; const snapshot = data.performance_snapshot[0]; const { top, bottom, dimension, metric } = snapshot; return (

Performance Summary: {dimension}

🏆 Top
{top.name} {formatValue(top.value)}
⚠️ Risk
{bottom.name} {formatValue(bottom.value)}
Analytics powered by AI
); };