Modal Meanings · Four Context Files — Match supplied modal statements to ability, permission/request or possibility in a stated fictional context, allowing multiple valid forms…

HTML for this example

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

<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Modal Meanings · Four Context Files</title><style>:root{--bg:#f1f6ff;--ink:#263f63;--accent:#426aa9;--line:#c7d6ec;--wash:#e5eefc;}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.5 Arial,Helvetica,sans-serif}main{max-width:1120px;margin:auto;padding:26px 24px 55px}h1,h2,h3,p{margin:0}h1{font-size:clamp(27px,4vw,39px);line-height:1.17;letter-spacing:-.03em}h2{font-size:23px}h3{font-size:18px}header{margin-bottom:18px}header p{margin-top:8px}.eyebrow{font-size:12px;letter-spacing:.12em;text-transform:uppercase;font-weight:bold;color:var(--accent)}button,input,select,textarea{font:inherit}button{min-height:44px;padding:9px 15px;background:var(--accent);color:white;border:1px solid var(--accent);border-radius:6px;cursor:pointer;font-weight:bold}button.secondary{background:white;color:var(--accent)}button[aria-pressed=true]{box-shadow:inset 0 0 0 2px currentColor}button:disabled{opacity:.45;cursor:default}input,select,textarea{width:100%;min-height:44px;padding:9px 11px;border:1px solid #969fb0;background:white;color:var(--ink);border-radius:5px}textarea{min-height:90px;resize:vertical}input[type=checkbox]{width:20px;min-height:20px;vertical-align:middle;margin-right:8px}label{display:block;font-size:14px;font-weight:bold;margin:11px 0 5px}:focus-visible{outline:3px solid #d98c22;outline-offset:3px}.actions{display:flex;gap:9px;flex-wrap:wrap;margin:14px 0}.panel{background:white;border:1px solid var(--line);border-radius:10px;padding:22px;min-width:0}.columns{display:grid;grid-template-columns:1.55fr 1fr;gap:22px}.two{display:grid;grid-template-columns:1fr 1fr;gap:18px}.three{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.muted{font-size:14px;color:#556173}.notice{background:var(--wash);border-left:4px solid var(--accent);padding:13px 16px;margin:14px 0;overflow-wrap:anywhere}.error{color:#a42b25;font-weight:bold}.below{margin-top:28px;padding-top:22px;border-top:1px solid var(--line)}.below>p{margin:9px 0}.tag{font-size:12px;padding:4px 8px;background:var(--wash);border-radius:4px}.big{font-size:32px;line-height:1.2;font-weight:bold}.foot{font-size:14px;color:#556173;margin-top:24px}.readonly{min-height:180px;font:13px/1.6 ui-monospace,monospace}pre{white-space:pre-wrap;overflow-wrap:anywhere;font:14px/1.6 ui-monospace,monospace}.stage{display:grid;grid-template-columns:95px 1fr;gap:15px;padding:17px 0;border-top:1px solid var(--line)}.stage input{width:78px}.stage p{margin-top:6px}.range{font-weight:bold}.total{font-size:30px;font-weight:bold;color:var(--accent)}.schedule-heading{display:flex;justify-content:space-between;gap:12px;align-items:center}summary{cursor:pointer;min-height:44px;padding:10px 0;font-weight:bold}details{margin:18px 0}table{width:100%;border-collapse:collapse;font-size:14px}td,th{text-align:left;vertical-align:top;border-bottom:1px solid var(--line);padding:9px}.scroll{overflow:auto}[hidden]{display:none!important}@media(max-width:800px){.columns{grid-template-columns:1fr}}@media(max-width:520px){main{padding:18px 14px 40px}.panel{padding:16px}.two,.three{grid-template-columns:1fr}.actions button{flex-grow:1}.stage{grid-template-columns:78px 1fr;gap:10px}.stage input{width:65px}td,th{padding:7px}}.case{display:grid;grid-template-columns:1.5fr 1fr;gap:20px;background:white;border:1px solid var(--line);border-radius:8px;padding:20px;margin:13px 0}.statement{font:25px/1.4 Georgia,serif;margin:11px 0}.case .actions{margin:8px 0}.evidence{font-size:14px;color:#4a607d;padding:10px;background:#f2f6fe}.request{background:#fff7e4;border:1px solid #dfcc9e;border-radius:10px;padding:23px}.request button{background:white;color:#805a27;border-color:#b7955d}.request button[aria-pressed=true]{background:#f6e5bd}.case-index{font-size:12px;color:#5f7597;font-weight:bold}@media(max-width:600px){.case{grid-template-columns:1fr;gap:7px}}</style></head><body><main><header><p class="eyebrow">Original fictional school-club practice</p><h1>What does the speaker mean here?</h1><p>Use each supplied context to choose ability, permission or possibility.</p></header><article class="case"><section><p class="case-index">CONTEXT 1</p><p>The approved fictional club note permits members to borrow pencils.</p><p class="statement">“Members may borrow pencils.”</p><div class="actions"><button type="button" id="evidence-0" class="secondary">Examine context evidence</button><button type="button" id="retry-0" class="secondary">Retry this item</button></div><p id="evidence-text-0" class="evidence" hidden></p></section><section><label for="function-0">Function in context 1</label><select id="function-0"><option value="">Choose a function</option><option value="ability">Ability</option><option value="permission">Permission</option><option value="possibility">Possibility</option></select><p id="feedback-0" class="notice" role="status">Not answered.</p></section></article><article class="case"><section><p class="case-index">CONTEXT 2</p><p>Eli demonstrates solving the supplied puzzle without help.</p><p class="statement">“Eli can solve the puzzle.”</p><div class="actions"><button type="button" id="evidence-1" class="secondary">Examine context evidence</button><button type="button" id="retry-1" class="secondary">Retry this item</button></div><p id="evidence-text-1" class="evidence" hidden></p></section><section><label for="function-1">Function in context 2</label><select id="function-1"><option value="">Choose a function</option><option value="ability">Ability</option><option value="permission">Permission</option><option value="possibility">Possibility</option></select><p id="feedback-1" class="notice" role="status">Not answered.</p></section></article><article class="case"><section><p class="case-index">CONTEXT 3</p><p>Clouds are visible in the fictional scene; rain is unconfirmed.</p><p class="statement">“It might rain.”</p><div class="actions"><button type="button" id="evidence-2" class="secondary">Examine context evidence</button><button type="button" id="retry-2" class="secondary">Retry this item</button></div><p id="evidence-text-2" class="evidence" hidden></p></section><section><label for="function-2">Function in context 3</label><select id="function-2"><option value="">Choose a function</option><option value="ability">Ability</option><option value="permission">Permission</option><option value="possibility">Possibility</option></select><p id="feedback-2" class="notice" role="status">Not answered.</p></section></article><article class="case"><section><p class="case-index">CONTEXT 4</p><p>The same approved fictional club note permits members to borrow pencils.</p><p class="statement">“Members can borrow pencils.”</p><div class="actions"><button type="button" id="evidence-3" class="secondary">Examine context evidence</button><button type="button" id="retry-3" class="secondary">Retry this item</button></div><p id="evidence-text-3" class="evidence" hidden></p></section><section><label for="function-3">Function in context 4</label><select id="function-3"><option value="">Choose a function</option><option value="ability">Ability</option><option value="permission">Permission</option><option value="possibility">Possibility</option></select><p id="feedback-3" class="notice" role="status">Not answered.</p></section></article><div class="actions"><button type="button" id="check-contexts">Check the four contexts</button><button type="button" id="reset" class="secondary">Reset all practice</button></div><p id="summary" class="muted" role="status">No context choices checked.</p><section class="request below"><p class="eyebrow">Separate request task · two approved options</p><h2>Choose a polite way to ask to borrow a pencil.</h2><div class="actions"><button type="button" id="request-may" class="secondary">May I borrow a pencil?</button><button type="button" id="request-could" class="secondary">Could I borrow a pencil?</button></div><div class="actions"><button type="button" id="check-request">Check selected request</button></div><p id="request-feedback" class="notice" role="status">Not answered.</p><p class="muted">A request asks for permission or help. It is not approval already granted.</p></section><details><summary>Teacher key · separate from learner choices</summary><p>Context1 permission;2 ability;3 possibility;4 permission. Both offered requests are accepted with the same policy. Other natural request forms may exist; this fixed-choice exercise checks only the offered options.</p></details><p class="foot">All notes, puzzle demonstrations and weather details are fictional supplied contexts. No real permission, forecast, learner result or saved score is represented. The client-side key is inspectable, not secure assessment storage. No open-text meaning grading or universal one-modal/one-function rule.</p></main><script>'use strict';const $=id=>document.getElementById(id);const cases=[["The approved fictional club note permits members to borrow pencils.","Members may borrow pencils.","permission","The supplied note authorizes borrowing; this is permission, not a demonstrated skill."],["Eli demonstrates solving the supplied puzzle without help.","Eli can solve the puzzle.","ability","The supplied demonstration supports ability; no ability is inferred from Eli’s name."],["Clouds are visible in the fictional scene; rain is unconfirmed.","It might rain.","possibility","Rain is possible, not confirmed. This fictional scene is not a weather forecast."],["The same approved fictional club note permits members to borrow pencils.","Members can borrow pencils.","permission","Here can expresses permission because the supplied note permits borrowing. Can does not always mean ability."]];let request=null;
function clearItem(i){$('function-'+i).value='';$('feedback-'+i).textContent='Not answered.';$('evidence-text-'+i).hidden=true;$('summary').textContent='Choices changed — check the contexts again.';}
function checkContexts(){let answered=0,matched=0;for(let i=0;i<4;i++){const v=$('function-'+i).value;if(!v){$('feedback-'+i).textContent='Not answered — choose a function.';continue;}answered++;if(v===cases[i][2]){matched++;$('feedback-'+i).textContent='Matches this context. '+cases[i][3];}else $('feedback-'+i).textContent='Recheck the context. '+cases[i][3];}$('summary').textContent=matched+' of 4 context choices match; '+(4-answered)+' unanswered. This is local practice, not a saved assessment.';}
function chooseRequest(value){if(!['may','could'].includes(value))return;request=value;$('request-may').setAttribute('aria-pressed',String(value==='may'));$('request-could').setAttribute('aria-pressed',String(value==='could'));$('request-feedback').textContent='Request choice changed — check it.';}
function checkRequest(){$('request-feedback').textContent=request===null?'Not answered — select an offered request.':'Accepted polite request. Both offered options ask to borrow; this does not mean permission has been granted.';}
function reset(){for(let i=0;i<4;i++)clearItem(i);request=null;$('request-may').setAttribute('aria-pressed','false');$('request-could').setAttribute('aria-pressed','false');$('request-feedback').textContent='Not answered.';$('summary').textContent='No context choices checked.';}
for(let i=0;i<4;i++){$('function-'+i).addEventListener('change',()=>{$('feedback-'+i).textContent='Choice changed — check this context again.';$('summary').textContent='Choices changed — check the contexts again.';});$('retry-'+i).addEventListener('click',()=>clearItem(i));$('evidence-'+i).addEventListener('click',()=>{$('evidence-text-'+i).textContent=cases[i][3];$('evidence-text-'+i).hidden=false;});}$('check-contexts').addEventListener('click',checkContexts);$('request-may').addEventListener('click',()=>chooseRequest('may'));$('request-could').addEventListener('click',()=>chooseRequest('could'));$('check-request').addEventListener('click',checkRequest);$('reset').addEventListener('click',reset);globalThis.app={cases,checkContexts,chooseRequest,checkRequest,reset,get:()=>request};reset();</script></body></html>