Find the missing demonstration opportunity

HTML for this example

Select the code and use your copy shortcut. Changes in this preview are temporary.

<!doctype html>
<html lang="en-US"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Find the missing demonstration opportunity</title><style>*{box-sizing:border-box}body{margin:0;background:#f3f4f2;color:#202c32;font:16px/1.5 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}main{max-width:1120px;margin:auto;padding:30px 28px 60px}header{margin-bottom:22px}.eyebrow{font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:750;color:#59676b}h1{font-size:clamp(25px,4vw,36px);line-height:1.15;letter-spacing:-.035em;margin:7px 0 10px}h2{font-size:21px;line-height:1.3;margin:0 0 16px}h3{font-size:17px;margin:0 0 10px}p{margin:8px 0 16px}label{display:block;font-size:14px;font-weight:650;margin:12px 0 5px}input,select,textarea,button{font:inherit}input,select,textarea{width:100%;min-width:0;border:1px solid #b6c0bf;border-radius:7px;background:#fff;color:#202c32;padding:10px 12px}textarea{resize:vertical;min-height:88px}input[type=checkbox]{width:18px;height:18px;vertical-align:middle;margin-right:8px}button{border:1px solid #b8c3c1;border-radius:7px;padding:10px 15px;background:#fff;color:#203632;font-weight:650;cursor:pointer}button.primary{background:#243f3c;color:white;border-color:#243f3c}button:hover{filter:brightness(.95)}button:disabled{opacity:.48;cursor:not-allowed}:focus-visible{outline:3px solid #b05814;outline-offset:3px}.buttons{display:flex;gap:8px;flex-wrap:wrap;margin-top:18px}.panel{background:#fff;border:1px solid #d7ddda;border-radius:12px;padding:24px}.split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);gap:22px}.row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.result{background:#e4eee8;border:1px solid #c5d6ca;border-radius:12px;padding:28px}.big{font-size:clamp(32px,5vw,56px);font-weight:740;line-height:1.14;letter-spacing:-.04em;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.muted{color:#59686a;font-size:14px}.tag{display:inline-block;background:#edf0ed;border-radius:4px;padding:3px 8px;font-size:12px;font-weight:700}.error{color:#9d301b;font-weight:650;min-height:24px;margin-top:10px}.note{border-left:3px solid #9a794a;padding:10px 15px;background:#faf5e9;margin:18px 0}.below{margin-top:28px}.record{white-space:pre-wrap;overflow-wrap:anywhere;font:14px/1.65 ui-monospace,SFMono-Regular,Consolas,monospace;background:#f2f4f1;padding:18px;border-radius:8px}table{width:100%;border-collapse:collapse;font-size:14px}th,td{text-align:left;vertical-align:top;border-bottom:1px solid #dce1dd;padding:12px 10px;overflow-wrap:anywhere}th{color:#59686a;font-size:12px}a{color:#2c5a6a;overflow-wrap:anywhere}details{margin-top:20px}summary{cursor:pointer;font-weight:650}hr{border:0;border-top:1px solid #d6dcd6;margin:22px 0}[hidden]{display:none!important}ol,ul{padding-left:23px}.statline{display:flex;gap:20px;flex-wrap:wrap;margin:18px 0}.statline strong{display:block;font-size:24px}.inline{display:flex;align-items:center;gap:8px}.inline label{margin:0} .blank{min-height:36px;border-bottom:1px dashed #aebbb5;color:#66736d;font-size:13px;padding:8px 0}@media(max-width:720px){main{padding:22px 18px 45px}.split{grid-template-columns:1fr}.panel,.result{padding:20px}.row{gap:12px}th,td{padding:10px 6px}}@media(max-width:400px){main{padding:18px 14px 40px}.big{font-size:34px}button{padding:10px 12px}.row{grid-template-columns:1fr}.panel,.result{padding:17px}}.inline{flex-wrap:wrap}.metric{font-size:clamp(29px,4vw,44px);font-weight:750;line-height:1.2;letter-spacing:-.025em;font-variant-numeric:tabular-nums}.strip{display:flex;justify-content:space-between;align-items:center;gap:18px;flex-wrap:wrap}.caption{font-size:13px;color:#5d6b6f}.tag.warn{background:#f7e9ce;color:#795323}.tag.good{background:#e4ebe4;color:#344f3e}pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}button[aria-pressed=true]{background:#304b51;color:white}.fieldNote{font-size:13px;color:#5e6a6d;margin:5px 0}.three{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.docHeader{display:flex;gap:24px;justify-content:space-between;align-items:start;flex-wrap:wrap;border-bottom:2px solid #445a58;padding-bottom:20px}.docHeader h2{margin:0}.money{font-variant-numeric:tabular-nums;white-space:nowrap}.statusBand{padding:17px 22px;border-radius:8px;background:#f5ead5;color:#654c2c;font-weight:650}.statusBand p{font-size:14px;font-weight:400;margin:5px 0 0}.blankLine{border-bottom:1px dashed #b6bfb8;min-height:38px}.evidenceRow{display:grid;grid-template-columns:1fr 1fr;gap:18px;border-top:1px solid #dce1dc;padding:18px 0}.checklabel{font-weight:400;margin:10px 0}.subtle{background:#f4f6f3}.downloadStatus{font-size:13px;min-height:22px;color:#49645a}@media(max-width:650px){.three{grid-template-columns:1fr}.evidenceRow{grid-template-columns:1fr}.metric{font-size:32px}}.mapSheet{background:#fff;border:1px solid #d4d9e1;border-radius:12px;padding:24px}.mapSheet .strip{margin-bottom:18px}.mapSheet h2{margin:8px 0 0}.curriculum{table-layout:fixed}.curriculum th:first-child{width:30%}.curriculum td{text-align:center;vertical-align:middle}.curriculum th{font-size:13px}.curriculum .selected{background:#f0f0e8}.marker{display:inline-block;min-width:40px;padding:8px 10px;border:1px solid #c7d1d7;border-radius:6px;font-size:21px;font-weight:750}.marker.I{background:#edf1f5}.marker.R{background:#e2ece5}.marker.D{background:#e5e5f0}.marker.blank{border-style:dashed;color:#83908c}.outcomeDetail{display:grid;grid-template-columns:1fr 1.2fr;gap:24px}.sequence{display:flex;gap:8px;margin-top:20px}.sequence div{flex:1;padding:13px 8px;border-top:2px solid #859992;background:#edf1ed;font-size:13px}.sequence span{display:block;font-size:18px;font-weight:700;margin-top:8px}.assessment{display:grid;grid-template-columns:150px 1fr;gap:20px;border-top:1px solid #dce1dd;padding:15px 0}@media(max-width:720px){.outcomeDetail{grid-template-columns:1fr}.mapSheet{padding:17px}.curriculum th,.curriculum td{padding:10px 4px}.curriculum .caption{font-size:11px}.marker{min-width:30px;font-size:18px;padding:7px}.assessment{grid-template-columns:1fr;gap:5px}}</style></head><body><main><header><div class="eyebrow">Practical Data Storytelling · Three-module planning map</div><h1>Find the missing demonstration opportunity</h1></header>
<section class="mapSheet"><div class="strip"><div><span class="eyebrow" id="variantLabel">Baseline · 9 cells</span><h2 id="cellCount">6 mapped / 3 blank</h2></div><div class="buttons"><button id="baseline" aria-pressed="true">Baseline</button><button id="proposal" aria-pressed="false">Proposed revision</button></div></div><div id="matrix"></div><p class="caption">I = introduce · R = reinforce · D = planned opportunity to demonstrate. A blank is unmapped, not proof of absent learning.</p></section>
<section class="outcomeDetail below"><div><label for="outcome">Trace a shared outcome</label><select id="outcome"><option value="O01">O01 · Correct denominator</option><option value="O02">O02 · Compare claims</option><option value="O03" selected>O03 · Explain a limitation</option></select><h2 id="outcomeName" class="below"></h2><div id="sequence" class="sequence"></div></div><div class="panel"><span class="eyebrow">Criterion and task review</span><h2 id="finding" class="below"></h2><div id="criteria"></div></div></section>
<section class="panel below"><h2>Assessment registry</h2><div class="assessment"><strong>A01 · C01</strong><span>Read Table worksheet · Correct denominator → O01</span></div><div class="assessment"><strong>A02 · C02</strong><span>Comparison notes · Evidence supporting comparison → O02</span></div><div class="assessment"><strong>A03 · C03</strong><span>Recommendation presentation · Denominator → O01; evidence-based comparison → O02</span></div><div class="assessment"><strong>S01 · Indirect</strong><span>Confidence survey · Perception, with no direct work criterion</span></div><p class="muted">No student work or results are supplied. A03's overall grade does not isolate O03. More mapped cells do not establish better learning or external compliance.</p><div class="buttons"><button id="download">Show selected map as TSV to copy</button></div><p id="feedback" class="downloadStatus" role="status"></p></section>
<section class="panel below"><h2>Revision discussion · Actual decision pending</h2><p>Proposal: add I at C02/O03 and change C03/O03 from I to D, with a C02 limitation rehearsal and new planned criterion A03-L.</p><div class="row"><div><label for="reviewer">Responsible reviewer</label><input id="reviewer" placeholder="TO CONFIRM"></div><div><label for="decision">Actual decision / source reference</label><input id="decision"></div></div><label for="rationale">Task, criterion wording and rationale to review</label><textarea id="rationale">C02: identify a limit in the supplied evidence and explain how it narrows the comparison claim; specify materials and feedback. C03 A03-L: explains a relevant evidence limitation to the audience.</textarea><p class="muted">Keep official course documents, standards, rubrics and approval records in the maintained workflow. No mastery threshold or rubric approval is supplied.</p><a href="https://cetl.uconn.edu/curriculum-mapping/">UConn: maps, progression and assessment evidence</a></section><footer class="muted below">Local review copy · Edits last only while this page is open.</footer></main><script data-app>
(()=>{
const $=id=>document.getElementById(id);const text=(id,v)=>$(id).textContent=String(v);const on=(id,type,fn)=>$(id).addEventListener(type,fn);const escapeHTML=s=>String(s).replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));const money=n=>'$'+(n/100).toFixed(2);const quantity=(s,integer=false)=>{s=String(s).trim();if(!(integer?/^[0-9]+$/:/^[0-9]+(?:[.][0-9]{1,2})?$/).test(s)||!Number.isFinite(+s)||+s>100000)throw Error('Enter a nonnegative '+(integer?'whole number':'number with at most two decimals')+' up to 100,000. Blank is missing.');return +s};const cents=s=>Math.round(quantity(s)*100);const download=(filename,content,type='text/plain')=>{let panel=document.getElementById('manualCopyPanel');if(!panel){panel=document.createElement('section');panel.id='manualCopyPanel';panel.className='panel below';panel.style.cssText='max-width:100%;margin:24px 0';const heading=document.createElement('h2');heading.id='manualCopyName';const hint=document.createElement('p');hint.textContent='Select the content below, then press Ctrl+C or Command+C to copy it into your own file. This preview does not download files.';const area=document.createElement('textarea');area.id='manualCopyContent';area.readOnly=true;area.rows=12;area.spellcheck=false;area.setAttribute('aria-label','Generated file content to copy');area.style.cssText='display:block;width:100%;max-width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,monospace';const select=document.createElement('button');select.type='button';select.id='manualCopySelect';select.textContent='Select content';select.addEventListener('click',()=>{area.focus();area.select();});panel.append(heading,hint,area,select);(document.querySelector('main')||document.body).append(panel);}document.getElementById('manualCopyName').textContent=String(filename);const area=document.getElementById('manualCopyContent');area.value=String(content);area.dataset.mimeType=String(type);panel.scrollIntoView({block:'nearest'});area.focus();area.select();};

const courses=[{id:'C01',name:'Read Tables'},{id:'C02',name:'Compare Evidence'},{id:'C03',name:'Present Recommendation'}],outcomes={O01:'Interpret a table with the correct denominator',O02:'Compare claims using supplied evidence',O03:'Explain a limitation to an audience'},baseline=[['I','',''],['R','I',''],['D','D','I']],proposed=[['I','',''],['R','I','I'],['D','D','D']];let variant='baseline';
function mapData(v){if(!['baseline','proposal'].includes(v))throw Error('Unknown map version');const cells=(v==='baseline'?baseline:proposed).map(row=>[...row]),mapped=cells.flat().filter(Boolean).length;return {cells,mapped,blank:9-mapped}}
function trace(v,id){if(!Object.hasOwn(outcomes,id))throw Error('Unknown outcome');const m=mapData(v),column=Object.keys(outcomes).indexOf(id);return courses.map((course,i)=>({course:course.id,marker:m.cells[i][column]}))}
function tsv(v){const m=mapData(v);return 'Version\tCourse ID\tCourse\tOutcome ID\tOutcome\tPlanning marker\n'+courses.flatMap((course,i)=>Object.entries(outcomes).map(([id,name],j)=>[v,course.id,course.name,id,name,m.cells[i][j]||'UNMAPPED'].join('\t'))).join('\n')+'\n'}
function render(){const selected=$('outcome').value,m=mapData(variant);for(const id of ['baseline','proposal'])$(id).setAttribute('aria-pressed',String(variant===id));text('variantLabel',(variant==='baseline'?'Baseline':'Proposed revision · unapproved')+' · 9 cells');text('cellCount',m.mapped+' mapped / '+m.blank+' blank');$('matrix').innerHTML='<table class="curriculum"><thead><tr><th>Ordered module</th>'+Object.keys(outcomes).map(id=>'<th class="'+(id===selected?'selected':'')+'">'+id+'<br><span class="caption">'+({O01:'Denominator',O02:'Claim comparison',O03:'Audience limitation'}[id])+'</span></th>').join('')+'</tr></thead><tbody>'+courses.map((course,i)=>'<tr><th>'+course.id+'<br>'+course.name+'</th>'+Object.keys(outcomes).map((id,j)=>'<td class="'+(id===selected?'selected':'')+'"><span class="marker '+(m.cells[i][j]||'blank')+'">'+(m.cells[i][j]||'—')+'</span></td>').join('')+'</tr>').join('')+'</tbody></table>';text('outcomeName',selected+' · '+outcomes[selected]);$('sequence').innerHTML=trace(variant,selected).map(item=>'<div><strong>'+item.course+'</strong><span>'+ (item.marker||'Unmapped')+'</span></div>').join('');if(selected==='O01'){text('finding','I → R → D with a named later criterion');$('criteria').innerHTML='<p>A01 introduces denominator work; A03 includes a planned correct-denominator criterion for O01.</p><p class="muted">This maps an opportunity, not an observed result.</p>'}else if(selected==='O02'){text('finding','No separate R marker is mapped');$('criteria').innerHTML='<p>A02 provides comparison notes. A03 names an evidence-based comparison criterion.</p><p class="muted">Ask whether actual tasks provide enough reinforcement; a missing R is a review question, not automatic failure.</p>'}else if(variant==='baseline'){text('finding','Introduced only at C03; no planned D or aligned criterion');$('criteria').innerHTML='<p>A03 currently names denominator and claim-comparison criteria only. Its overall grade does not isolate O03.</p><p class="muted">S01 confidence is indirect perception evidence.</p>'}else{text('finding','Earlier introduction plus planned A03-L');$('criteria').innerHTML='<p><strong>C02 task:</strong> identify an evidence limitation and explain how it narrows the comparison claim, with materials and feedback to specify.</p><p><strong>C03 · A03-L:</strong> explains a relevant evidence limitation to the audience.</p><p class="muted">Task/criterion design and the teaching team’s actual approval are still pending.</p>'}text('feedback','')}
for(const v of ['baseline','proposal'])on(v,'click',()=>{variant=v;render()});on('outcome','change',render);on('download','click',()=>{download('curriculum-'+variant+'.tsv',tsv(variant),'text/tab-separated-values');text('feedback','Selected planning map shown below for manual copying, including all nine course/outcome cells.')});window.app={mapData,trace,tsv};render();
})();
</script></body></html>