|
| 1 | +export const metadata = { title: 'AI Risk Navigator' }; |
| 2 | +export default function RiskPage() { |
| 3 | + return ( |
| 4 | + <main className="space-y-4"> |
| 5 | + <h1 className="text-2xl font-semibold">Interactive 10-Stage AI Risk Matrix</h1> |
| 6 | + <p className="text-sm text-slate-600">Filterable matrix and governance dashboard demos.</p> |
| 7 | + <iframe srcDoc={RISK_HTML} className="h-[80vh] w-full rounded border" /> |
| 8 | + </main> |
| 9 | + ); |
| 10 | +} |
| 11 | + |
| 12 | +const RISK_HTML = `<!DOCTYPE html> |
| 13 | +<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 14 | +<style>html,body{margin:0;padding:0}</style> |
| 15 | +</head><body> |
| 16 | +${MATRIX_SECTION} |
| 17 | +${GOV_DASHBOARD} |
| 18 | +</body></html>`; |
| 19 | + |
| 20 | +const MATRIX_SECTION = ` |
| 21 | +<div style="padding:16px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);"> |
| 22 | + <div style="background:rgba(255,255,255,0.95);backdrop-filter:blur(10px);border-radius:16px;padding:16px;max-width:1400px;margin:0 auto;"> |
| 23 | + <h2 style="margin:0 0 8px 0;color:#2c3e50;font-size:20px;font-weight:600;text-align:center">Interactive Cross-Stage AI Risk Matrix</h2> |
| 24 | + <div style="text-align:center;margin-bottom:8px"> |
| 25 | + <button onclick="toggleColumn('persistent')" style="margin:0 4px;padding:6px 10px;border:none;border-radius:6px;background:#4a5568;color:#fff;cursor:pointer;font-size:12px">Toggle Persistent</button> |
| 26 | + <button onclick="toggleColumn('evolving')" style="margin:0 4px;padding:6px 10px;border:none;border-radius:6px;background:#4a5568;color:#fff;cursor:pointer;font-size:12px">Toggle Evolving</button> |
| 27 | + <button onclick="toggleColumn('emergent')" style="margin:0 4px;padding:6px 10px;border:none;border-radius:6px;background:#4a5568;color:#fff;cursor:pointer;font-size:12px">Toggle Emergent</button> |
| 28 | + </div> |
| 29 | + <table id="matrix" style="width:100%;border-collapse:collapse;background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,.1)"> |
| 30 | + <thead> |
| 31 | + <tr> |
| 32 | + <th style="background:#1a202c;color:#fff;padding:10px;font-size:13px;border:1px solid #4a5568">Development Stage</th> |
| 33 | + <th class="persistent" style="background:#1a202c;color:#fff;padding:10px;font-size:13px;border:1px solid #4a5568">Persistent Risks</th> |
| 34 | + <th class="evolving" style="background:#1a202c;color:#fff;padding:10px;font-size:13px;border:1px solid #4a5568">Evolving Risks</th> |
| 35 | + <th class="emergent" style="background:#1a202c;color:#fff;padding:10px;font-size:13px;border:1px solid #4a5568">Emergent Risks</th> |
| 36 | + </tr> |
| 37 | + </thead> |
| 38 | + <tbody> |
| 39 | + ${[1,2,3,4,5,6,7,8,9,10].map(n=>`<tr> |
| 40 | + <td style="padding:10px;border:1px solid #e2e8f0;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;font-weight:600">Stage ${n}</td> |
| 41 | + <td class="persistent" style="padding:10px;border:1px solid #e2e8f0">Persistent risk ${n}</td> |
| 42 | + <td class="evolving" style="padding:10px;border:1px solid #e2e8f0">Evolving risk ${n}</td> |
| 43 | + <td class="emergent" style="padding:10px;border:1px solid #e2e8f0">Emergent risk ${n}</td> |
| 44 | + </tr>`).join('')} |
| 45 | + </tbody> |
| 46 | + </table> |
| 47 | + <div style="display:flex;gap:12px;justify-content:center;margin-top:8px;flex-wrap:wrap"> |
| 48 | + <span style="display:flex;align-items:center;gap:6px;background:rgba(255,255,255,.8);padding:6px 10px;border-radius:16px"><span style="width:14px;height:14px;background:#38b2ac;border-radius:3px"></span>Persistent</span> |
| 49 | + <span style="display:flex;align-items:center;gap:6px;background:rgba(255,255,255,.8);padding:6px 10px;border-radius:16px"><span style="width:14px;height:14px;background:#ed8936;border-radius:3px"></span>Evolving</span> |
| 50 | + <span style="display:flex;align-items:center;gap:6px;background:rgba(255,255,255,.8);padding:6px 10px;border-radius:16px"><span style="width:14px;height:14px;background:#d53f8c;border-radius:3px"></span>Emergent</span> |
| 51 | + </div> |
| 52 | + </div> |
| 53 | +</div> |
| 54 | +<script> |
| 55 | + function toggleColumn(cls){ |
| 56 | + const cells=[...document.querySelectorAll('#matrix .'+cls)]; |
| 57 | + const isHidden=cells.every(td=>td.style.display==='none'); |
| 58 | + cells.forEach(td=>td.style.display=isHidden?'table-cell':'none'); |
| 59 | + } |
| 60 | +</script> |
| 61 | +`; |
| 62 | + |
| 63 | +const GOV_DASHBOARD = ` |
| 64 | +<div style="padding:16px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);"> |
| 65 | + <div style="background:rgba(255,255,255,0.95);backdrop-filter:blur(10px);border-radius:16px;padding:16px;max-width:1400px;margin:12px auto;"> |
| 66 | + <h2 style="margin:0 0 8px 0;color:#2c3e50;font-size:20px;font-weight:600;text-align:center">AGI/ASI Governance Dashboard (Lite)</h2> |
| 67 | + <div id="status" style="text-align:center;color:#475569;font-size:13px;margin-bottom:8px">Design Phase Active • 4 checkpoints scheduled</div> |
| 68 | + <div style="display:grid;grid-template-columns:1fr 340px;gap:16px"> |
| 69 | + <div style="position:relative;min-height:360px;background:#fff;border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.08);padding:16px"> |
| 70 | + <div id="rings" style="position:relative;width:320px;height:320px;margin:0 auto"> |
| 71 | + <div data-layer="context" style="position:absolute;top:4px;left:4px;width:312px;height:312px;border-radius:50%;border:3px solid #667eea;display:flex;align-items:center;justify-content:center;background:linear-gradient(45deg,#55a3ff,#667eea);color:#fff;font-weight:700">Context & Safeguards</div> |
| 72 | + <div data-layer="operational" style="position:absolute;top:34px;left:34px;width:252px;height:252px;border-radius:50%;border:3px solid #0984e3;display:flex;align-items:center;justify-content:center;background:linear-gradient(45deg,#74b9ff,#0984e3);color:#fff;font-weight:700">Operational Framework</div> |
| 73 | + <div data-layer="core" style="position:absolute;top:94px;left:94px;width:132px;height:132px;border-radius:50%;border:3px solid #ee5a24;display:flex;align-items:center;justify-content:center;background:linear-gradient(45deg,#ff6b6b,#ee5a24);color:#fff;font-weight:700">Core Elements</div> |
| 74 | + </div> |
| 75 | + </div> |
| 76 | + <div style="background:#fff;border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.08);padding:16px"> |
| 77 | + <div style="font-size:14px;font-weight:700;margin-bottom:6px">Layer Detail</div> |
| 78 | + <div id="layerTitle" style="font-size:13px;color:#334155;margin-bottom:6px">System Overview</div> |
| 79 | + <div style="font-size:12px;color:#475569;margin-bottom:6px">Aggregated Risk: <span id="aggRisk" style="font-weight:700;color:#16a34a">Low</span></div> |
| 80 | + <div style="font-size:12px;color:#475569;margin-bottom:6px">Governance: <span id="govBody">Safety Oversight Board</span></div> |
| 81 | + <div style="display:flex;gap:8px;margin-top:8px"> |
| 82 | + <button onclick="alert('Exporting report...')" style="flex:1;padding:8px 10px;border:none;border-radius:8px;background:#667eea;color:#fff;font-weight:600">Export Report</button> |
| 83 | + <button onclick="alert('Scheduling review...')" style="flex:1;padding:8px 10px;border:none;border-radius:8px;background:#764ba2;color:#fff;font-weight:600">Schedule Review</button> |
| 84 | + </div> |
| 85 | + </div> |
| 86 | + </div> |
| 87 | + </div> |
| 88 | +</div> |
| 89 | +<script> |
| 90 | + const layerRisks={core:'Medium',operational:'Medium',context:'High'}; |
| 91 | + const govBodies={core:'Model Review Board & Algorithm Ethics Panel',operational:'System Integration Board',context:'Safety Oversight Board'}; |
| 92 | + document.querySelectorAll('#rings [data-layer]').forEach(el=>{ |
| 93 | + el.addEventListener('click',()=>{ |
| 94 | + const layer=el.getAttribute('data-layer'); |
| 95 | + document.getElementById('layerTitle').textContent = layer.charAt(0).toUpperCase()+layer.slice(1)+' Layer'; |
| 96 | + document.getElementById('aggRisk').textContent = layerRisks[layer]; |
| 97 | + document.getElementById('aggRisk').style.color = layerRisks[layer]==='High'?'#e11d48':(layerRisks[layer]==='Medium'?'#f59e0b':'#16a34a'); |
| 98 | + document.getElementById('govBody').textContent = govBodies[layer]; |
| 99 | + }) |
| 100 | + }) |
| 101 | +</script> |
| 102 | +`; |
0 commit comments