// Data Pipelines & ETL — visual DAG designer, CDC, streaming, AI-assisted transforms.
const PIPELINES = [
{ id: "p1", name: "GeM Ingest → Warehouse", type: "Streaming ETL", status: "running", rows: "1.2M/hr", last: "live" },
{ id: "p2", name: "Vendor Master Sync", type: "CDC · Oracle", status: "running", rows: "48K/min", last: "live" },
{ id: "p3", name: "Daily Revenue Rollup", type: "Batch ELT", status: "success", rows: "38.4M", last: "5h ago" },
{ id: "p4", name: "IoT Sensor Aggregation", type: "Streaming · Kafka", status: "running", rows: "12.4K/s", last: "live" },
{ id: "p5", name: "Scheme DBT Reconcile", type: "Batch", status: "failed", rows: "—", last: "1h ago" },
{ id: "p6", name: "Legacy Oracle Migrate", type: "Batch · one-off", status: "paused", rows: "1.8M", last: "2d ago" },
];
const DAG_NODES = [
{ id: "n1", x: 16, y: 40, kind: "source", icon: "cloud", title: "GeM Portal API", sub: "REST · 1.2M/hr", active: true },
{ id: "n2", x: 16, y: 150, kind: "source", icon: "database", title: "Postgres CDC", sub: "logical repl.", active: true },
{ id: "n3", x: 16, y: 260, kind: "source", icon: "activity", title: "Kafka · orders", sub: "12.4K ev/s", active: true },
{ id: "n4", x: 220, y: 150, kind: "transform", icon: "filter", title: "Cleanse & Dedup", sub: "6 rules · 0.4% dropped", active: true },
{ id: "n5", x: 424, y: 96, kind: "ai", icon: "sparkles", title: "AI Join", sub: "vendor_id · 98% conf", active: true },
{ id: "n6", x: 424, y: 236, kind: "transform", icon: "map", title: "Enrich — Geo", sub: "state + district", active: true },
{ id: "n7", x: 628, y: 96, kind: "sink", icon: "layers", title: "gem_transactions", sub: "428.6M rows", active: true },
{ id: "n8", x: 628, y: 236, kind: "sink", icon: "database", title: "ClickHouse mart", sub: "12.4B rows", active: true },
];
const DAG_EDGES = [
["n1", "n4"], ["n2", "n4"], ["n3", "n4"], ["n4", "n5"], ["n5", "n7"], ["n5", "n6"], ["n6", "n8"],
];
function PipeNode({ n, selected, onClick }) {
const styles = {
source: { bg: "var(--panel-2)", bd: "var(--border-strong)", ic: "var(--ink-2)" },
transform: { bg: "var(--panel)", bd: "var(--primary)", ic: "var(--primary)" },
ai: { bg: "var(--primary-tint)", bd: "var(--primary)", ic: "var(--primary)" },
sink: { bg: "var(--accent-tint)", bd: "var(--accent-2)", ic: "var(--accent-2)" },
}[n.kind];
const w = 156, h = 52;
return (