// Spreadsheet function ModuleSheets() { const [tab, setTab] = React.useState('Home'); const [selected, setSelected] = React.useState({r: 3, c: 5}); const tabs = ['File', 'Home', 'Insert', 'Data', 'Formulas', 'Review', 'View', 'AI Assist']; const B = KS_DATA.budget; // 26 cols A-Z, 40 rows const cols = Array.from({length: 8}, (_, i) => String.fromCharCode(65 + i)); const rows = 24; // Data lookup const cellData = (r, c) => { if (r === 0) { const heads = ['Department / Programme', 'Allocated (₹ Cr)', 'Utilised (₹ Cr)', 'Remaining (₹ Cr)', '% Utilised', 'Trend', 'Status', 'AI Insight']; return { v: heads[c] || '', header: true }; } const row = B.rows[r - 1]; if (!row) return { v: '' }; if (c === 0) return { v: row[0], bold: true }; if (c === 1) return { v: row[1].toLocaleString('en-IN'), num: true }; if (c === 2) return { v: row[2].toLocaleString('en-IN'), num: true }; if (c === 3) return { v: row[3].toLocaleString('en-IN'), num: true }; if (c === 4) return { v: row[4].toFixed(1) + '%', num: true, heat: row[4] }; if (c === 5) return { v: null, spark: true, val: row[4] }; if (c === 6) return { v: row[4] > 70 ? 'On track' : row[4] > 55 ? 'Watch' : 'At risk', pill: row[4] > 70 ? 'ok' : row[4] > 55 ? 'warn' : 'err' }; if (c === 7) return { v: null, ai: true, i: r - 1 }; return { v: '' }; }; const aiInsight = (i) => ({ 0: 'Below 62% at mid-year — flag', 1: 'Steady, aligns with S-curve', 2: 'Cyber budget skewing to Q4', 3: 'R&D under-utilised, reallocate?', 4: 'On plan', 5: 'Ahead of curve', 6: 'Trending high, expect closeout', 7: 'Watch — SLA-linked spend', 8: 'Slow start, staffing gap', 9: 'Nominal', }[i] || ''); const selectedCell = cellData(selected.r, selected.c); const selectedAddr = cols[selected.c] + (selected.r + 1); return (
{/* Doc bar */}
S
FY 2026-27 Budget Estimates — Consolidated
MeitY / Finance · v22 · Approved by JS-Fin
{['SI','PR'].map((i, idx) => (
{i}
))}
{tabs.map(t => ( ))}
Inter
12
{/* Formula bar */}
{selectedAddr}
ƒx
{selected.c === 4 && selected.r > 0 ? '=ROUND(C' + (selected.r + 1) + '/B' + (selected.r + 1) + '*100, 1)' : selectedCell?.v || ''}
{/* Grid */}
))} {Array.from({length: rows}, (_, r) => ( {cols.map((_, c) => { const cd = cellData(r, c); const isSel = r === selected.r && c === selected.c; const bg = cd.header ? '#F5F7FA' : (cd.heat !== undefined ? ( cd.heat > 70 ? '#E7F3EC' : cd.heat > 55 ? '#FBF1E1' : cd.heat > 0 ? '#FBEAEA' : undefined ) : undefined); return ( ); })} ))}
{cols.map((c, ci) => ( {c}
{r + 1} setSelected({r, c})} style={{ border: isSel ? '2px solid var(--mod-sheets)' : '1px solid var(--ink-200)', padding: cd.spark ? 0 : '4px 8px', background: bg, fontWeight: cd.header ? 600 : (cd.bold ? 550 : 400), fontFamily: cd.num ? 'var(--f-mono)' : 'inherit', textAlign: cd.num ? 'right' : 'left', color: cd.header ? 'var(--ink-700)' : (cd.ai ? 'var(--mod-ai)' : 'var(--ink-800)'), fontSize: cd.header ? 11 : 12.5, textTransform: cd.header ? 'uppercase' : 'none', letterSpacing: cd.header ? '0.04em' : 'normal', cursor: 'cell', height: 26, verticalAlign: 'middle', }}> {cd.spark && cd.val !== undefined ? (
70 ? 'var(--ok)' : cd.val > 55 ? 'var(--warn)' : 'var(--err)', }}/>
) : cd.pill ? ( {cd.v} ) : cd.ai ? ( {IC.sparkles} {aiInsight(cd.i)} ) : cd.v}
{/* Sheet tabs */}
{['Consolidated', 'Digital India', 'Cyber Security', 'R&D', 'CSC', 'Pivot: Utilisation', 'Charts'].map((s, i) => ( ))}
Sum: 91,680 · Avg: 4,584.0 · Count: 20
); } window.ModuleSheets = ModuleSheets;