function BuilderScreen() {
const [selected, setSelected] = useState("kpi-1");
const widgets = [
{ kind: "KPI Tile", icon: "gauge" },
{ kind: "Line Chart", icon: "lineChart" },
{ kind: "Bar Chart", icon: "barChart" },
{ kind: "Pie / Donut", icon: "pie" },
{ kind: "Table", icon: "table" },
{ kind: "Pivot", icon: "layers" },
{ kind: "Map", icon: "map" },
{ kind: "Heatmap", icon: "activity" },
{ kind: "Gauge", icon: "gauge" },
{ kind: "Calendar", icon: "calendar" },
{ kind: "Image", icon: "image" },
{ kind: "Text / Markdown", icon: "text" },
];
return (
{/* Left palette */}
{widgets.map((w, i) => (
{w.kind}
))}
Data
{["gem_transactions", "state_revenue_daily", "vendor_master"].map(d => (
{d}
))}
{/* Canvas */}
GeM Quarterly Review
Draft
Saved 2 min ago
{/* Grid canvas */}
{/* Row 1: 4 KPIs */}
{KPIS.map((k, i) => (
setSelected(`kpi-${i}`)}
className="card"
style={{ gridColumn: 'span 3', position: 'relative', outline: selected === `kpi-${i}` ? '2px solid var(--primary)' : 'none', cursor: 'pointer' }}>
{k.label}
{k.value}{k.unit}
{fmtPct(k.delta)}
{selected === `kpi-${i}` &&
}
))}
{/* Row 2: 2 large */}
setSelected("chart-1")} style={{ gridColumn: 'span 8', outline: selected === "chart-1" ? '2px solid var(--primary)' : 'none', cursor: 'pointer', position: 'relative' }}>
Revenue Trend
{selected === "chart-1" &&
}
setSelected("chart-2")} style={{ gridColumn: 'span 4', outline: selected === "chart-2" ? '2px solid var(--primary)' : 'none', cursor: 'pointer', position: 'relative' }}>
Category Split
{selected === "chart-2" &&
}
{/* Drop zone */}
Drop a widget here — or ask AI to add one
{/* Right properties */}
Properties
{selected ? 'KPI Tile · GeM Procurement' : 'No widget selected'}
{selected && (
Show AI-generated caption
)}
);
}
function WidgetHandles() {
return <>
>;
}
function PropSection({ title, children }) {
return (
);
}
function PropField({ label, value }) {
return (
);
}
window.BuilderScreen = BuilderScreen;