// Whiteboard — infinite canvas w/ flowchart of an approval workflow function ModuleBoard() { const N = KS_DATA.whiteboard; const tints = { blue: { bg:'#EAF2FC', border:'#5A8CC7', text:'#0B4C8C' }, green: { bg:'#E4F3EB', border:'#3E8963', text:'#0F7A3E' }, amber: { bg:'#FBF1E1', border:'#C0862F', text:'#B45309' }, red: { bg:'#FBEAEA', border:'#B75252', text:'#B91C1C' }, yellow: { bg:'#FFF6C9', border:'#D9B84A', text:'#78591A' }, }; return (
B
Inter-Ministerial Approval Workflow
5 people editing · Infinite canvas · Auto-saved
{/* Live presence */}
{[{n:'S. Iyer', c:'#B45309'},{n:'P. Ramesh', c:'#0B4C8C'},{n:'K. Nair', c:'#0F7A3E'},{n:'R. Bhattacharya', c:'#6B4EA0'}].map((p,i)=>(
{p.n.split(' ').map(s=>s[0]).join('').slice(0,2)}
))}
{/* Tool rail (floating on canvas) */}
{[ {i: 'penTool', k:'draw', l:'Pen'}, {i: 'sticky', k:'sticky', l:'Sticky'}, {i: 'frame', k:'shape', l:'Shape'}, {i: 'link', k:'link', l:'Connector'}, {i: 'fileText', k:'text', l:'Text'}, {i: 'image', k:'image', l:'Image'}, {i: 'eraser', k:'erase', l:'Erase'}, ].map((t, i) => ( ))}
{/* Zoom controls */}
75%
{/* Legend */}
Legend
Process
Decision
Approval
Sticky note
{/* Canvas */}
{/* Title */}
Draft File Approval — Standard Flow
Under Secretary → Deputy Secretary → Secretary path · SLA-bound
{/* Connectors — draw arrows first so they sit behind nodes */} {[ [240,150, 300,150], [480,150, 540,140], [710,120, 780,90], // Approved -> Sign-off [710,160, 780,220], // Approved -> Return [960,90, 1020,90], [1200,90, 1260,90], [860,255, 400,180], // Return -> back to US review ].map(([x1,y1,x2,y2], i) => { const isCurve = i === 6; if (isCurve) { return ; } return ; })} {/* Approved label */} yes no {/* Nodes */} {N.map(n => { const t = tints[n.tint]; if (n.kind === 'decision') { return (
{n.label}
); } if (n.kind === 'sticky') { return (
{n.label}
); } return (
{n.label}
); })} {/* Live cursors */}
S. Iyer
R. Bhattacharya
); } window.ModuleBoard = ModuleBoard;