| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| <title>Edu Assess Pro - smart Exam Paper Designer</title> |
| |
| <link rel="preconnect" href="https://fonts.googleapis.com"> |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap" rel="stylesheet"> |
| <style> |
| |
| |
| |
| :root{ |
| --primary-color-start: #4F46E5; |
| --primary-color-end: #8B5CF6; |
| --background-color: #f8f9fc; |
| --container-bg: #ffffff; |
| --text-color: #1f2937; |
| --label-color: #374151; |
| --border-color: #d1d5db; |
| --shadow-color: rgba(0, 0, 0, 0.08); |
| |
| --fixed-outer-border: #e5e7eb; |
| --fixed-subtitle: #6b7280; |
| --fixed-inputs-bg: #f9fafb; |
| --fixed-text-on-primary: #fff; |
| --fixed-focus-shadow: rgba(79,70,229,.15); |
| --fixed-btn-shadow: rgba(0,0,0,.10); |
| --fixed-btn-hover-shadow: rgba(0,0,0,.15); |
| --fixed-secondary-bg: #111827; |
| --fixed-pre-bg: #0f172a; |
| --fixed-pre-border: #1f2937; |
| --fixed-toast-shadow: rgba(0,0,0,.2); |
| } |
| |
| |
| |
| |
| html,body{height:100%} |
| body{ |
| padding:1rem; display:flex; justify-content:center; align-items:flex-start; |
| min-height:100vh; background:var(--background-color); color:var(--text-color); |
| font-family:"Poppins", system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Arial, "Apple Color Emoji", "Segoe UI Emoji"; |
| font-size:1rem; |
| } |
| .container{ |
| max-width:820px; width:100%; background:var(--container-bg); padding:2rem; border-radius:16px; |
| box-shadow:0 10px 30px var(--shadow-color); border:1px solid var(--fixed-outer-border); |
| } |
| @media (max-width:600px){ .container{ padding:1.25rem; } } |
| |
| h1{ |
| font-size:2rem; font-weight:700; margin:0 0 .75rem 0; text-align:center; |
| background:linear-gradient(90deg,var(--primary-color-start),var(--primary-color-end)); |
| -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; |
| } |
| .subtitle{ font-size:.9rem; color:var(--fixed-subtitle); text-align:center; margin-bottom:.75rem; } |
| |
| label{ font-weight:600; color:var(--label-color); margin-top:1rem; margin-bottom:.4rem; font-size:.95rem; display:block; } |
| |
| .row{ display:grid; grid-template-columns:1fr 1fr; gap:.75rem 1rem; } |
| .actions{ display:grid; grid-template-columns:1fr 1fr; gap:.75rem; margin-top:1.25rem; } |
| |
| |
| |
| |
| .field, select, textarea{ |
| width:100%; padding:.8rem 1rem; border-radius:10px; border:1px solid var(--border-color); |
| background:var(--fixed-inputs-bg); transition:all .2s; font-size:1rem; |
| } |
| .field:focus, select:focus, textarea:focus{ |
| outline:none; border-color:var(--primary-color-start); box-shadow:0 0 0 3px var(--fixed-focus-shadow); background:#fff; |
| } |
| |
| |
| select{ |
| -webkit-appearance:none; -moz-appearance:none; appearance:none; |
| padding-right:2.25rem; |
| background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path d="M6 8l4 4 4-4" stroke="%234F46E5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>'); |
| background-repeat:no-repeat; background-position:right .75rem center; background-size:14px; |
| } |
| select::-ms-expand{ display:none; } |
| select:disabled{ opacity:.6; cursor:not-allowed; } |
| |
| textarea{ min-height:110px; resize:vertical; } |
| |
| |
| |
| |
| .btn{ |
| display:inline-flex; align-items:center; justify-content:center; gap:.5rem; cursor:pointer; user-select:none; |
| background:linear-gradient(90deg, var(--primary-color-start), var(--primary-color-end)); |
| color:var(--fixed-text-on-primary); padding:.9rem 1.2rem; border:none; border-radius:10px; width:100%; |
| font-weight:700; font-size:1.05rem; box-shadow:0 4px 15px var(--fixed-btn-shadow); transition:transform .15s ease, box-shadow .15s ease; |
| } |
| .btn:hover{ transform:translateY(-2px); box-shadow:0 7px 20px var(--fixed-btn-hover-shadow); } |
| .btn:active{ transform:translateY(0); } |
| .btn.secondary{ background:var(--fixed-secondary-bg); } |
| |
| |
| |
| |
| pre#output{ |
| background:var(--fixed-pre-bg); color:#e5e7eb; padding:1rem 1.25rem; border-radius:12px; margin-top:1rem; |
| border:1px solid var(--fixed-pre-border); font-size:.92rem; line-height:1.6; white-space:pre-wrap; word-break:break-word; |
| } |
| |
| .toast{ |
| position:fixed; right:16px; bottom:16px; background:var(--fixed-secondary-bg); color:#fff; |
| padding:10px 12px; border-radius:10px; box-shadow:0 8px 20px var(--fixed-toast-shadow); |
| opacity:0; transform:translateY(10px); transition:opacity .2s, transform .2s; z-index:50; |
| } |
| .toast.show{ opacity:1; transform:translateY(0); } |
| |
| |
| #testlog{ display:none; } |
| </style> |
| </head> |
| <body> |
| <div class="container" role="application" aria-label="Prompt builder"> |
| <h1>EduPaper Pro - Exam Paper Designer</h1> |
| <p class="subtitle">Fill the fields to generate a <strong> text prompt</strong></p> |
|
|
| <div class="row"> |
| <div> |
| <label for="grade">Grade</label> |
| <select id="grade" class="field"> |
| <option>Grade 1</option><option>Grade 2</option><option>Grade 3</option><option>Grade 4</option> |
| <option>Grade 5</option><option>Grade 6</option><option>Grade 7</option><option>Grade 8</option> |
| <option selected>Grade 9</option><option>Grade 10</option><option>Grade 11</option><option>Grade 12</option> |
| </select> |
| </div> |
| <div> |
| <label for="subject">Subject</label> |
| <select id="subject" class="field"> |
| <option>Mathematics</option><option>English</option><option>Urdu</option><option>Science</option> |
| <option selected>Physics</option><option>Chemistry</option><option>Biology</option><option>Computer Science</option> |
| <option>Islamiat</option><option>Pakistan Studies</option> |
| </select> |
| </div> |
| <div> |
| <label for="board">Board</label> |
| <select id="board" class="field"> |
| <option>PCTB (Punjab)</option><option selected>FBISE (Federal)</option><option>Sindh Board</option> |
| <option>KPK Board</option><option>Balochistan Board</option><option>AKUEB</option> |
| </select> |
| </div> |
| <div> |
| <label for="testType">Test Type</label> |
| <select id="testType" class="field"> |
| <option selected>Formative</option><option>Summative</option><option>Diagnostic</option> |
| </select> |
| </div> |
| <div> |
| <label for="questionType">Question Type</label> |
| <select id="questionType" class="field"> |
| <option selected>MCQs</option><option>Short Questions</option><option>Long Questions</option> |
| <option>Practical/Diagram</option><option>Moral/Ethical</option><option>Islamic</option> |
| </select> |
| </div> |
| <div> |
| <label for="duration">Duration</label> |
| <select id="duration" class="field"> |
| <option>30 minutes</option><option selected>45 minutes</option><option>60 minutes</option> |
| </select> |
| </div> |
| <div> |
| <label for="language">Language of Paper</label> |
| <select id="language" class="field"> |
| <option value="">— Select —</option> |
| <option>English</option> |
| <option>Urdu</option> |
| <option>Bilingual</option> |
| </select> |
| </div> |
| <div> |
| <label for="bloom">Bloom's Taxonomy</label> |
| <select id="bloom" class="field"> |
| <option value="no" selected>No</option> |
| <option value="yes">Yes (Varied Levels)</option> |
| </select> |
| </div> |
| <div> |
| <label for="bloomLevel">Bloom Level Emphasis (optional)</label> |
| <select id="bloomLevel" class="field"> |
| <option value="">— Not specified —</option> |
| <option>Knowledge</option> |
| <option>Comprehension</option> |
| <option>Application</option> |
| <option>Analysis</option> |
| <option>Synthesis</option> |
| <option>Evaluation</option> |
| <option>Mixed/Varied</option> |
| </select> |
| </div> |
| <div> |
| <label for="mcqSelect">How many MCQs?</label> |
| <select id="mcqSelect" class="field"> |
| <option value="">— Select —</option> |
| <option>10</option><option>15</option><option>20</option><option>25</option><option>30</option> |
| </select> |
| </div> |
| <div> |
| <label for="mcqCustom">Custom MCQs (optional)</label> |
| <input id="mcqCustom" class="field" type="number" min="1" step="1" placeholder="e.g., 18" /> |
| </div> |
| <div> |
| <label for="difficulty">Difficulty (optional)</label> |
| <select id="difficulty" class="field"> |
| <option value="">— Not specified —</option> |
| <option>Easy</option><option>Moderate</option><option>Hard</option><option>Mixed</option> |
| </select> |
| </div> |
| <div style="grid-column:1/-1"> |
| <label for="topic">Topic (optional)</label> |
| <input id="topic" class="field" type="text" placeholder="Units 3–4" /> |
| </div> |
| </div> |
|
|
| <div class="actions"> |
| <button id="gen" class="btn" type="button" aria-label="Generate prompt from form">Generate Prompt</button> |
| <button id="copy" class="btn secondary" type="button" aria-label="Copy full prompt and open GPT">Copy Prompt and Paste Now</button> |
| </div> |
|
|
| <div class="actions" style="grid-template-columns:auto; justify-items:end; margin-top:.75rem"> |
| <a id="open-gpt-fallback" href="https://chatgpt.com/g/g-68697e4c49508191b175d86830b34d85-eduassess-pro-smart-exam-paper-designer" target="_blank" rel="noopener noreferrer" class="btn secondary" style="display:none; width:auto; min-width:14ch; padding:.7rem 1rem;">Open GPT</a> |
| </div> |
|
|
| <pre id="output" aria-live="polite" aria-atomic="true"></pre> |
| <pre id="testlog"></pre> |
| </div> |
|
|
| <div id="toast" class="toast" role="status" aria-live="polite">Copied!</div> |
|
|
| <script> |
| |
| const CUSTOM_GPT_URL = "https://chatgpt.com/g/g-68697e4c49508191b175d86830b34d85-eduassess-pro-smart-exam-paper-designer"; |
| const $ = (s)=>document.querySelector(s); |
| |
| function normalizeInt(v){ |
| const n = parseInt(v, 10); |
| return Number.isFinite(n) && n > 0 ? n : null; |
| } |
| |
| |
| function buildPrompt(){ |
| const grade = $('#grade').value; |
| const subject = $('#subject').value; |
| const board = $('#board').value; |
| const testType = $('#testType').value; |
| const questionType = $('#questionType').value; |
| const duration = $('#duration').value; |
| const topic = ($('#topic').value || '').trim(); |
| const language = $('#language').value; |
| const bloom = $('#bloom').value; |
| const bloomLevel = $('#bloomLevel').value; |
| const mcqSel = normalizeInt($('#mcqSelect').value); |
| const mcqCustom = normalizeInt($('#mcqCustom').value); |
| const mcqs = mcqCustom ?? mcqSel; |
| const difficulty = $('#difficulty').value; |
| |
| let p = `I need a ${testType} paper for ${grade} - ${subject}, Board: ${board}.`; |
| p += ` Question Type: ${questionType}.`; |
| if(duration) p += ` Duration: ${duration}.`; |
| if(typeof mcqs === 'number') p += ` MCQs: ${mcqs}.`; |
| if(language) p += ` Language: ${language}.`; |
| if(bloom === 'yes') p += ` Include Bloom's taxonomy: Yes.`; |
| if(bloomLevel) p += ` Bloom emphasis: ${bloomLevel}.`; |
| if(difficulty) p += ` Difficulty: ${difficulty}.`; |
| if(topic) p += ` Topic: ${topic}.`; |
| return p; |
| } |
| |
| function showToast(msg){ |
| const t = $('#toast'); |
| t.textContent = msg; |
| t.classList.add('show'); |
| setTimeout(()=>t.classList.remove('show'), 1800); |
| } |
| |
| |
| $('#gen').addEventListener('click', ()=>{ |
| const prompt = buildPrompt(); |
| $('#output').textContent = prompt; |
| }); |
| |
| $('#copy').addEventListener('click', async ()=>{ |
| const prompt = $('#output').textContent || buildPrompt(); |
| |
| const popup = window.open(CUSTOM_GPT_URL, '_blank', 'noopener,noreferrer'); |
| try{ await navigator.clipboard.writeText(prompt); }catch(e){} |
| showToast(popup ? 'Copied & Opening GPT...' : 'Copied! Tap Open GPT'); |
| const link = $('#open-gpt-fallback'); |
| if(link){ link.style.display = 'inline-flex'; link.focus(); } |
| }); |
| |
| |
| (function runTests(){ |
| const log = []; |
| const save = { |
| grade: $('#grade').value, |
| subject: $('#subject').value, |
| board: $('#board').value, |
| testType: $('#testType').value, |
| questionType: $('#questionType').value, |
| duration: $('#duration').value, |
| topic: $('#topic').value, |
| language: $('#language').value, |
| bloom: $('#bloom').value, |
| bloomLevel: $('#bloomLevel').value, |
| mcqSelect: $('#mcqSelect').value, |
| mcqCustom: $('#mcqCustom').value, |
| difficulty: $('#difficulty').value |
| }; |
| |
| |
| $('#grade').value = 'Grade 9'; |
| $('#subject').value = 'Physics'; |
| $('#board').value = 'FBISE (Federal)'; |
| $('#testType').value = 'Formative'; |
| $('#questionType').value = 'MCQs'; |
| $('#duration').value = '45 minutes'; |
| $('#topic').value = ''; |
| $('#language').value = ''; |
| $('#bloom').value = 'no'; |
| $('#bloomLevel').value = ''; |
| $('#mcqSelect').value = ''; |
| $('#mcqCustom').value = ''; |
| $('#difficulty').value = ''; |
| |
| let out = buildPrompt(); |
| const expected1 = 'I need a Formative paper for Grade 9 - Physics, Board: FBISE (Federal). Question Type: MCQs. Duration: 45 minutes.'; |
| console.assert(out === expected1, 'Test 1 failed', {out, expected1}); |
| log.push((out === expected1 ? '✅' : '❌') + ' Test 1: legacy prompt unchanged'); |
| |
| |
| $('#topic').value = 'Unit 2 (Dynamics)'; |
| out = buildPrompt(); |
| const expected2 = expected1 + ' Topic: Unit 2 (Dynamics).'; |
| console.assert(out === expected2, 'Test 2 failed', {out, expected2}); |
| log.push((out === expected2 ? '✅' : '❌') + ' Test 2: topic appends'); |
| |
| |
| $('#language').value = 'English'; |
| $('#bloom').value = 'yes'; |
| $('#bloomLevel').value = 'Application'; |
| $('#mcqSelect').value = '20'; |
| $('#difficulty').value = 'Moderate'; |
| out = buildPrompt(); |
| const expected3 = expected2 + ' MCQs: 20. Language: English. Include Bloom\'s taxonomy: Yes. Bloom emphasis: Application. Difficulty: Moderate.'; |
| console.assert(out === expected3, 'Test 3 failed', {out, expected3}); |
| log.push((out === expected3 ? '✅' : '❌') + ' Test 3: new fields appended'); |
| |
| |
| $('#grade').value = save.grade; |
| $('#subject').value = save.subject; |
| $('#board').value = save.board; |
| $('#testType').value = save.testType; |
| $('#questionType').value = save.questionType; |
| $('#duration').value = save.duration; |
| $('#topic').value = save.topic; |
| $('#language').value = save.language; |
| $('#bloom').value = save.bloom; |
| $('#bloomLevel').value = save.bloomLevel; |
| $('#mcqSelect').value = save.mcqSelect; |
| $('#mcqCustom').value = save.mcqCustom; |
| $('#difficulty').value = save.difficulty; |
| |
| const tl = document.getElementById('testlog'); |
| if(tl){ tl.textContent = log.join('\n'); } |
| })(); |
| </script> |
| </body> |
| </html> |
|
|