function CatalogScreen() { const [selected, setSelected] = useState("gem_transactions"); const item = CATALOG.find(c => c.name === selected) || CATALOG[0]; return (
Data Catalog & Governance
{CATALOG.length} certified datasets · Avg data quality 94.2% · Lineage tracked across 12 sources
{/* Stats */}
Total datasets
142
68 Gold · 42 Silver · 32 Bronze
Data quality score
94.2%
+1.4% vs last month
PII datasets
28
All encrypted at rest · DPDP compliant
Open quality issues
12
3 critical · 9 warnings
{/* Dataset list */}

All Datasets

{CATALOG.map(c => ( setSelected(c.name)} style={{ background: selected === c.name ? 'var(--panel-2)' : 'transparent', cursor: 'pointer' }}> ))}
Dataset Owner Rows Quality Cert
{c.name}
{c.desc}
{c.pii && PII}
{c.owner} {c.rows}
= 95 ? 'var(--ok)' : c.quality >= 85 ? 'var(--accent)' : 'var(--danger)' }}/>
{c.quality}%
{c.cert}
{/* Detail panel */}

{item.name}

{item.desc}
{item.tags.map(t => #{t})}
Owner
{item.owner}
Rows
{item.rows}
Certification
{item.cert}
Quality
= 95 ? 'var(--ok)' : item.quality >= 85 ? 'var(--accent-2)' : 'var(--danger)' }}>{item.quality}%
{/* Lineage */}

Data Lineage

Live
{/* Sources */} {/* ETL */} {/* Dataset */} {/* Consumers */}
3 upstream sources · 2 downstream consumers
{/* Quality rules */}

Data Quality Rules

{[ { name: "vendor_id NOT NULL", pass: true, checks: "428.6M / 428.6M" }, { name: "order_value > 0", pass: true, checks: "428.5M / 428.6M" }, { name: "state_code IN geo_ref", pass: true, checks: "428.6M / 428.6M" }, { name: "gst_number matches regex", pass: false, checks: "428.4M / 428.6M · 218K failed" }, ].map((r, i) => (
0 ? '1px solid var(--border)' : 0, display: 'flex', alignItems: 'center', gap: 10 }}> {r.name} {r.checks}
))}
); } function Node({ x, y, label, type, small, highlighted, pos = "top" }) { const w = small ? 60 : 60; const h = 20; const colors = { source: { bg: "var(--panel-2)", border: "var(--border-strong)", ic: "database" }, etl: { bg: "var(--primary-tint)", border: "var(--primary)", ic: "branch" }, dataset: { bg: "var(--accent-tint)", border: "var(--accent-2)", ic: "layers" }, dash: { bg: "var(--panel-2)", border: "var(--border-strong)", ic: "dashboard" }, }; const c = colors[type]; return {label.length > 10 ? label.slice(0, 9) + '…' : label} ; } function Edge({ x1, y1, x2, y2 }) { const mx = (x1 + x2) / 2; return ; } window.CatalogScreen = CatalogScreen;