{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"risk-register","type":"registry:component","title":"Project Risk Register","description":"Prioritize entered risks with a simple likelihood-by-impact score.","author":"Notion Arena","categories":["business"],"tags":["widget","free","project risk","risk register","planning","likelihood","impact"],"meta":{"kind":"widget","tier":"free","version":"1.0.0","updatedAt":"2026-10-11","notionPlan":"Free","emoji":"⚠️","delivery":["embed","html-block","download"],"capabilities":{"interactive":true,"offlineSafe":true,"persistsLocally":true,"writesToNotion":false,"needsNetwork":false},"embedUrl":"https://notionarena.vercel.app/embed/risk-register","fileUrl":"https://notionarena.vercel.app/widgets/risk-register.html","downloadUrl":"https://notionarena.vercel.app/api/widget/risk-register","height":360,"minHeight":270,"maxHeight":540,"params":[{"key":"label","label":"Widget title","type":"text","default":"Risk register"},{"key":"accent","label":"Accent","type":"color","default":"#d9730d"},{"key":"theme","label":"Theme","type":"select","default":"auto","options":[{"value":"auto","label":"Match Notion"},{"value":"light","label":"Light"},{"value":"dark","label":"Dark"}]}]},"files":[{"path":"widgets/risk-register.html","type":"registry:file","target":"notion/widgets/risk-register.html","content":"<!doctype html>\n<html lang=\"en\" data-theme=\"auto\">\n<head>\n<meta charset=\"utf-8\" /><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n<title>Project Risk Register</title>\n<style>\n:root{--bg:#fff;--fg:#37352f;--muted:#6b6a68;--surface:#f7f7f5;--border:#e9e9e7;--accent:#d9730d;--accent-ink:#fff;--accent-text:var(--accent);--danger:#c24136;--connector:#c9c9c6}\nhtml[data-theme=\"dark\"]{--bg:#191919;--fg:#e6e6e4;--muted:#9b9a97;--surface:#252525;--border:#343434;--danger:#ff7369;--connector:#545450}\n@media(prefers-color-scheme:dark){html[data-theme=\"auto\"]{--bg:#191919;--fg:#e6e6e4;--muted:#9b9a97;--surface:#252525;--border:#343434;--danger:#ff7369;--connector:#545450}}\n*{box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}html,body{margin:0;height:100%}body{background:var(--bg);color:var(--fg);font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;overflow:hidden}.wrap{height:100%;min-height:270px;display:flex;flex-direction:column;gap:7px;padding:13px;overflow:auto}.head{display:flex;align-items:center;justify-content:space-between;gap:8px}.kicker{font-size:9px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);font-weight:650}.title{font-size:14px;font-weight:650;margin-top:2px}.summary{font-size:9px;color:var(--muted);text-align:right}.summary b{display:block;color:var(--accent-text);font-size:12px}.form{display:grid;grid-template-columns:minmax(0,1fr) 83px 83px 116px auto;gap:5px}.form input,.form select{width:100%;min-width:0;height:30px;border:1px solid var(--border);border-radius:7px;background:var(--surface);color:var(--fg);padding:4px 6px;font:inherit;font-size:8.5px}.form input:focus-visible,.form select:focus-visible,.row select:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.form button{height:30px;border:1px solid var(--accent);border-radius:7px;background:var(--accent);color:var(--accent-ink);font:inherit;font-size:9px;padding:4px 8px;cursor:pointer}.list{display:flex;min-height:60px;flex:1;flex-direction:column;gap:4px;overflow:auto}.row{display:grid;grid-template-columns:minmax(0,1fr) auto 72px 22px;align-items:center;gap:3px 6px;padding:6px 7px;border:1px solid var(--border);border-radius:7px;background:var(--surface)}.desc{min-width:0;overflow-wrap:anywhere;font-size:9.5px;font-weight:600}.chips{display:flex;gap:4px;align-items:center;flex-wrap:wrap}.chip{display:inline-flex;align-items:center;min-height:18px;padding:2px 5px;border:1px solid var(--border);border-radius:10px;color:var(--muted);font-size:8px;white-space:nowrap}.priority{font-weight:650}.priority.low{color:#2f6b48;background:#edf4ef;border-color:#c9dfcf}.priority.medium{color:#815712;background:#f7efdf;border-color:#e8d6ad}.priority.high{color:#9c3933;background:#f7e9e8;border-color:#ebc7c4}.status{width:100%;height:24px;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--fg);font:inherit;font-size:8px;padding:2px}.mitigation{grid-column:1/4;overflow-wrap:anywhere;color:var(--muted);font-size:8.5px;line-height:1.35}.remove{grid-column:4;grid-row:1/3;width:21px;height:21px;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--muted);cursor:pointer}.remove:hover{border-color:var(--danger);color:var(--danger)}html[data-theme=\"dark\"] .priority.low{color:#b5dfc1;background:#263d2e;border-color:#375844}html[data-theme=\"dark\"] .priority.medium{color:#e8cb8c;background:#45381f;border-color:#66522d}html[data-theme=\"dark\"] .priority.high{color:#f1aaa4;background:#482c2c;border-color:#74403e}@media(prefers-color-scheme:dark){html[data-theme=\"auto\"] .priority.low{color:#b5dfc1;background:#263d2e;border-color:#375844}html[data-theme=\"auto\"] .priority.medium{color:#e8cb8c;background:#45381f;border-color:#66522d}html[data-theme=\"auto\"] .priority.high{color:#f1aaa4;background:#482c2c;border-color:#74403e}}.empty{text-align:center;padding:12px;color:var(--muted);font-size:10px}.foot{display:flex;align-items:center;justify-content:space-between;gap:8px}.msg,.note{font-size:9px;color:var(--muted);line-height:1.35}.clear{min-height:26px;border:1px solid var(--border);border-radius:7px;background:var(--surface);color:var(--fg);font:inherit;font-size:9px;padding:4px 7px;cursor:pointer}@media(max-width:460px){.wrap{padding:10px}.form{grid-template-columns:minmax(0,1fr) minmax(65px,.7fr) minmax(65px,.7fr)}.form input:first-of-type{grid-column:1/4}.form button{grid-column:3}.row{grid-template-columns:minmax(0,1fr) auto 65px 21px;gap:3px}.chips{grid-column:1/3}.status{grid-column:3}.remove{grid-column:4;grid-row:1/3}.mitigation{grid-column:1/4}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}\n</style>\n</head>\n<body><main class=\"wrap\">\n  <header class=\"head\"><div><div class=\"kicker\">Qualitative project planning</div><div class=\"title\" id=\"title\">Risk register</div></div><div class=\"summary\"><b id=\"high\">0</b>high priority</div></header>\n  <form class=\"form\" id=\"form\"><label class=\"sr-only\" for=\"risk\">Risk description</label><input id=\"risk\" maxlength=\"90\" placeholder=\"Describe a risk\" required /><label class=\"sr-only\" for=\"likelihood\">Likelihood</label><select id=\"likelihood\" aria-label=\"Likelihood\"><option value=\"1\">Likelihood: low</option><option value=\"2\" selected>Likelihood: medium</option><option value=\"3\">Likelihood: high</option></select><label class=\"sr-only\" for=\"impact\">Impact</label><select id=\"impact\" aria-label=\"Impact\"><option value=\"1\">Impact: low</option><option value=\"2\" selected>Impact: medium</option><option value=\"3\">Impact: high</option></select><label class=\"sr-only\" for=\"mitigation\">Mitigation or response</label><input id=\"mitigation\" maxlength=\"100\" placeholder=\"Possible response\" /><button type=\"submit\">Add</button></form>\n  <section class=\"list\" id=\"list\" aria-label=\"Project risks\"></section>\n  <footer class=\"foot\"><span class=\"msg\" id=\"msg\" aria-live=\"polite\">A local, qualitative ranking only. No team sync.</span><button class=\"clear\" id=\"clear\" type=\"button\">Clear register</button></footer>\n  <div class=\"note\">A planning aid, not a forecast, compliance assessment, or professional risk evaluation.</div>\n</main>\n<script>\n(function(){\n  var cfgEl=document.getElementById('bk-config'),base={};try{base=cfgEl?JSON.parse(cfgEl.textContent||'{}'):{};}catch(e){}var q=new URLSearchParams(location.search),c={};for(var k in base)c[k]=base[k];q.forEach(function(v,k){c[k]=v;});\n  function safeColor(v,d){return /^#[0-9a-f]{6}$/i.test(String(v||''))?String(v):d;}function rgb(h){var s=String(h).slice(1);return[0,2,4].map(function(i){return parseInt(s.slice(i,i+2),16);});}function lum(a){return a.map(function(v){v/=255;return v<=.04045?v/12.92:Math.pow((v+.055)/1.055,2.4);}).reduce(function(s,v,i){return s+v*[.2126,.7152,.0722][i];},0);}function ratio(a,b){var x=lum(a),y=lum(b);return(Math.max(x,y)+.05)/(Math.min(x,y)+.05);}function ink(h){var a=rgb(h);return ratio(a,[255,255,255])>=ratio(a,[0,0,0])?'#fff':'#000';}function textColor(h){var dark=theme==='dark'||(theme==='auto'&&window.matchMedia&&window.matchMedia('(prefers-color-scheme: dark)').matches),bg=rgb(dark?'#252525':'#f7f7f5'),a=rgb(h),to=dark?[255,255,255]:[0,0,0];if(ratio(a,bg)>=4.5)return h;for(var t=.02;t<=1;t+=.02){var m=a.map(function(v,i){return Math.round(v+(to[i]-v)*t);});if(ratio(m,bg)>=4.5)return'#'+m.map(function(v){return v.toString(16).padStart(2,'0');}).join('');}return dark?'#fff':'#191919';}function setText(){document.documentElement.style.setProperty('--accent-text',textColor(ACCENT));}\n  var theme=['auto','light','dark'].indexOf(String(c.theme||'auto'))>=0?String(c.theme||'auto'):'auto',ACCENT=safeColor(c.accent,'#d9730d'),LABEL=String(c.label||'Risk register').slice(0,48),KEY='notion-arena.risk-register.v1',items=[];\n  document.documentElement.setAttribute('data-theme',theme);document.documentElement.style.setProperty('--accent',ACCENT);document.documentElement.style.setProperty('--accent-ink',ink(ACCENT));setText();if(theme==='auto'&&window.matchMedia){var mq=window.matchMedia('(prefers-color-scheme: dark)');if(mq.addEventListener)mq.addEventListener('change',setText);else if(mq.addListener)mq.addListener(setText);}document.getElementById('title').textContent=LABEL;document.title=LABEL;\n  try{var a=JSON.parse(localStorage.getItem(KEY)||'[]');if(Array.isArray(a))items=a.filter(function(x){return x&&typeof x.risk==='string';}).slice(0,80);}catch(e){}var list=document.getElementById('list'),msg=document.getElementById('msg');function save(text){try{localStorage.setItem(KEY,JSON.stringify(items));msg.textContent=text||'A local, qualitative ranking only. No team sync.';}catch(e){msg.textContent='Storage is unavailable in this browser session.';}}\n  function level(score){return score>=6?'high':score>=3?'medium':'low';}function render(){list.textContent='';document.getElementById('high').textContent=String(items.filter(function(x){return x.state!=='Mitigated'&&level((Number(x.impact)||1)*(Number(x.likelihood)||1))==='high';}).length);if(!items.length){var empty=document.createElement('div');empty.className='empty';empty.textContent='Add a risk to create a simple planning register.';list.appendChild(empty);return;}items.forEach(function(item,index){var row=document.createElement('div');row.className='row';var desc=document.createElement('span');desc.className='desc';desc.textContent=item.risk;var chips=document.createElement('span');chips.className='chips';var priority=document.createElement('span');priority.className='chip priority '+level((Number(item.impact)||1)*(Number(item.likelihood)||1));priority.textContent=level((Number(item.impact)||1)*(Number(item.likelihood)||1))+' · '+(Number(item.impact)||1)*(Number(item.likelihood)||1);var impact=document.createElement('span');impact.className='chip';impact.textContent='Impact '+['low','medium','high'][(Number(item.impact)||1)-1];var likelihood=document.createElement('span');likelihood.className='chip';likelihood.textContent='Likelihood '+['low','medium','high'][(Number(item.likelihood)||1)-1];chips.append(priority,impact,likelihood);var select=document.createElement('select');select.className='status';select.setAttribute('aria-label','Risk response status for '+item.risk);['Open','Monitoring','Mitigated'].forEach(function(s){var o=document.createElement('option');o.value=s;o.textContent=s;select.appendChild(o);});select.value=['Open','Monitoring','Mitigated'].indexOf(item.state)>=0?item.state:'Open';select.addEventListener('change',function(){item.state=select.value;save();render();});var mitigation=document.createElement('span');mitigation.className='mitigation';mitigation.textContent=item.mitigation?'Response: '+item.mitigation:'No response noted';var remove=document.createElement('button');remove.className='remove';remove.type='button';remove.textContent='×';remove.setAttribute('aria-label','Remove risk: '+item.risk);remove.addEventListener('click',function(){items.splice(index,1);save();render();});row.append(desc,chips,select,mitigation,remove);list.appendChild(row);});}\n  document.getElementById('form').addEventListener('submit',function(e){e.preventDefault();var risk=document.getElementById('risk').value.trim().slice(0,90),mitigation=document.getElementById('mitigation').value.trim().slice(0,100),likelihood=Number(document.getElementById('likelihood').value),impact=Number(document.getElementById('impact').value);if(!risk)return;if(items.length>=80){msg.textContent='Risk register limit reached.';return;}items.push({risk:risk,mitigation:mitigation,likelihood:likelihood,impact:impact,state:'Open'});document.getElementById('risk').value='';document.getElementById('mitigation').value='';save();render();document.getElementById('risk').focus();});document.getElementById('clear').addEventListener('click',function(){items=[];save('Risk register cleared.');render();});render();\n})();\n</script>\n</body>\n</html>\n"}]}