@daowolf/system-design-quest 0.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +64 -2
- package/content/LICENSE.md +8 -0
- package/dist/chapters.json +4154 -0
- package/dist/element.js +4 -0
- package/dist/element.js.map +7 -0
- package/dist/style.css +792 -0
- package/package.json +63 -5
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../web/engine.js", "../web/state.js", "../web/dom.js", "../web/store.js", "../web/stats.js", "../web/challenges/recall.js", "../web/challenges/shared.js", "../web/challenges/multi.js", "../web/challenges/duel.js", "../web/challenges/write.js", "../web/challenges/estimate.js", "../web/diagram.js", "../web/challenges/fill.js", "../web/challenges/sticker.js", "../web/challenges/flaw.js", "../web/challenges/order.js", "../web/challenges/lightning.js", "../web/challenges/sprint.js", "../web/challenges/index.js", "../web/feedback.js", "../web/answer.js", "../web/screens/save.js", "../web/screens/profile.js", "../web/screens/map.js", "../web/screens/results.js", "../web/play.js", "../web/coach.js", "../web/app.js", "../web/element.js"],
|
|
4
|
+
"sourcesContent": ["// System Design Quest: the engine. Pure functions, no DOM, no network.\n// One scoring source for the page, the command-line summary and the tests.\n\nexport const BLOOM_POINTS = { remember: 10, understand: 15, apply: 20, analyse: 30, evaluate: 40, create: 60 };\nexport const BOSS_POINTS = 100;\nexport const BOSS_PASS = 0.8; // a boss counts as beaten at 80%\nexport const STAR_ACCURACY = 0.8; // a replay day earns a star at 80% first-try right\nexport const TOLERANCE = 1.6; // estimates count within this factor either way\nexport const OPEN_AT_START = 2; // chapters open before any boss is beaten\n\n// ---------- randomness (seeded, so an estimate can be re-checked from its seed) ----------\n\nexport function rng(seed) {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function shuffle(items, rand = Math.random) {\n const a = items.slice();\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(rand() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]];\n }\n return a;\n}\n\n// Round numbers people can do in their head: 1, 2 or 5 times a power of ten, inside [min, max].\nfunction nice(rand, [min, max]) {\n const opts = [];\n for (let p = Math.floor(Math.log10(min)) - 1; p <= Math.ceil(Math.log10(max)) + 1; p++) {\n for (const m of [1, 2, 5]) {\n const v = m * 10 ** p;\n if (v >= min && v <= max) opts.push(v);\n }\n }\n if (!opts.length) opts.push(min);\n return opts[Math.floor(rand() * opts.length)];\n}\n\nexport function fmt(n) {\n if (n >= 1e9) return `${+(n / 1e9).toPrecision(3)} billion`;\n if (n >= 1e6) return `${+(n / 1e6).toPrecision(3)} million`;\n if (n >= 1e4) return Math.round(n).toLocaleString(\"en-GB\");\n return `${+n.toPrecision(3)}`;\n}\n\n// ---------- estimate generators ----------\n\n// One question maker for each kind of estimate. Each draws its numbers from r, in a fixed order, so a seed always\n// gives the same question.\nconst GENERATORS = {\n peak_rps(r, p) {\n const users = nice(r, p.users),\n actions = nice(r, p.actions);\n const perDay = users * actions,\n avg = perDay / 1e5,\n peak = avg * 10;\n return {\n question: `${fmt(users)} people each do ${fmt(actions)} actions a day. Requests a second at the peak?`,\n answer: peak,\n unit: \"requests a second\",\n working: `${fmt(users)} \u00D7 ${fmt(actions)} = ${fmt(perDay)} a day. \u00F7 100,000 = ${fmt(avg)} a second on average. \u00D7 10 for the peak = ${fmt(peak)}.`,\n };\n },\n storage_year(r, p) {\n const items = nice(r, p.items),\n kb = nice(r, p.kb);\n const gb = (items * kb * 365) / 1e6;\n const tb = gb >= 1000;\n return {\n question: `${fmt(items)} new items a day, about ${fmt(kb)} KB each. Storage after a year, in ${tb ? \"TB\" : \"GB\"}?`,\n answer: tb ? gb / 1000 : gb,\n unit: tb ? \"TB\" : \"GB\",\n working: `${fmt(items)} \u00D7 ${fmt(kb)} KB = ${fmt(items * kb)} KB a day. \u00D7 365 \u2248 ${fmt(items * kb * 365)} KB a year = ${fmt(gb)} GB${tb ? ` = ${fmt(gb / 1000)} TB` : \"\"}. (KB \u2192 MB \u2192 GB \u2192 TB is \u00D7 1,000 each step.)`,\n };\n },\n shard_or_not(r, p) {\n const users = nice(r, p.users),\n writes = nice(r, p.writes);\n const peak = ((users * writes) / 1e5) * 10;\n return {\n question: `${fmt(users)} people each make ${fmt(writes)} writes a day. Writes a second at the peak? (Then: one database, or split?)`,\n answer: peak,\n unit: \"writes a second\",\n working: `${fmt(users)} \u00D7 ${fmt(writes)} \u00F7 100,000 \u00D7 10 = ${fmt(peak)} at the peak. ${peak > 10000 ? \"Past about 10,000 writes a second: consider splitting (sharding).\" : \"Well under about 10,000 writes a second: one database copes, no splitting.\"}`,\n };\n },\n bandwidth(r, p) {\n const rps = nice(r, p.rps),\n kb = nice(r, p.kb);\n const mbs = (rps * kb) / 1000;\n return {\n question: `${fmt(rps)} responses a second, about ${fmt(kb)} KB each. Outbound bandwidth in MB a second?`,\n answer: mbs,\n unit: \"MB a second\",\n working: `${fmt(rps)} \u00D7 ${fmt(kb)} KB = ${fmt(rps * kb)} KB a second \u00F7 1,000 = ${fmt(mbs)} MB a second.`,\n };\n },\n};\n\nexport function generate(gen, seed) {\n const r = rng(seed);\n if (!Object.hasOwn(GENERATORS, gen.kind)) throw new Error(`unknown generator ${gen.kind}`);\n return GENERATORS[gen.kind](r, gen.params);\n}\n\n// ---------- checking an answer ----------\n\nconst SELF_GRADES = { again: 0, hard: 0.5, good: 1, easy: 1 };\nconst clamp01 = (x) => Math.max(0, Math.min(1, x));\n\n// Right picks minus wrong picks, over the number of right answers: guessing everything scores nothing.\nfunction rightMinusWrong(picks, want) {\n let right = 0,\n wrong = 0;\n for (const i of picks) want.has(i) ? right++ : wrong++;\n return { right, wrong };\n}\n\n// One checker for each challenge type: the share of the answer that was right, from 0 to 1.\nconst CHECKS = {\n recall: (ch, res) => SELF_GRADES[res.grade] ?? 0,\n multi(ch, res) {\n const correct = new Set(ch.correct);\n const { right, wrong } = rightMinusWrong(new Set(res.picked || []), correct);\n return clamp01((right - wrong) / correct.size);\n },\n duel: (ch, res) => ((res.choice === ch.correct) + (res.reason === ch.reason) + (res.cost === ch.cost)) / 3,\n write: (ch, res) => clamp01((res.ticked || []).length / ch.key_points.length),\n sprint: (ch, res) => clamp01((res.ticked || []).length / ch.checks.length),\n estimate(ch, res) {\n const { answer } = generate(ch.generator, res.seed);\n const v = Number(res.value);\n return v > 0 && v <= answer * TOLERANCE && v >= answer / TOLERANCE ? 1 : 0;\n },\n fill(ch, res) {\n const slots = Object.entries(ch.slots);\n const placed = res.placed || {};\n return slots.filter(([id, label]) => placed[id] === label).length / slots.length;\n },\n sticker(ch, res) {\n let right = 0,\n wrong = 0,\n total = 0;\n for (const list of Object.values(ch.answers)) total += list.length;\n for (const [id, list] of Object.entries(res.placed || {})) {\n const got = rightMinusWrong(list, new Set(ch.answers[id] || []));\n right += got.right;\n wrong += got.wrong;\n }\n return clamp01((right - wrong) / total);\n },\n flaw: (ch, res) => 0.5 * (res.node === ch.flaw) + 0.5 * (res.fix === ch.fix),\n order(ch, res) {\n const got = res.order || [];\n return ch.items.filter((item, i) => got[i] === item).length / ch.items.length;\n },\n lightning: (ch, res) => clamp01((res.right || 0) / ch.pairs.length),\n};\n\nexport function check(ch, res = {}) {\n if (!Object.hasOwn(CHECKS, ch.type)) throw new Error(`unknown type ${ch.type}`);\n const fraction = CHECKS[ch.type](ch, res);\n return { fraction, correct: fraction >= 0.999 };\n}\n\n// ---------- points ----------\n\nexport function multiplier(combo) {\n return combo >= 5 ? 3 : combo >= 3 ? 2 : 1;\n}\n\n// Points before the combo: a share of the base for half right or better, and \u00D71.5 when sure and right.\nfunction basePoints(ch, fraction, confidence, isBoss) {\n const base = isBoss ? BOSS_POINTS : (BLOOM_POINTS[ch.bloom] ?? 10);\n const pts = fraction >= 0.5 ? base * fraction : 0;\n return fraction >= 0.999 && confidence === \"sure\" ? pts * 1.5 : pts;\n}\n\n// A miss ends the combo; a second chance keeps it where it was; any other right answer adds one.\nfunction nextCombo(combo, correct, secondChance) {\n if (!correct) return 0;\n return secondChance ? combo : combo + 1;\n}\n\nexport function score(ch, fraction, { confidence = null, combo = 0, secondChance = false, isBoss = false } = {}) {\n const correct = fraction >= 0.999;\n const newCombo = nextCombo(combo, correct, secondChance);\n const pts = basePoints(ch, fraction, confidence, isBoss) * multiplier(newCombo) * (secondChance ? 0.5 : 1);\n return { points: Math.round(pts), combo: newCombo, correct, multiplier: multiplier(newCombo) };\n}\n\n// ---------- the player's profile: every field optional ----------\n\nexport const PROFILE_TEXT = [\"name\", \"company\", \"role\"];\nexport const PROFILE_MAX = 60;\nexport const INTERVIEW_TYPES = [\"Design from scratch\", \"Review a design\", \"API design\", \"Not sure yet\"];\nconst DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst HOLD_ID_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;\nexport const isDate = (s) => typeof s === \"string\" && DATE_RE.test(s) && !Number.isNaN(Date.parse(`${s}T00:00:00`));\n\nconst isObject = (x) => !!x && typeof x === \"object\";\n\n// Each hold-back the player has set: a well-formed id, a lift date if it's a real date, and whether it's lifted.\nfunction cleanHolds(holds) {\n const kept = Object.entries(holds).filter(([id, h]) => HOLD_ID_RE.test(id) && isObject(h));\n const out = Object.fromEntries(\n kept.map(([id, h]) => [id, { lifts: isDate(h.lifts) ? h.lifts : null, lifted: h.lifted === true }]),\n );\n return kept.length ? out : null;\n}\n\n// The text fields, trimmed and cut to length; an empty one is left out.\nfunction copyText(p, out) {\n for (const k of PROFILE_TEXT) {\n if (typeof p[k] === \"string\" && p[k].trim()) out[k] = p[k].trim().slice(0, PROFILE_MAX);\n }\n}\n\n// Keep only the fields the game knows, trimmed and checked. Anything else is dropped.\nexport function cleanProfile(p) {\n const out = {};\n if (!isObject(p)) return out;\n copyText(p, out);\n if (INTERVIEW_TYPES.includes(p.interview_type)) out.interview_type = p.interview_type;\n if (isDate(p.interview_date)) out.interview_date = p.interview_date;\n if (p.intro_dismissed === true) out.intro_dismissed = true;\n const holds = isObject(p.holds) ? cleanHolds(p.holds) : null;\n if (holds) out.holds = holds;\n return out;\n}\n\n// A hold-back lifts when you lift it, on the date you set for it, or else the day after your interview.\n// With none of those, it stays until you lift it. (check_content.py applies the same rule.)\nexport function holdActive(id, profile, today) {\n const h = (profile && profile.holds && profile.holds[id]) || {};\n if (h.lifted) return false;\n if (isDate(h.lifts)) return today < h.lifts;\n if (profile && isDate(profile.interview_date)) return today <= profile.interview_date;\n return true;\n}\n\n// ---------- progress, recomputed from the record every time ----------\n\nconst RANKS = [\"Novice\", \"Advanced beginner\", \"Competent\"];\n\nfunction weekdaysBack(now, n) {\n const days = [];\n const d = new Date(now);\n while (days.length < n) {\n const wd = d.getDay();\n if (wd !== 0 && wd !== 6) days.push(localDay(d));\n d.setDate(d.getDate() - 1);\n }\n return days;\n}\n\nexport function localDay(d) {\n const z = (x) => String(x).padStart(2, \"0\");\n return `${d.getFullYear()}-${z(d.getMonth() + 1)}-${z(d.getDate())}`;\n}\n\n// A boss answer counts for its chapter even if the chapter's boss has since changed (a personal layer on or off).\nconst beatsBoss = (e, ch) =>\n e.fraction >= BOSS_PASS && (e.challenge === ch.boss || (e.boss === true && e.chapter === ch.chapter));\n\n// A replay day counts when enough of the chapter was answered (the latest answer to each) at 80% or better.\nfunction goodDay(events, need) {\n const latest = {};\n for (const e of events) latest[e.challenge] = e;\n const got = Object.values(latest);\n return got.length >= need && got.filter((e) => e.correct).length / got.length >= STAR_ACCURACY;\n}\n\n// Days after the first on which the chapter was replayed well enough to earn a star.\nfunction replayDays(first, need) {\n const byDay = {};\n for (const e of first) (byDay[e.day] ||= []).push(e);\n return Object.keys(byDay)\n .sort()\n .slice(1)\n .filter((day) => goodDay(byDay[day], need)).length;\n}\n\nfunction rankOf(played, stars, bossBeaten) {\n if (!played) return null;\n if (stars >= 2) return RANKS[2];\n return RANKS[bossBeaten ? 1 : 0];\n}\n\nfunction chapterProgress(ch, answers) {\n const ids = new Set(ch.challenges.map((c) => c.id));\n const mine = answers.filter((e) => ids.has(e.challenge));\n const first = mine.filter((e) => !e.second_chance);\n const bossBeaten = answers.some((e) => beatsBoss(e, ch));\n const stars = bossBeaten ? 1 + Math.min(2, replayDays(first, Math.min(6, ids.size))) : 0;\n return {\n played: mine.length > 0,\n answered: new Set(first.map((e) => e.challenge)).size,\n total: ids.size,\n bossBeaten,\n stars,\n rank: rankOf(mine.length > 0, stars, bossBeaten),\n accuracy: first.length ? first.filter((e) => e.correct).length / first.length : null,\n };\n}\n\n// Quests (and any chapter marked open) are always playable; training chapters unlock in order, one per boss beaten.\n// Unlocks never go backwards: once the record says a chapter opened, it stays open, whatever the bundle holds now.\nfunction unlock(out, chapters, opened, bossesBeaten) {\n let inOrder = 0;\n for (const ch of chapters) {\n const open = ch.open === true || isQuest(ch);\n const unlocked = open || inOrder < OPEN_AT_START + bossesBeaten || opened.has(ch.slug);\n out.chapters[ch.slug].unlocked = unlocked;\n if (unlocked && !opened.has(ch.slug)) out.newUnlocks.push(ch.slug);\n if (!open) inOrder++;\n }\n}\n\n// A quest is \"ready\" once every training chapter it builds on has its boss beaten.\nfunction markReady(out, chapters) {\n const byNumber = Object.fromEntries(chapters.map((ch) => [ch.chapter, ch]));\n for (const ch of chapters.filter(isQuest)) {\n out.chapters[ch.slug].ready = (ch.builds_on || []).every(\n (n) => !byNumber[n] || out.chapters[byNumber[n].slug].bossBeaten,\n );\n }\n}\n\nfunction earnedBadges(answers, chapters, bossesBeaten) {\n const sureRight = answers.filter((e) => e.confidence === \"sure\" && e.correct).length;\n return [\n [\"first-boss\", \"First boss beaten\", bossesBeaten >= 1],\n [\"combo-5\", \"Five in a row\", answers.some((e) => (e.combo || 0) >= 5)],\n [\"sure-shot\", \"Ten sure and right\", sureRight >= 10],\n [\"comeback\", \"Got it on the second chance\", answers.some((e) => e.second_chance && e.correct)],\n [\"all-bosses\", \"Every boss beaten\", chapters.length > 0 && bossesBeaten === chapters.length],\n ]\n .filter(([, , earned]) => earned)\n .map(([id, label]) => ({ id, label }));\n}\n\n// The countdown exists only if the player set an interview date.\nfunction daysLeft(profile, now) {\n if (!profile || !isDate(profile.interview_date)) return null;\n const t = new Date(`${profile.interview_date}T00:00:00`);\n const today = new Date(`${localDay(now)}T00:00:00`);\n return Math.round((t - today) / 86400000);\n}\n\n// The five challenges missed most often at the first try.\nfunction weakest(answers) {\n const misses = {};\n for (const e of answers) if (!e.second_chance && !e.correct) misses[e.challenge] = (misses[e.challenge] || 0) + 1;\n return Object.entries(misses)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([id, n]) => ({ id, misses: n }));\n}\n\nexport function progress(bundle, events, now = new Date(), profile = null) {\n const answers = events.filter((e) => e.kind === \"answer\");\n const opened = new Set(events.filter((e) => e.kind === \"unlock\").map((e) => e.slug));\n const chapters = [...bundle.chapters].sort((a, b) => a.chapter - b.chapter);\n const out = { xp: 0, chapters: {}, badges: [], weekdays: 0, daysLeft: null, weakest: [], newUnlocks: [] };\n for (const e of answers) out.xp += e.points || 0;\n\n let bossesBeaten = 0;\n for (const ch of chapters) {\n out.chapters[ch.slug] = chapterProgress(ch, answers);\n if (out.chapters[ch.slug].bossBeaten) bossesBeaten++;\n }\n unlock(out, chapters, opened, bossesBeaten);\n markReady(out, chapters);\n out.badges = earnedBadges(answers, chapters, bossesBeaten);\n\n const played = new Set(answers.map((e) => e.day));\n out.weekdays = weekdaysBack(now, 5).filter((d) => played.has(d)).length;\n out.daysLeft = daysLeft(profile, now);\n out.weakest = weakest(answers);\n return out;\n}\n\nexport const isQuest = (ch) => ch.kind === \"quest\";\n\n// The recommended route, for anyone who'd rather not choose: a quest once it's ready, else the next training\n// chapter, else any open one not yet beaten, else the weakest. Every quest stays open to jump into regardless.\nexport function recommend(bundle, p) {\n const chs = [...bundle.chapters].sort((a, b) => a.chapter - b.chapter);\n const st = (c) => p.chapters[c.slug];\n return (\n chs.find((c) => isQuest(c) && st(c).ready && !st(c).bossBeaten) ||\n chs.find((c) => !isQuest(c) && st(c).unlocked && !st(c).bossBeaten) ||\n chs.find((c) => st(c).unlocked && !st(c).bossBeaten) ||\n chs.filter((c) => st(c).unlocked).sort((a, b) => (st(a).accuracy ?? 0) - (st(b).accuracy ?? 0))[0]\n );\n}\n\n// The order a chapter is played in: every challenge except the boss, then the boss.\nexport function runOrder(ch) {\n const rest = ch.challenges.filter((c) => c.id !== ch.boss);\n const boss = ch.challenges.find((c) => c.id === ch.boss);\n return boss ? [...rest, boss] : rest;\n}\n", "// The shared app state: what the game has loaded, the run in play, and where it draws.\nimport { progress, recommend } from \"./engine.js\";\n\nexport const app = {\n bundle: null,\n events: [],\n store: null,\n coach: false,\n combo: 0,\n run: null,\n timers: [],\n coachNext: 0,\n assigned: [],\n profile: {},\n holds: [],\n};\n// The game draws inside one root (the <system-design-quest> element's shadow root) and loads its files relative\n// to this script, so it works on its own page or embedded in any site.\nexport let ROOT = document;\nexport let BASE = new URL(\".\", import.meta.url);\nexport const $ = (id) => ROOT.getElementById(id);\nexport const session = Math.random().toString(36).slice(2, 10);\n\nexport function setRoot(root, base) {\n ROOT = root;\n BASE = base;\n}\n\nexport function clearTimers() {\n app.timers.forEach(clearInterval);\n app.timers = [];\n}\n\nexport function prog() {\n return progress(app.bundle, app.events, new Date(), app.profile);\n}\n\nexport function chapterBySlug(slug) {\n return app.bundle.chapters.find((c) => c.slug === slug);\n}\n\nexport function nextUp(p) {\n return recommend(app.bundle, p);\n}\n", "// Tiny DOM helpers. Nothing here writes raw HTML: every node is built with the DOM API, and styles go through\n// el.style, which a strict CSP allows.\nimport { $, ROOT, clearTimers } from \"./state.js\";\n\n// null, undefined and false leave an attribute or a child out, so h() can take conditionals inline.\nconst isLeftOut = (v) => v == null || v === false;\n\n// \"on\u2026\" adds a listener; \"class\" and \"style\" set properties; anything else is an attribute (true means present).\nfunction setAttr(el, k, v) {\n if (k.startsWith(\"on\")) el.addEventListener(k.slice(2), v);\n else if (k === \"class\") el.className = v;\n else if (k === \"style\")\n el.style.cssText = v; // through the CSS object model, which a strict CSP allows\n else el.setAttribute(k, v === true ? \"\" : v);\n}\n\nconst toNode = (kid) => (kid instanceof Node ? kid : document.createTextNode(String(kid)));\n\nexport function h(tag, attrs = {}, ...kids) {\n const el = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs || {})) if (!isLeftOut(v)) setAttr(el, k, v);\n for (const kid of kids.flat()) if (!isLeftOut(kid)) el.append(toNode(kid));\n return el;\n}\nexport const svg = (tag, attrs = {}) => {\n const el = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (const [k, v] of Object.entries(attrs)) {\n if (k === \"style\") el.style.cssText = v;\n else el.setAttribute(k, v);\n }\n return el;\n};\nconst screen = () => $(\"screen\");\nexport function show(...nodes) {\n clearTimers();\n const s = screen();\n s.replaceChildren(...nodes);\n s.focus({ preventScroll: true });\n // Bring the top of the game back into view, without jumping past a host page's own header.\n const host = ROOT.host || document.body;\n if (host.getBoundingClientRect().top < 0) host.scrollIntoView({ block: \"start\" });\n}\nexport function toast(text) {\n const t = h(\"div\", { class: \"toast\" }, text);\n $(\"toasts\").append(t);\n setTimeout(() => t.remove(), 3800);\n}\nexport function confetti() {\n const box = h(\"div\", { class: \"confetti\" });\n for (let i = 0; i < 40; i++) {\n const s = h(\"span\", {}, [\"\uD83C\uDF89\", \"\u2B50\", \"\u2728\", \"\uD83C\uDFC6\"][i % 4]);\n s.style.left = `${Math.random() * 100}%`;\n s.style.animationDelay = `${Math.random() * 0.8}s`;\n box.append(s);\n }\n $(\"toasts\").after(box);\n setTimeout(() => box.remove(), 3500);\n}\n// One piece of a line: **bold**, *italic*, or plain text.\n// True when part is text wrapped in the marker, such as **bold** or *italic*.\nconst isWrapped = (part, mark) => part.length > 2 * mark.length && part.startsWith(mark) && part.endsWith(mark);\nfunction richPart(part) {\n if (isWrapped(part, \"**\")) return h(\"b\", {}, part.slice(2, -2));\n if (isWrapped(part, \"*\")) return h(\"i\", {}, part.slice(1, -1));\n return part;\n}\n\nexport function richText(text) {\n // Plain text with **bold**, *italic* and line breaks, built as DOM nodes: nothing is ever parsed as HTML.\n const box = h(\"div\");\n String(text)\n .split(\"\\n\")\n .forEach((line, i) => {\n if (i) box.append(h(\"br\"));\n for (const part of line.split(/(\\*\\*.+?\\*\\*|\\*.+?\\*)/)) if (part) box.append(richPart(part));\n });\n return box;\n}\n", "// Storage: the local server's record, or the browser.\nimport { generate, localDay } from \"./engine.js\";\nimport { app, session } from \"./state.js\";\n\n// The profile lives in the same place as the answers, and nowhere else: never in the address, the title or a request\n// to anyone but the local server.\nexport class ServerStore {\n async load() {\n return (await fetch(\"/api/events\", { cache: \"no-store\" })).json();\n }\n async add(ev) {\n await fetch(\"/api/events\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(ev),\n });\n }\n async loadProfile() {\n try {\n return (await fetch(\"/api/profile\", { cache: \"no-store\" })).json();\n } catch {\n return {};\n }\n }\n async saveProfile(p) {\n await fetch(\"/api/profile\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(p),\n });\n }\n async holds() {\n try {\n return (await fetch(\"/api/holds\", { cache: \"no-store\" })).json();\n } catch {\n return [];\n }\n }\n}\nexport class LocalStore {\n key = \"sdq-events-v1\";\n profileKey = \"sdq-profile-v1\";\n async load() {\n try {\n return JSON.parse(localStorage.getItem(this.key) || \"[]\");\n } catch {\n return [];\n }\n }\n async add(ev) {\n try {\n const all = JSON.parse(localStorage.getItem(this.key) || \"[]\");\n all.push(ev);\n localStorage.setItem(this.key, JSON.stringify(all));\n } catch {\n /* storage unavailable: play on without saving */\n }\n }\n async loadProfile() {\n try {\n return JSON.parse(localStorage.getItem(this.profileKey) || \"{}\");\n } catch {\n return {};\n }\n }\n async saveProfile(p) {\n try {\n localStorage.setItem(this.profileKey, JSON.stringify(p));\n } catch {\n /* play on without saving */\n }\n }\n async holds() {\n return [];\n }\n replaceAll(events, profile) {\n localStorage.setItem(this.key, JSON.stringify(events));\n localStorage.setItem(this.profileKey, JSON.stringify(profile));\n }\n clear(everything) {\n try {\n localStorage.removeItem(this.profileKey);\n if (everything) localStorage.removeItem(this.key);\n } catch {\n /* nothing stored */\n }\n }\n}\n\nexport function baseEvent(kind, extra = {}) {\n const now = new Date();\n return { v: 1, kind, ts: now.toISOString(), day: localDay(now), session, ...extra };\n}\nexport async function post(ev) {\n app.events.push(ev);\n await app.store.add(ev);\n}\n\n// What the record keeps of a response: written text cut to length, and an estimate's worked answer.\nexport function summarise(c, res) {\n const out = { ...res };\n if (out.text) out.text = String(out.text).slice(0, 4000);\n if (c.type === \"estimate\") out.expected = generate(c.generator, res.seed).answer;\n return out;\n}\n", "// The header stats, and the toasts when progress changes.\nimport { multiplier } from \"./engine.js\";\nimport { $, app, chapterBySlug, prog } from \"./state.js\";\nimport { confetti, h, toast } from \"./dom.js\";\n\nconst BADGE_EMOJI = {\n \"first-boss\": \"\uD83C\uDFC6\",\n \"combo-5\": \"\uD83D\uDD25\",\n \"sure-shot\": \"\uD83C\uDFAF\",\n comeback: \"\uD83D\uDD01\",\n \"all-bosses\": \"\uD83D\uDC51\",\n};\nexport const badgeEmoji = (id) => BADGE_EMOJI[id] || \"\uD83C\uDFC5\";\n\n// Only with an interview date that hasn't passed.\nfunction countdown(daysLeft) {\n const company = app.profile.company;\n if (daysLeft === 0)\n return h(\"span\", { class: \"stat\" }, \"\uD83C\uDFAF \", h(\"b\", {}, `${company ? `${company} interview` : \"Interview\"} today`));\n const to = company || \"your interview\";\n return h(\"span\", { class: \"stat\" }, \"\u23F3 \", h(\"b\", {}, daysLeft), ` day${daysLeft === 1 ? \"\" : \"s\"} to ${to}`);\n}\n\nfunction comboStat(combo) {\n const times = multiplier(combo);\n return h(\"span\", { class: \"stat combo\" }, `\uD83D\uDD25 ${combo} in a row${times > 1 ? ` \u00B7 \u00D7${times}` : \"\"}`);\n}\n\nexport function renderStats() {\n const p = prog();\n const stats = [h(\"span\", { class: \"stat\" }, \"\u2B50 \", h(\"b\", {}, p.xp.toLocaleString(\"en-GB\")), \" XP\")];\n if (p.daysLeft != null && p.daysLeft >= 0) stats.push(countdown(p.daysLeft));\n stats.push(\n h(\n \"span\",\n { class: \"stat\", title: \"Days you played, of the last five weekdays. Weekends never count against you.\" },\n \"\uD83D\uDCC5 \",\n h(\"b\", {}, p.weekdays),\n \" of the last 5 weekdays\",\n ),\n );\n if (app.combo >= 2) stats.push(comboStat(app.combo));\n $(\"stats\").replaceChildren(...stats);\n}\n\nfunction chapterToasts(before, after) {\n for (const [slug, c] of Object.entries(after.chapters)) {\n const b = before.chapters[slug];\n if (c.rank && c.rank !== b.rank) toast(`\uD83C\uDF96\uFE0F Rank up: ${c.rank}`);\n if (c.unlocked && !b.unlocked) toast(`\uD83D\uDD13 Unlocked: ${chapterBySlug(slug).title}`);\n }\n}\n\nfunction badgeToasts(before, after) {\n for (const badge of after.badges)\n if (!before.badges.some((x) => x.id === badge.id)) toast(`${badgeEmoji(badge.id)} Badge: ${badge.label}`);\n}\n\nexport function celebrate(before, after, bossBeaten) {\n if (bossBeaten) confetti();\n chapterToasts(before, after);\n badgeToasts(before, after);\n}\n", "// The recall challenge.\nimport { h } from \"../dom.js\";\n\nexport function recall(c, body, finish) {\n const ta = h(\"textarea\", { placeholder: \"Say it out loud, or type it here. Then reveal.\" });\n const reveal = h(\"button\", { class: \"btn\" }, \"Show the answer\");\n const grade = h(\"div\");\n reveal.onclick = () => {\n reveal.remove();\n ta.disabled = true;\n grade.append(\n h(\"div\", { class: \"answerbox\" }, h(\"b\", {}, \"Answer: \"), c.answer),\n h(\"div\", { class: \"muted\" }, \"How did you do?\"),\n h(\n \"div\",\n { class: \"row\" },\n [\n [\"again\", \"\u274C Missed it\"],\n [\"hard\", \"\uD83D\uDFE1 Partly\"],\n [\"good\", \"\u2705 Got it\"],\n [\"easy\", \"\u26A1 Easy\"],\n ].map(([g, label]) =>\n h(\n \"button\",\n {\n class: \"btn ghost\",\n onclick: (e) => {\n grade.querySelectorAll(\"button\").forEach((b) => (b.disabled = true));\n e.target.classList.add(\"sel\");\n finish({ grade: g, text: ta.value });\n },\n },\n label,\n ),\n ),\n ),\n );\n };\n body.append(ta, h(\"p\"), reveal, grade);\n}\n", "// Building blocks the challenge types share.\nimport { h } from \"../dom.js\";\n\nexport const submitBtn = (label = \"Check\") => h(\"button\", { class: \"btn\", disabled: true }, label);\n\nexport function optionList(items, { multi = false, onChange }) {\n const box = h(\"div\", { class: \"options\" });\n const sel = new Set();\n const buttons = items.map(({ text, value }) => {\n const b = h(\n \"button\",\n {\n class: \"opt\",\n onclick: () => {\n if (multi) {\n sel.has(value) ? sel.delete(value) : sel.add(value);\n } else {\n sel.clear();\n sel.add(value);\n }\n buttons.forEach((x) => x.classList.toggle(\"sel\", sel.has(x._value)));\n onChange([...sel]);\n },\n },\n text,\n );\n b._value = value;\n return b;\n });\n box.append(...buttons);\n box._buttons = buttons;\n return box;\n}\nexport function mark(box, rightValues, chosenValues) {\n for (const b of box._buttons) {\n b.disabled = true;\n const isRight = rightValues.includes(b._value),\n chosen = chosenValues.includes(b._value);\n b.classList.remove(\"sel\");\n if (isRight && chosen) b.classList.add(\"right\");\n else if (chosen) b.classList.add(\"wrong\");\n else if (isRight) b.classList.add(\"missed\");\n }\n}\n", "// The multi challenge.\nimport { shuffle } from \"../engine.js\";\nimport { h } from \"../dom.js\";\nimport { mark, optionList, submitBtn } from \"./shared.js\";\n\nexport function multi(c, body, finish) {\n const items = shuffle(c.options.map((text, value) => ({ text, value })));\n const btn = submitBtn();\n let picked = [];\n const list = optionList(items, {\n multi: true,\n onChange: (v) => {\n picked = v;\n btn.disabled = picked.length !== c.correct.length;\n },\n });\n const why = h(\"input\", { type: \"text\", placeholder: \"Why, in one line? (optional, but it helps it stick)\" });\n btn.onclick = () => finish({ picked, why: why.value }, () => mark(list, c.correct, picked));\n body.append(h(\"div\", { class: \"muted\" }, `Pick ${c.correct.length}.`), list, h(\"p\"), why, h(\"p\"), btn);\n}\n", "// The duel challenge.\nimport { shuffle } from \"../engine.js\";\nimport { h } from \"../dom.js\";\nimport { mark, optionList, submitBtn } from \"./shared.js\";\n\nexport function duel(c, body, finish) {\n const pick = {};\n const btn = submitBtn();\n const groups = [\n [\"choice\", \"Your call\", c.choices, c.correct],\n [\"reason\", \"Because\", c.reasons, c.reason],\n [\"cost\", \"And the cost\", c.costs, c.cost],\n ];\n const lists = groups.map(([key, label, opts]) => {\n const list = optionList(shuffle(opts.map((text, value) => ({ text, value }))), {\n onChange: ([v]) => {\n pick[key] = v;\n btn.disabled = Object.keys(pick).length < 3;\n },\n });\n body.append(h(\"div\", { class: \"group\" }, h(\"div\", { class: \"label\" }, label), list));\n return list;\n });\n btn.onclick = () =>\n finish({ ...pick }, () => groups.forEach(([key, , , right], i) => mark(lists[i], [right], [pick[key]])));\n body.append(btn);\n}\n", "// The write challenge.\nimport { h } from \"../dom.js\";\n\nexport function write(c, body, finish) {\n const ta = h(\"textarea\", { placeholder: \"Write your answer. Bullet points are fine.\" });\n const btn = h(\"button\", { class: \"btn\" }, \"Done: show the key points\");\n const after = h(\"div\");\n btn.onclick = () => {\n if (ta.value.trim().length < 10) {\n ta.focus();\n return;\n }\n ta.disabled = true;\n btn.remove();\n const ticks = c.key_points.map((kp, i) =>\n h(\"label\", { class: \"opt\", style: \"display:flex;gap:10px\" }, h(\"input\", { type: \"checkbox\", value: i }), kp),\n );\n after.append(\n h(\n \"div\",\n { class: \"group\" },\n h(\"div\", { class: \"label\" }, \"Tick the ones you covered\"),\n h(\"div\", { class: \"options\" }, ticks),\n ),\n c.model ? h(\"div\", { class: \"answerbox\" }, h(\"b\", {}, \"One good answer: \"), c.model) : null,\n h(\n \"button\",\n {\n class: \"btn\",\n onclick: (e) => {\n e.target.disabled = true;\n ticks.forEach((t) => (t.querySelector(\"input\").disabled = true));\n const ticked = ticks.map((t, i) => (t.querySelector(\"input\").checked ? i : null)).filter((x) => x != null);\n finish({ ticked, text: ta.value });\n },\n },\n \"Score it\",\n ),\n );\n };\n body.append(ta, h(\"p\"), btn, after);\n}\n", "// The estimate challenge.\nimport { generate } from \"../engine.js\";\nimport { h } from \"../dom.js\";\nimport { submitBtn } from \"./shared.js\";\n\nexport function estimate(c, body, finish) {\n const seed = Math.floor(Math.random() * 2 ** 31);\n const g = generate(c.generator, seed);\n const inp = h(\"input\", { type: \"number\", min: \"0\", step: \"any\", placeholder: `Your estimate, in ${g.unit}` });\n const btn = submitBtn();\n inp.oninput = () => (btn.disabled = !(Number(inp.value) > 0));\n inp.onkeydown = (e) => {\n if (e.key === \"Enter\" && !btn.disabled) btn.click();\n };\n btn.onclick = () => {\n inp.disabled = true;\n finish({ seed, value: Number(inp.value) });\n };\n body.append(\n h(\"div\", { class: \"answerbox\" }, g.question),\n h(\"div\", { class: \"row\" }, inp, h(\"span\", { class: \"muted\" }, g.unit)),\n h(\"p\"),\n btn,\n );\n}\n\nexport function reveal(c, res) {\n const g = generate(c.generator, res.seed);\n return h(\n \"div\",\n { class: \"answerbox\" },\n h(\"div\", {}, h(\"b\", {}, \"Worked: \"), g.working),\n h(\n \"div\",\n { class: \"muted\" },\n `You said ${res.value}. Anything within \u00D71.6 of the worked answer counts: interview maths is about the order of magnitude.`,\n ),\n );\n}\n", "// Diagrams: SVG that scales with the page.\nimport { svg } from \"./dom.js\";\n\nconst TAG_MARK = { ok: \"\u2713 \", no: \"\u2717 \", miss: \"+ \" };\n\n// A box's label as up to three lines of about 16 characters, broken between words.\nfunction wrapLabel(text, max = 16) {\n const words = String(text).split(\" \");\n const lines = [\"\"];\n for (const w of words) {\n if ((lines.at(-1) + \" \" + w).trim().length > max && lines.at(-1)) lines.push(w);\n else lines[lines.length - 1] = (lines.at(-1) + \" \" + w).trim();\n }\n return lines.slice(0, 3);\n}\n\nfunction options({ slots = [], clickable = [], onNode = () => {}, onDrop = null } = {}) {\n return { slots, clickable, onNode, onDrop };\n}\n\nfunction arrowMarker() {\n const marker = svg(\"marker\", {\n id: `arrow-${Math.random().toString(36).slice(2)}`,\n viewBox: \"0 0 10 10\",\n refX: \"9\",\n refY: \"5\",\n markerWidth: \"7\",\n markerHeight: \"7\",\n orient: \"auto-start-reverse\",\n });\n marker.append(svg(\"path\", { d: \"M0,0 L10,5 L0,10 z\" }));\n return marker;\n}\n\nfunction layout(nodes) {\n const box = {};\n for (const n of nodes) box[n.id] = { x: n.x, y: n.y, w: n.w || 120, h: n.h || 48, label: n.label };\n return box;\n}\n\nconst centre = (b) => [b.x + b.w / 2, b.y + b.h / 2];\n\n// Where a line from the centre c of box r, heading for a point, leaves the box.\nfunction clip(c, r, toward) {\n const dx = toward[0] - c[0],\n dy = toward[1] - c[1];\n const t = Math.min(Math.abs(r.w / 2 / (dx || 1e-9)), Math.abs(r.h / 2 / (dy || 1e-9)));\n return [c[0] + dx * t, c[1] + dy * t];\n}\n\n// An arrow between two boxes runs from edge to edge, not centre to centre.\nfunction edgeEnds(A, B) {\n const ca = centre(A),\n cb = centre(B);\n return [clip(ca, A, cb), clip(cb, B, ca)];\n}\n\nfunction drawEdge(root, box, e, markerId) {\n const [p, q] = edgeEnds(box[e[0]], box[e[1]]);\n root.append(\n svg(\"line\", { x1: p[0], y1: p[1], x2: q[0], y2: q[1], class: \"edge\", \"marker-end\": `url(#${markerId})` }),\n );\n if (!e[2]) return;\n const t = svg(\"text\", {\n x: (p[0] + q[0]) / 2,\n y: (p[1] + q[1]) / 2 - 5,\n \"text-anchor\": \"middle\",\n class: \"edge-label\",\n });\n t.textContent = e[2];\n root.append(t);\n}\n\n// A box answers a click, Enter or Space.\nfunction onActivate(g, act) {\n g.addEventListener(\"click\", act);\n g.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n act();\n }\n });\n}\n\nfunction onDropLabel(g, drop) {\n g.addEventListener(\"dragover\", (e) => e.preventDefault());\n g.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n drop(e.dataTransfer.getData(\"text/plain\"));\n });\n}\n\nfunction nodeGroup(n, b, o) {\n const isSlot = o.slots.includes(n.id);\n const canClick = o.clickable.includes(n.id);\n const g = svg(\"g\", {\n class: `node${isSlot ? \" slot\" : \"\"}${canClick ? \" clickable\" : \"\"}`,\n tabindex: canClick ? \"0\" : \"-1\",\n });\n g.append(svg(\"rect\", { x: b.x, y: b.y, width: b.w, height: b.h, rx: 9 }));\n const text = svg(\"text\", { x: b.x + b.w / 2, \"text-anchor\": \"middle\" });\n g.append(text);\n if (canClick) onActivate(g, () => o.onNode(n.id));\n if (o.onDrop && isSlot) onDropLabel(g, (label) => o.onDrop(n.id, label));\n return { g, text, isSlot };\n}\n\nfunction writeLabel(text, b, label) {\n const lines = wrapLabel(label);\n text.replaceChildren();\n const top = b.y + b.h / 2 - ((lines.length - 1) * 15) / 2 + 4;\n lines.forEach((ln, i) => {\n const ts = svg(\"tspan\", { x: b.x + b.w / 2, y: top + i * 15 });\n ts.textContent = ln;\n text.append(ts);\n });\n}\n\n// A sticker under a box: plain while placing, then \u2713 right, \u2717 wrong or + missed after checking.\nfunction tagText(b, item, i) {\n const t = svg(\"text\", {\n x: b.x + b.w / 2,\n y: b.y + b.h + 13 + i * 12,\n \"text-anchor\": \"middle\",\n class: `tag ${item.cls || \"plain\"}`,\n });\n t.textContent = `${TAG_MARK[item.cls] ?? \"\uD83C\uDFF7 \"}${item.s}`;\n return t;\n}\n\nfunction markResult(group, r, setText) {\n group.g.classList.remove(\"picked\", \"clickable\");\n if (!r) return;\n group.g.classList.add(r.ok ? \"right\" : \"wrong\");\n if (r.text) setText(r.text);\n}\n\n// What a challenge can do with a drawn diagram.\nfunction controls({ root, box, groups, tagLayer, slots }) {\n const setText = (id, label) => writeLabel(groups[id].text, box[id], label);\n const drawTags = (map) => {\n tagLayer.replaceChildren();\n for (const [id, list] of Object.entries(map)) list.forEach((item, i) => tagLayer.append(tagText(box[id], item, i)));\n };\n return {\n el: root,\n update(placed) {\n for (const id of slots) {\n setText(id, placed[id] || \"?\");\n groups[id].g.classList.toggle(\"filled\", !!placed[id]);\n }\n },\n pick(id) {\n for (const [k, v] of Object.entries(groups)) v.g.classList.toggle(\"picked\", k === id);\n },\n tags(placed) {\n drawTags(Object.fromEntries(Object.entries(placed).map(([id, l]) => [id, l.map((s) => ({ s }))])));\n },\n tagResult(result) {\n drawTags(result);\n },\n result(fn) {\n for (const id of Object.keys(groups)) markResult(groups[id], fn(id), (text) => setText(id, text));\n },\n };\n}\n\nexport function diagram(d, opts) {\n const o = options(opts);\n const W = d.width || 640,\n H = d.height || 300;\n const root = svg(\"svg\", { viewBox: `0 0 ${W} ${H + 24}`, class: \"diagram\", role: \"img\" });\n const defs = svg(\"defs\");\n const marker = arrowMarker();\n defs.append(marker);\n root.append(defs);\n const box = layout(d.nodes);\n for (const e of d.edges || []) drawEdge(root, box, e, marker.id);\n const groups = {};\n for (const n of d.nodes) {\n groups[n.id] = nodeGroup(n, box[n.id], o);\n writeLabel(groups[n.id].text, box[n.id], groups[n.id].isSlot ? \"?\" : n.label);\n root.append(groups[n.id].g);\n }\n const tagLayer = svg(\"g\");\n root.append(tagLayer);\n return controls({ root, box, groups, tagLayer, slots: o.slots });\n}\n", "// The fill challenge.\nimport { shuffle } from \"../engine.js\";\nimport { h } from \"../dom.js\";\nimport { submitBtn } from \"./shared.js\";\nimport { diagram } from \"../diagram.js\";\n\nexport function fill(c, body, finish) {\n const placed = {};\n let chosen = null;\n const btn = submitBtn();\n const slots = Object.keys(c.slots);\n const chips = shuffle(c.palette).map((label) => {\n const chip = h(\n \"button\",\n {\n class: \"chip\",\n draggable: \"true\",\n onclick: () => {\n chosen = chosen === label ? null : label;\n chips.forEach((x) => x.classList.toggle(\"sel\", x._label === chosen));\n },\n },\n label,\n );\n chip._label = label;\n chip.addEventListener(\"dragstart\", (e) => e.dataTransfer.setData(\"text/plain\", label));\n return chip;\n });\n const refresh = () => {\n d.update(placed);\n const used = new Set(Object.values(placed));\n chips.forEach((x) => x.classList.toggle(\"used\", used.has(x._label)));\n btn.disabled = slots.some((s) => !placed[s]);\n };\n const d = diagram(c.diagram, {\n slots,\n clickable: slots,\n onNode: (id) => {\n if (chosen) {\n placed[id] = chosen;\n chosen = null;\n chips.forEach((x) => x.classList.remove(\"sel\"));\n } else delete placed[id];\n refresh();\n },\n onDrop: (id, label) => {\n placed[id] = label;\n refresh();\n },\n });\n btn.onclick = () =>\n finish({ placed: { ...placed } }, () =>\n d.result((id) => ({\n ok: placed[id] === c.slots[id],\n text: placed[id] === c.slots[id] ? placed[id] : `\u2717 ${placed[id]} \u2192 ${c.slots[id]}`,\n })),\n );\n body.append(\n h(\n \"div\",\n { class: \"muted\" },\n \"Pick a part, then click the empty box it belongs in (or drag it). Click a filled box to clear it.\",\n ),\n d.el,\n h(\"div\", { class: \"chips\" }, chips),\n btn,\n );\n}\n", "// The sticker challenge.\nimport { h, toast } from \"../dom.js\";\nimport { submitBtn } from \"./shared.js\";\nimport { diagram } from \"../diagram.js\";\n\n// One chip per sticker. Clicking a chip picks it; clicking it again puts it down.\nfunction stickerChips(labels, onPick) {\n let chosen = null;\n const chips = labels.map((label) => {\n const pick = () => {\n chosen = chosen === label ? null : label;\n chips.forEach((x) => x.classList.toggle(\"sel\", x._label === chosen));\n onPick(chosen);\n };\n const chip = h(\"button\", { class: \"chip\", onclick: pick }, `\uD83C\uDFF7\uFE0F ${label}`);\n chip._label = label;\n return chip;\n });\n return chips;\n}\n\n// Puts the sticker on a box, or takes it off if it's there already.\nfunction toggleTag(placed, id, label) {\n const list = (placed[id] ||= []);\n const at = list.indexOf(label);\n if (at >= 0) list.splice(at, 1);\n else list.push(label);\n}\n\n// Each box's tags after checking: right (\"ok\"), wrong (\"no\") and missed (\"miss\").\nfunction markTags(c, ids, placed) {\n const result = {};\n for (const id of ids) {\n const want = c.answers[id] || [],\n got = placed[id] || [];\n result[id] = [\n ...got.map((s) => ({ s, cls: want.includes(s) ? \"ok\" : \"no\" })),\n ...want.filter((s) => !got.includes(s)).map((s) => ({ s, cls: \"miss\" })),\n ];\n }\n return result;\n}\n\nexport function sticker(c, body, finish) {\n const placed = {};\n let chosen = null;\n const btn = submitBtn();\n const ids = c.diagram.nodes.map((n) => n.id);\n const chips = stickerChips(c.stickers, (label) => (chosen = label));\n const d = diagram(c.diagram, {\n clickable: ids,\n onNode: (id) => {\n if (!chosen) return toast(\"Pick a sticker first\");\n toggleTag(placed, id, chosen);\n d.tags(placed);\n btn.disabled = !Object.values(placed).some((l) => l.length);\n },\n });\n btn.onclick = () =>\n finish({ placed: JSON.parse(JSON.stringify(placed)) }, () => d.tagResult(markTags(c, ids, placed)));\n body.append(\n h(\n \"div\",\n { class: \"muted\" },\n \"Pick a sticker, then click every box that needs it. Click again to take it off. Orange tags after checking are the ones you missed.\",\n ),\n d.el,\n h(\"div\", { class: \"chips\" }, chips),\n btn,\n );\n}\n", "// The flaw challenge.\nimport { shuffle } from \"../engine.js\";\nimport { h } from \"../dom.js\";\nimport { mark, optionList, submitBtn } from \"./shared.js\";\nimport { diagram } from \"../diagram.js\";\n\nexport function flaw(c, body, finish) {\n let node = null,\n fix = null;\n const btn = submitBtn();\n const ready = () => (btn.disabled = node == null || fix == null);\n const d = diagram(c.diagram, {\n clickable: c.diagram.nodes.map((n) => n.id),\n onNode: (id) => {\n node = id;\n d.pick(id);\n ready();\n },\n });\n const list = optionList(shuffle(c.fixes.map((text, value) => ({ text, value }))), {\n onChange: ([v]) => {\n fix = v;\n ready();\n },\n });\n btn.onclick = () =>\n finish({ node, fix }, () => {\n d.result((id) => (id === c.flaw ? { ok: true } : id === node ? { ok: false } : null));\n mark(list, [c.fix], [fix]);\n });\n body.append(\n h(\"div\", { class: \"muted\" }, \"Click the weak box, then pick the fix.\"),\n d.el,\n h(\"div\", { class: \"group\" }, h(\"div\", { class: \"label\" }, \"The fix\"), list),\n btn,\n );\n}\n", "// The order challenge.\nimport { shuffle } from \"../engine.js\";\nimport { h, toast } from \"../dom.js\";\n\nexport function order(c, body, finish, state) {\n let items = shuffle(c.items);\n while (items.length > 2 && items.every((x, i) => x === c.items[i])) items = shuffle(c.items);\n const ol = h(\"ol\", { class: \"orderlist\" });\n const btn = h(\"button\", { class: \"btn\" }, \"Check\");\n let dragFrom = null;\n const draw = () =>\n ol.replaceChildren(\n ...items.map((text, i) => {\n const li = h(\n \"li\",\n { draggable: \"true\" },\n h(\"span\", { class: \"muted\" }, `${i + 1}.`),\n h(\"span\", { class: \"txt\" }, text),\n h(\n \"button\",\n {\n \"aria-label\": \"Move up\",\n onclick: () => {\n if (i > 0) {\n [items[i - 1], items[i]] = [items[i], items[i - 1]];\n draw();\n }\n },\n },\n \"\u2191\",\n ),\n h(\n \"button\",\n {\n \"aria-label\": \"Move down\",\n onclick: () => {\n if (i < items.length - 1) {\n [items[i + 1], items[i]] = [items[i], items[i + 1]];\n draw();\n }\n },\n },\n \"\u2193\",\n ),\n );\n li.addEventListener(\"dragstart\", () => (dragFrom = i));\n li.addEventListener(\"dragover\", (e) => e.preventDefault());\n li.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n if (dragFrom == null) return;\n const [m] = items.splice(dragFrom, 1);\n items.splice(i, 0, m);\n dragFrom = null;\n draw();\n });\n return li;\n }),\n );\n draw();\n const submit = () =>\n finish({ order: items.slice() }, () => {\n ol.querySelectorAll(\"li\").forEach((li, i) => {\n li.classList.add(items[i] === c.items[i] ? \"right\" : \"wrong\");\n li.querySelectorAll(\"button\").forEach((b) => b.remove());\n li.draggable = false;\n if (items[i] !== c.items[i]) li.append(h(\"span\", { class: \"muted\" }, `\u2192 ${c.items[i]}`));\n });\n });\n btn.onclick = submit;\n body.addEventListener(\"timeup\", () => {\n if (!state.submitted) {\n toast(\"\u23F1\uFE0F Time's up\");\n submit();\n }\n });\n body.append(h(\"div\", { class: \"muted\" }, \"Drag, or use the arrows.\"), ol, h(\"p\"), btn);\n}\n", "// The lightning challenge.\nimport { shuffle } from \"../engine.js\";\nimport { app, clearTimers } from \"../state.js\";\nimport { h } from \"../dom.js\";\n\nexport function lightning(c, body, finish, state) {\n const secs = c.seconds || 90;\n const reaches = [...new Set(c.pairs.map((p) => p[1]))];\n const start = h(\"button\", { class: \"btn\" }, `Start: ${secs} seconds`);\n body.append(\n h(\"div\", { class: \"muted\" }, `${c.pairs.length} quick ones. Tap the right answer; it moves on by itself.`),\n h(\"p\"),\n start,\n );\n start.onclick = () => {\n const pairs = shuffle(c.pairs);\n let i = 0,\n right = 0,\n left = secs;\n const misses = [];\n const timer = h(\"div\", { class: \"timer\" }, `\u23F1\uFE0F ${left}s`);\n const q = h(\"div\", { class: \"lightning-q\" });\n const opts = h(\"div\", { class: \"options\" });\n const end = () => {\n if (state.submitted) return;\n finish({ right, shown: i }, null);\n const toLearn = [...misses, ...pairs.slice(i)];\n body.append(\n toLearn.length\n ? h(\n \"div\",\n { class: \"answerbox\" },\n h(\"b\", {}, `${right} of ${pairs.length}. To learn: `),\n h(\n \"ul\",\n {},\n toLearn.map(([a, b]) => h(\"li\", {}, `${a} \u2192 ${b}`)),\n ),\n )\n : h(\"div\", { class: \"answerbox\" }, `Clean sweep: ${right} of ${pairs.length}.`),\n );\n };\n const ask = () => {\n if (i >= pairs.length) return end();\n const [hear, reach] = pairs[i];\n q.textContent = hear;\n const choices = shuffle([reach, ...shuffle(reaches.filter((r) => r !== reach)).slice(0, 3)]);\n opts.replaceChildren(\n ...choices.map((text) =>\n h(\n \"button\",\n {\n class: \"opt\",\n onclick: () => {\n const ok = text === reach;\n if (ok) right++;\n else misses.push([hear, reach]);\n opts.classList.add(ok ? \"flash-right\" : \"flash-wrong\");\n setTimeout(() => opts.classList.remove(\"flash-right\", \"flash-wrong\"), 350);\n i++;\n ask();\n },\n },\n text,\n ),\n ),\n );\n };\n body.replaceChildren(h(\"div\", { class: \"row spread\" }, timer, h(\"span\", { class: \"muted\" }, \"Go!\")), q, opts);\n app.timers.push(\n setInterval(() => {\n left--;\n timer.textContent = `\u23F1\uFE0F ${left}s`;\n timer.classList.toggle(\"low\", left <= 10);\n if (left <= 0) {\n opts.replaceChildren();\n end();\n clearTimers();\n }\n }, 1000),\n );\n ask();\n };\n}\n", "// The sprint challenge.\nimport { app, clearTimers } from \"../state.js\";\nimport { h, toast } from \"../dom.js\";\n\nexport function sprint(c, body, finish) {\n let left = c.minutes * 60,\n running = false;\n const clock = h(\"div\", { class: \"bigtimer\" }, fmtClock(left));\n const go = h(\"button\", { class: \"btn\" }, \"Start the clock\");\n const done = h(\"button\", { class: \"btn ghost\" }, \"I'm done\");\n const hint = h(\n \"div\",\n { class: \"muted\", style: \"text-align:center\" },\n \"Talk it through out loud, as if they're listening.\",\n );\n go.onclick = () => {\n running = !running;\n go.textContent = running ? \"Pause\" : \"Resume\";\n if (running && !app.timers.length)\n app.timers.push(\n setInterval(() => {\n if (!running) return;\n left = Math.max(0, left - 1);\n clock.textContent = fmtClock(left);\n if (left === Math.floor(c.minutes * 15)) toast(\"\u23F1\uFE0F A quarter left: wrap up and say it back\");\n if (left === 0) {\n toast(\"\u23F1\uFE0F Time\");\n running = false;\n done.click();\n }\n }, 1000),\n );\n };\n done.onclick = () => {\n running = false;\n clearTimers();\n go.remove();\n done.remove();\n const ticks = c.checks.map((txt, i) =>\n h(\"label\", { class: \"opt\", style: \"display:flex;gap:10px\" }, h(\"input\", { type: \"checkbox\", value: i }), txt),\n );\n body.append(\n h(\n \"div\",\n { class: \"group\" },\n h(\"div\", { class: \"label\" }, \"Tick what you did\"),\n h(\"div\", { class: \"options\" }, ticks),\n ),\n h(\n \"button\",\n {\n class: \"btn\",\n onclick: (e) => {\n e.target.disabled = true;\n const ticked = ticks.map((t, i) => (t.querySelector(\"input\").checked ? i : null)).filter((x) => x != null);\n finish({ ticked, seconds_used: c.minutes * 60 - left });\n },\n },\n \"Score it\",\n ),\n );\n };\n body.append(clock, hint, h(\"div\", { class: \"row\", style: \"justify-content:center\" }, go, done));\n}\nconst fmtClock = (s) => `${String(Math.floor(s / 60)).padStart(2, \"0\")}:${String(s % 60).padStart(2, \"0\")}`;\n", "// Every challenge type: its label, whether the player grades it, how it draws, and any answer to reveal.\nimport { recall } from \"./recall.js\";\nimport { multi } from \"./multi.js\";\nimport { duel } from \"./duel.js\";\nimport { write } from \"./write.js\";\nimport { estimate, reveal as revealEstimate } from \"./estimate.js\";\nimport { fill } from \"./fill.js\";\nimport { sticker } from \"./sticker.js\";\nimport { flaw } from \"./flaw.js\";\nimport { order } from \"./order.js\";\nimport { lightning } from \"./lightning.js\";\nimport { sprint } from \"./sprint.js\";\n\nexport const TYPE_LABEL = {\n recall: \"\uD83C\uDCCF Recall\",\n multi: \"\u2611\uFE0F Pick all that apply\",\n duel: \"\u2696\uFE0F Trade-off duel\",\n write: \"\u270D\uFE0F Write it\",\n estimate: \"\uD83D\uDD22 Estimate\",\n fill: \"\uD83E\uDDE9 Fill the diagram\",\n sticker: \"\uD83C\uDFF7\uFE0F Sticker the diagram\",\n flaw: \"\uD83D\uDD0D Spot the flaw\",\n order: \"\u2195\uFE0F Put it in order\",\n lightning: \"\u26A1 Lightning round\",\n sprint: \"\u23F1\uFE0F Sprint\",\n};\nexport const SELF_GRADED = new Set([\"recall\", \"write\", \"sprint\", \"lightning\"]);\n\nexport const RENDER = { recall, multi, duel, write, estimate, fill, sticker, flaw, order, lightning, sprint };\n\nexport const REVEAL_TEXT = {\n estimate: revealEstimate,\n recall: () => null,\n};\n", "// The feedback after an answer: the verdict, the points, the explanation and its source, then Next, Ask coach and\n// Flag.\nimport { app } from \"./state.js\";\nimport { h, richText } from \"./dom.js\";\nimport { baseEvent, post, summarise } from \"./store.js\";\nimport { REVEAL_TEXT } from \"./challenges/index.js\";\nimport { advance } from \"./play.js\";\n\nconst BOSS_BEATEN = \"\uD83D\uDC79 Boss beaten!\";\n\n// The verdict and its colour. A boss counts as beaten at 80%, short of full marks.\nfunction verdictOf(s, fraction, isBoss) {\n if (s.correct) return [isBoss ? BOSS_BEATEN : \"\u2705 Right\", \"right\"];\n if (fraction < 0.5) return [\"\u274C Not this time\", \"wrong\"];\n return isBoss && fraction >= 0.8 ? [BOSS_BEATEN, \"right\"] : [\"\uD83D\uDFE1 Partly\", \"part\"];\n}\n\n// A public source links out; a personal one names the note it came from.\nfunction sourceLine(source) {\n if (!source) return null;\n if (source.startsWith(\"vault:\")) return h(\"div\", { class: \"source muted\" }, `\uD83D\uDCD6 In your notes: ${source.slice(6)}`);\n return h(\"div\", { class: \"source\" }, \"\uD83D\uDCD6 \", h(\"a\", { href: source, target: \"_blank\", rel: \"noopener\" }, \"Source\"));\n}\n\n// A box for a note under the buttons, and its send button: once sent, the box says so.\nfunction noteBox({ field, wrapAttrs, label, send, sent }) {\n const button = h(\n \"button\",\n {\n class: \"btn small\",\n onclick: async () => {\n await send(field.value);\n wrap.replaceChildren(h(\"div\", { class: \"muted\" }, sent));\n },\n },\n label,\n );\n const wrap = h(\"div\", wrapAttrs, field, button);\n return wrap;\n}\n\nfunction askCoach(c, res, where) {\n const ta = h(\"textarea\", { placeholder: \"What do you want to ask? (optional)\", style: \"min-height:60px\" });\n where.after(\n noteBox({\n field: ta,\n wrapAttrs: { style: \"width:100%\" },\n label: \"Send to coach\",\n send: (text) =>\n post(\n baseEvent(\"coach_request\", {\n coach: true,\n challenge: c.id,\n prompt: c.prompt,\n response: summarise(c, res),\n question: text.slice(0, 1000),\n }),\n ),\n sent: \"\uD83D\uDCAC Sent. The coach answers in the panel.\",\n }),\n );\n ta.focus();\n}\n\nfunction flag(c, where) {\n const ta = h(\"input\", { type: \"text\", placeholder: \"What's wrong with it?\" });\n where.after(\n noteBox({\n field: ta,\n wrapAttrs: { class: \"row\", style: \"width:100%\" },\n label: \"Flag it\",\n send: (text) => post(baseEvent(\"flag\", { coach: app.coach, challenge: c.id, note: text.slice(0, 500) })),\n sent: \"\uD83D\uDEA9 Flagged. It'll be reviewed.\",\n }),\n );\n ta.focus();\n}\n\nfunction feedbackActions(c, res) {\n const actions = h(\"div\", { class: \"row\", style: \"margin-top:12px\" });\n const nextBtn = h(\"button\", { class: \"btn\", onclick: () => advance() }, \"Next \u25B6\");\n actions.append(nextBtn);\n if (app.coach)\n actions.append(h(\"button\", { class: \"btn ghost\", onclick: () => askCoach(c, res, actions) }, \"\uD83D\uDCAC Ask coach\"));\n actions.append(h(\"button\", { class: \"btn ghost\", onclick: () => flag(c, actions) }, \"\uD83D\uDEA9 Flag\"));\n setTimeout(() => nextBtn.focus(), 50);\n return actions;\n}\n\nexport function feedback({ c, isBoss }, res, fraction, s) {\n const [verdict, cls] = verdictOf(s, fraction, isBoss);\n const reveal = REVEAL_TEXT[c.type];\n return h(\n \"div\",\n { class: `feedback ${cls}` },\n s.points ? h(\"div\", { class: \"plus\" }, `+${s.points}`) : null,\n h(\n \"div\",\n { class: \"verdict\" },\n verdict,\n s.multiplier > 1 && s.correct ? h(\"span\", { class: \"combo\" }, ` \uD83D\uDD25 \u00D7${s.multiplier}`) : \"\",\n ),\n !s.correct && fraction < 1\n ? h(\"div\", { class: \"muted\" }, \"It comes back at the end of the run for a second chance.\")\n : null,\n reveal ? reveal(c, res) : null,\n h(\"div\", { style: \"margin-top:8px\" }, richText(c.explain)),\n sourceLine(c.source),\n feedbackActions(c, res),\n );\n}\n", "// Once an answer is in: score it with the engine, record it, count it towards the run, then show the feedback.\nimport { check, score } from \"./engine.js\";\nimport { app, prog } from \"./state.js\";\nimport { baseEvent, post, summarise } from \"./store.js\";\nimport { celebrate, renderStats } from \"./stats.js\";\nimport { feedback } from \"./feedback.js\";\n\n// The answer can't change once it's in: everything but the feedback is switched off.\nfunction lockAnswer({ card, feedbackSlot }) {\n card.querySelectorAll(\"button, input, textarea\").forEach((el) => {\n if (!feedbackSlot.contains(el)) el.disabled = true;\n });\n}\n\nfunction answerEvent({ run, c, second, isBoss, state }, res, fraction, s) {\n const ev = baseEvent(\"answer\", {\n chapter: run.chapter ? run.chapter.chapter : null,\n challenge: c.id,\n type: c.type,\n bloom: c.bloom,\n boss: isBoss,\n second_chance: second,\n confidence: state.confidence,\n fraction: Math.round(fraction * 1000) / 1000,\n correct: s.correct,\n points: s.points,\n combo: s.combo,\n response: summarise(c, res),\n });\n // A written answer goes to the coach, when there is one.\n if (c.type === \"write\" && app.coach) Object.assign(ev, { coach: true, prompt: c.prompt });\n return ev;\n}\n\n// A first-try miss in the main run comes back for a second chance; a boss sets the run's boss result.\nconst comesBack = ({ run, second, isBoss }, s) => !s.correct && !second && !isBoss && run.phase === \"main\";\nfunction tally(turn, fraction, s) {\n const { run, c, second, isBoss } = turn;\n run.answered++;\n run.points += s.points;\n if (s.correct) run.right++;\n run.bestCombo = Math.max(run.bestCombo, s.combo);\n run.results.push({ id: c.id, second, correct: s.correct, fraction, points: s.points, boss: isBoss });\n if (comesBack(turn, s)) run.misses.push(c);\n if (isBoss) run.bossResult = fraction;\n}\n\n// turn: the run, the challenge, whether it's a second chance or the boss, its state, its card and feedback slot.\n// reveal: an optional callback that marks the right answer on the challenge itself.\nexport async function finishTurn(turn, res, reveal) {\n const { c, state } = turn;\n if (state.submitted) return;\n state.submitted = true;\n lockAnswer(turn);\n const { fraction } = check(c, res);\n const before = prog();\n const s = score(c, fraction, {\n confidence: state.confidence,\n combo: app.combo,\n secondChance: turn.second,\n isBoss: turn.isBoss,\n });\n app.combo = s.combo;\n await post(answerEvent(turn, res, fraction, s));\n tally(turn, fraction, s);\n if (reveal) reveal(fraction);\n turn.feedbackSlot.replaceChildren(feedback(turn, res, fraction, s));\n celebrate(before, prog(), turn.isBoss && fraction >= 0.8);\n renderStats();\n}\n", "// The player's save. In the browser: download it, load it, or clear it. With the local coach server the record\n// lives on this computer instead, so only the profile can be cleared here.\nimport { cleanProfile } from \"../engine.js\";\nimport { app } from \"../state.js\";\nimport { h, toast } from \"../dom.js\";\nimport { renderMap } from \"./map.js\";\nimport { renderProfile } from \"./profile.js\";\n\nconst isSave = (data) => data && data.game === \"system-design-quest\" && Array.isArray(data.events);\n\nasync function loadSave(file) {\n try {\n const data = JSON.parse(await file.files[0].text());\n if (!isSave(data)) throw new Error(\"not a save file\");\n if (!confirm(`Load this save? It replaces what's in this browser (${data.events.length} events).`)) return;\n const events = data.events.filter((e) => e && typeof e === \"object\" && typeof e.kind === \"string\");\n app.store.replaceAll(events, cleanProfile(data.profile));\n app.events = events;\n app.profile = cleanProfile(data.profile);\n toast(\"\uD83D\uDCBE Save loaded\");\n renderMap();\n } catch (e) {\n toast(`Couldn't load that file: ${e.message}`);\n }\n}\n\nfunction downloadSave() {\n const blob = new Blob(\n [\n JSON.stringify({\n game: \"system-design-quest\",\n v: 1,\n saved: new Date().toISOString(),\n profile: app.profile,\n events: app.events,\n }),\n ],\n { type: \"application/json\" },\n );\n const a = h(\"a\", { href: URL.createObjectURL(blob), download: \"system-design-quest-save.json\" });\n document.body.append(a);\n a.click();\n setTimeout(() => {\n URL.revokeObjectURL(a.href);\n a.remove();\n }, 1000);\n}\n\nfunction clearProfile() {\n if (confirm(\"Clear your profile? Your progress stays.\")) {\n app.store.clear(false);\n app.profile = {};\n renderProfile();\n }\n}\n\nfunction clearEverything() {\n if (confirm(\"Clear everything: your profile and all your progress? This can't be undone.\")) {\n app.store.clear(true);\n app.profile = {};\n app.events = [];\n renderMap();\n }\n}\n\nexport function saveCard() {\n const file = h(\"input\", { type: \"file\", accept: \"application/json,.json\", hidden: true });\n file.addEventListener(\"change\", () => loadSave(file));\n return h(\n \"div\",\n { class: \"card\" },\n h(\"h2\", {}, \"\uD83D\uDCBE Your save\"),\n h(\n \"p\",\n { class: \"muted\" },\n \"Your progress lives only in this browser, and some browsers clear it after a few weeks without a visit. Download a save to keep it or move it to another device.\",\n ),\n h(\n \"div\",\n { class: \"row\" },\n h(\"button\", { class: \"btn ghost\", onclick: downloadSave }, \"Download my save\"),\n h(\"button\", { class: \"btn ghost\", onclick: () => file.click() }, \"Load a save\"),\n file,\n ),\n h(\n \"div\",\n { class: \"row\", style: \"margin-top:12px\" },\n h(\"button\", { class: \"btn ghost small\", onclick: clearProfile }, \"Clear profile\"),\n h(\"button\", { class: \"btn ghost small\", onclick: clearEverything }, \"Clear everything\"),\n ),\n );\n}\n\nasync function clearServerProfile() {\n if (confirm(\"Clear your profile? Your progress stays.\")) {\n app.profile = {};\n await app.store.saveProfile({});\n renderProfile();\n }\n}\n\n// With the local coach server: the profile is the only thing to clear here.\nexport function clearRow() {\n return h(\n \"div\",\n { class: \"row\", style: \"margin-top:12px\" },\n h(\"button\", { class: \"btn ghost small\", onclick: clearServerProfile }, \"Clear profile\"),\n );\n}\n", "// You: the optional profile, and hold-backs for mocks. The save and clear buttons are in save.js.\nimport { INTERVIEW_TYPES, PROFILE_MAX, cleanProfile, holdActive, isDate, localDay } from \"../engine.js\";\nimport { app } from \"../state.js\";\nimport { h, show, toast } from \"../dom.js\";\nimport { renderStats } from \"../stats.js\";\nimport { renderMap } from \"./map.js\";\nimport { clearRow, saveCard } from \"./save.js\";\n\nfunction textField(me, key, label, placeholder) {\n const input = h(\"input\", {\n type: \"text\",\n maxlength: PROFILE_MAX,\n placeholder,\n value: me[key] || \"\",\n autocomplete: \"off\",\n });\n input.dataset.key = key;\n return h(\"label\", { class: \"field\" }, h(\"span\", {}, label), input);\n}\n\nasync function saveProfile(fields, type, date) {\n const next = { ...app.profile };\n for (const el of fields) {\n const input = el.querySelector(\"input[data-key]\");\n if (input) next[input.dataset.key] = input.value;\n }\n next.interview_type = type.value;\n next.interview_date = date.value;\n app.profile = cleanProfile(next);\n await app.store.saveProfile(app.profile);\n toast(\"\uD83D\uDC64 Saved\");\n renderMap();\n}\n\nfunction profileCard(me) {\n const type = h(\n \"select\",\n {},\n h(\"option\", { value: \"\" }, \"Not set\"),\n INTERVIEW_TYPES.map((t) => h(\"option\", { value: t, selected: me.interview_type === t }, t)),\n );\n const date = h(\"input\", { type: \"date\", value: me.interview_date || \"\" });\n const fields = [\n textField(me, \"name\", \"Your name\", \"What should the game call you?\"),\n textField(me, \"company\", \"Interviewing with\", \"For example, Acme\"),\n textField(me, \"role\", \"Role\", \"For example, Engineering manager\"),\n h(\"label\", { class: \"field\" }, h(\"span\", {}, \"Interview type\"), type),\n h(\"label\", { class: \"field\" }, h(\"span\", {}, \"Interview date\"), date),\n ];\n const where = app.coach\n ? \"Saved on this computer, next to your answers. Claude Code reads it to coach you; only you change it, here.\"\n : \"Stays in this browser. Nothing is sent anywhere.\";\n return h(\n \"div\",\n { class: \"card\" },\n h(\"h1\", {}, \"\uD83D\uDC64 You\"),\n h(\"p\", { class: \"muted\" }, \"Every field is optional, and the game works the same with none. \", where),\n h(\"div\", { class: \"fields\" }, fields),\n h(\n \"p\",\n { class: \"muted\" },\n \"With a date, the header counts down to it. Nothing locks or unlocks by date: chapters open as you beat bosses.\",\n ),\n h(\n \"div\",\n { class: \"row\" },\n h(\"button\", { class: \"btn\", onclick: () => saveProfile(fields, type, date) }, \"Save\"),\n h(\"button\", { class: \"btn ghost\", onclick: renderMap }, \"Back to the map\"),\n ),\n );\n}\n\nfunction holdStatus(active, mine, me) {\n if (!active) return \"Lifted\";\n if (isDate(mine.lifts)) return `Lifts on ${mine.lifts}`;\n if (isDate(me.interview_date)) return `Lifts the day after your interview (${me.interview_date})`;\n return \"Held until you lift it\";\n}\n\nasync function setHold(id, mine, patch) {\n app.profile = cleanProfile({\n ...app.profile,\n holds: { ...(app.profile.holds || {}), [id]: { ...mine, ...patch } },\n });\n await app.store.saveProfile(app.profile);\n toast(\"\uD83D\uDD12 Saved. It takes effect the next time the quest is built.\");\n renderProfile();\n}\n\n// One hold-back: its label and status, and while it's active, a date to lift it or a button to lift it now.\nfunction holdRow(hold, me, today) {\n const mine = (me.holds && me.holds[hold.id]) || { lifts: null, lifted: false };\n const active = holdActive(hold.id, me, today);\n const when = h(\"input\", { type: \"date\", value: mine.lifts || \"\", disabled: !active });\n when.addEventListener(\"change\", () => setHold(hold.id, mine, { lifts: when.value || null }));\n const liftNow = () => {\n if (confirm(`Lift \"${hold.label}\" now? Its topics join the game.`)) setHold(hold.id, mine, { lifted: true });\n };\n return h(\n \"div\",\n { class: \"hold row spread\" },\n h(\"div\", {}, h(\"b\", {}, `\uD83D\uDD12 ${hold.label}`), h(\"div\", { class: \"muted\" }, holdStatus(active, mine, me))),\n active\n ? h(\n \"div\",\n { class: \"row\" },\n h(\"label\", { class: \"field inline\" }, h(\"span\", {}, \"Lift on\"), when),\n h(\"button\", { class: \"btn ghost small\", onclick: liftNow }, \"Lift now\"),\n )\n : null,\n );\n}\n\nfunction holdsCard(me) {\n const today = localDay(new Date());\n return h(\n \"div\",\n { class: \"card\" },\n h(\"h2\", {}, \"Hold-backs for mocks\"),\n h(\n \"p\",\n { class: \"muted\" },\n \"Topics held back so a mock stays a fair test. You never see which; you decide when they join.\",\n ),\n app.holds.map((hold) => holdRow(hold, me, today)),\n );\n}\n\nexport function renderProfile() {\n app.run = null;\n renderStats();\n const me = app.profile;\n const kids = [profileCard(me)];\n if (app.holds.length) kids.push(holdsCard(me));\n kids.push(app.coach ? clearRow() : saveCard());\n show(...kids);\n}\n", "// The map: every chapter and quest, and the one next action.\nimport { cleanProfile, isQuest } from \"../engine.js\";\nimport { app, nextUp, prog } from \"../state.js\";\nimport { h, show } from \"../dom.js\";\nimport { baseEvent, post } from \"../store.js\";\nimport { badgeEmoji, renderStats } from \"../stats.js\";\nimport { jumpTo, startBoss, startChapter } from \"../play.js\";\nimport { renderProfile } from \"./profile.js\";\n\nconst PROFILE_FIELDS = [\"name\", \"company\", \"role\", \"interview_type\", \"interview_date\"];\nconst plural = (n, word) => `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n\n// \"Chapter 3\" for training, \"Quest 2\" for quests (numbered in their own order).\nfunction label(ch) {\n if (!isQuest(ch)) return `Chapter ${ch.chapter}`;\n const quests = app.bundle.chapters.filter(isQuest).sort((a, b) => a.chapter - b.chapter);\n return `Quest ${quests.indexOf(ch) + 1}`;\n}\n\nfunction badgeList(badges) {\n if (!badges.length) return null;\n return h(\n \"div\",\n { class: \"badges\" },\n badges.map((b) => h(\"span\", { class: \"pill\", title: b.label }, `${badgeEmoji(b.id)} ${b.label}`)),\n );\n}\n\n// The player's name and interview, how many bosses are beaten, and the badges.\nfunction hero(p) {\n const totalBosses = app.bundle.chapters.length;\n const beaten = Object.values(p.chapters).filter((c) => c.bossBeaten).length;\n const me = app.profile;\n const about = [me.role, me.interview_type, me.company].filter(Boolean).join(\" \u00B7 \");\n return [\n h(\n \"div\",\n { class: \"hero\" },\n h(\n \"div\",\n {},\n h(\"h1\", {}, me.name ? `${me.name}'s quest map` : \"Your quest map\"),\n about ? h(\"div\", { class: \"muted\" }, `\uD83C\uDFAF ${about}`) : null,\n h(\n \"div\",\n { class: \"muted\" },\n `${beaten} of ${totalBosses} bosses beaten. Points come from right answers only; a miss costs nothing and comes back later.`,\n ),\n ),\n badgeList(p.badges),\n ),\n h(\n \"div\",\n { class: \"bar\", title: `${beaten} of ${totalBosses} bosses` },\n h(\"i\", { style: `width:${(100 * beaten) / Math.max(1, totalBosses)}%` }),\n ),\n h(\"p\"),\n ];\n}\n\nasync function dismissIntro() {\n app.profile = cleanProfile({ ...app.profile, intro_dismissed: true });\n await app.store.saveProfile(app.profile);\n renderMap();\n}\n\n// An invitation to add a profile, until the player adds one or says not now.\nfunction introHint() {\n const me = app.profile;\n if (PROFILE_FIELDS.some((k) => me[k]) || me.intro_dismissed) return [];\n return [\n h(\n \"div\",\n { class: \"card hint row spread\" },\n h(\"span\", {}, \"\uD83D\uDC64 Interviewing soon? Add it for a countdown. Optional: the game works the same without it.\"),\n h(\n \"span\",\n { class: \"row\" },\n h(\"button\", { class: \"btn small\", onclick: renderProfile }, \"Add it\"),\n h(\"button\", { class: \"btn ghost small\", onclick: dismissIntro }, \"Not now\"),\n ),\n ),\n ];\n}\n\nfunction heldHint() {\n const held = app.bundle.held;\n if (!(held?.challenges || held?.chapters)) return [];\n return [\n h(\n \"div\",\n { class: \"card hint\" },\n `\uD83D\uDD12 Held back for a mock: ${plural(held.challenges, \"challenge\")}` +\n (held.chapters ? ` and ${plural(held.chapters, \"chapter\")}` : \"\") +\n \". They join when you lift the hold-back (\uD83D\uDC64 You).\",\n ),\n ];\n}\n\nfunction nextUpCard(up, p) {\n if (!up) return [];\n return [\n h(\n \"div\",\n { class: \"card next-up\" },\n h(\n \"div\",\n {},\n h(\"div\", { class: \"muted\" }, \"\u25B6\uFE0F One next action\"),\n h(\"h2\", {}, `${up.emoji} ${label(up)}: ${up.title}`),\n h(\"div\", { class: \"muted\" }, up.blurb),\n ),\n h(\n \"button\",\n { class: \"btn\", onclick: () => startChapter(up.slug) },\n p.chapters[up.slug].played ? \"Replay\" : \"Play\",\n ),\n ),\n ];\n}\n\n// Under the title: the quest's number, whether it's ready and what it builds on, or the chapter's pillar.\nfunction cardMeta(ch, c, byNumber) {\n if (!isQuest(ch)) return h(\"div\", { class: \"muted\" }, `${label(ch)} \u00B7 `, h(\"span\", { class: \"pill\" }, ch.pillar));\n const buildsOn = (ch.builds_on || []).filter((n) => byNumber[n]);\n return h(\n \"div\",\n { class: \"muted\" },\n `${label(ch)} \u00B7 `,\n c.ready && !c.bossBeaten ? h(\"span\", { class: \"pill ready\" }, \"\u2705 Ready\") : null,\n buildsOn.length\n ? h(\n \"span\",\n { class: \"pill\", title: buildsOn.map((n) => `${n}. ${byNumber[n].title}`).join(\"\\n\") },\n `Builds on ${buildsOn.join(\", \")}`,\n )\n : null,\n );\n}\n\nfunction playButtons(ch, c) {\n return h(\n \"div\",\n { class: \"row\" },\n h(\"button\", { class: \"btn small\", onclick: () => startChapter(ch.slug) }, c.played ? \"Replay\" : \"Play\"),\n !c.bossBeaten && ch.challenges.length > 1\n ? h(\n \"button\",\n {\n class: \"btn ghost small\",\n title: \"Know this already? Beat the boss cold and the next chapter opens.\",\n onclick: () => startBoss(ch.slug),\n },\n \"\uD83D\uDC79 Try the boss now\",\n )\n : null,\n );\n}\n\nfunction lockedRow(ch) {\n return h(\n \"div\",\n { class: \"row spread\" },\n h(\"span\", { class: \"muted\" }, \"Opens when you beat another boss\"),\n h(\n \"button\",\n {\n class: \"btn ghost small\",\n title: \"Skip the order and play this chapter now. It stays open.\",\n onclick: () => jumpTo(ch.slug),\n },\n \"Jump in anyway\",\n ),\n );\n}\n\nfunction chapterCard(ch, c, byNumber) {\n const stars = \"\u2605\".repeat(c.stars) + \"\u2606\".repeat(3 - c.stars);\n return h(\n \"div\",\n { class: `card chapter${c.unlocked ? \"\" : \" locked\"}` },\n h(\n \"div\",\n { class: \"row spread\" },\n h(\"span\", { class: \"emoji\" }, c.unlocked ? ch.emoji : \"\uD83D\uDD12\"),\n h(\"span\", { class: \"stars\", title: \"Stars: beat the boss, then replay on later days at 80% or better\" }, stars),\n ),\n cardMeta(ch, c, byNumber),\n h(\"h3\", {}, ch.title),\n h(\"div\", { class: \"muted\" }, ch.blurb),\n h(\n \"div\",\n { class: \"row spread\" },\n h(\"span\", { class: \"muted\" }, c.rank ? `\uD83C\uDF96\uFE0F ${c.rank}` : \"Not played yet\"),\n h(\"span\", { class: \"muted\" }, c.accuracy != null ? `${Math.round(c.accuracy * 100)}% first try` : \"\"),\n ),\n h(\"div\", { class: \"bar\" }, h(\"i\", { style: `width:${(100 * c.answered) / Math.max(1, c.total)}%` })),\n c.unlocked ? playButtons(ch, c) : lockedRow(ch),\n );\n}\n\nconst sectionHead = (title, note) => h(\"h2\", { class: \"section\" }, title, h(\"span\", { class: \"muted small\" }, note));\n\n// Training first, then the quests (if there are any), each as a grid of cards.\nfunction sections(p) {\n const all = [...app.bundle.chapters].sort((a, b) => a.chapter - b.chapter);\n const byNumber = Object.fromEntries(all.map((ch) => [ch.chapter, ch]));\n const card = (ch) => chapterCard(ch, p.chapters[ch.slug], byNumber);\n const training = all.filter((ch) => !isQuest(ch));\n const quests = all.filter(isQuest);\n const beatenOf = (list) => list.filter((ch) => p.chapters[ch.slug].bossBeaten).length;\n const out = [\n sectionHead(\n \"\uD83D\uDCDA Training \",\n `${beatenOf(training)} of ${training.length} bosses beaten \u00B7 chapters open in order, or jump in`,\n ),\n h(\"div\", { class: \"chapters\" }, training.map(card)),\n ];\n if (quests.length) {\n out.push(\n sectionHead(\n \"\uD83D\uDDFA\uFE0F Quests \",\n `${beatenOf(quests)} of ${quests.length} beaten \u00B7 design one product end to end; all open`,\n ),\n h(\"div\", { class: \"chapters\" }, quests.map(card)),\n );\n }\n return out;\n}\n\nexport function renderMap() {\n app.run = null;\n app.combo = 0;\n renderStats();\n const p = prog();\n // Record each newly opened chapter, so it stays open whatever changes later.\n for (const slug of p.newUnlocks) post(baseEvent(\"unlock\", { slug }));\n show(...hero(p), ...introHint(), ...heldHint(), ...nextUpCard(nextUp(p), p), ...sections(p));\n}\n", "// The end of a run: points, what was missed, and one next action.\nimport { app, nextUp, prog } from \"../state.js\";\nimport { h, show } from \"../dom.js\";\nimport { baseEvent, post } from \"../store.js\";\nimport { renderStats } from \"../stats.js\";\nimport { startChapter } from \"../play.js\";\nimport { renderMap } from \"./map.js\";\n\n// The challenges missed at the first try. The boss isn't a \"miss\" to replay on its own: a failed boss means\n// replaying the chapter.\nfunction missedFirstTime(run, ch) {\n return run.results\n .filter((r) => !r.second)\n .filter((r) => !r.correct && !r.boss)\n .map((r) => ch.challenges.find((x) => x.id === r.id))\n .filter(Boolean);\n}\n\nfunction nextAction({ ch, missed, bossFailed, otherUp }) {\n if (bossFailed) return `Play ${ch.title} and take the boss again at the end.`;\n if (missed.length)\n return `Replay the ${missed.length} you missed while they're fresh${otherUp ? `, then try ${otherUp.title}` : \"\"}.`;\n if (otherUp) return `Next: ${otherUp.title}.`;\n return \"Come back on another day and replay it: a later day at 80% earns the next star.\";\n}\n\nfunction bossStat(result) {\n if (result == null) return null;\n return h(\n \"span\",\n { class: \"stat\" },\n result >= 0.8 ? \"\uD83D\uDC79 Boss beaten\" : `\uD83D\uDC79 Boss: ${Math.round(result * 100)}%, needs 80%`,\n );\n}\n\nfunction resultStats(run, c) {\n return h(\n \"div\",\n { class: \"row\" },\n h(\"span\", { class: \"stat\" }, `\u2705 ${run.right} of ${run.answered} right`),\n h(\"span\", { class: \"stat\" }, `\uD83D\uDD25 best run of ${run.bestCombo}`),\n bossStat(run.bossResult),\n c ? h(\"span\", { class: \"stat\" }, `${\"\u2605\".repeat(c.stars)}${\"\u2606\".repeat(3 - c.stars)} ${c.rank || \"\"}`) : null,\n );\n}\n\nfunction missedList(missed) {\n if (!missed.length) return null;\n return h(\n \"div\",\n {},\n h(\"div\", { class: \"muted\" }, \"Missed first time:\"),\n h(\n \"ul\",\n {},\n missed.map((m) => h(\"li\", {}, m.prompt)),\n ),\n );\n}\n\n// The first button is the one next action; the others are ghosts.\nfunction resultButtons({ ch, missed, bossFailed, otherUp }) {\n return h(\n \"div\",\n { class: \"row\", style: \"margin-top:12px\" },\n bossFailed ? h(\"button\", { class: \"btn\", onclick: () => startChapter(ch.slug) }, `Play ${ch.title}`) : null,\n missed.length\n ? h(\n \"button\",\n { class: bossFailed ? \"btn ghost\" : \"btn\", onclick: () => startChapter(ch.slug, missed) },\n \"Replay the misses\",\n )\n : null,\n otherUp\n ? h(\n \"button\",\n { class: missed.length ? \"btn ghost\" : \"btn\", onclick: () => startChapter(otherUp.slug) },\n `Play ${otherUp.title}`,\n )\n : null,\n h(\"button\", { class: \"btn ghost\", onclick: renderMap }, \"Map\"),\n );\n}\n\nexport function showResults() {\n const run = app.run;\n const p = prog();\n const ch = run.chapter;\n const c = ch ? p.chapters[ch.slug] : null;\n post(\n baseEvent(\"session_end\", {\n coach: app.coach,\n chapter: ch ? ch.chapter : null,\n points: run.points,\n answered: run.answered,\n right: run.right,\n boss: run.bossResult,\n }),\n );\n const up = nextUp(p);\n // The recommended chapter, unless it's the one just played.\n const next = {\n ch,\n missed: missedFirstTime(run, ch),\n bossFailed: run.bossResult != null && run.bossResult < 0.8,\n otherUp: up && up.slug !== ch?.slug ? up : null,\n };\n app.run = null;\n show(\n h(\n \"div\",\n { class: \"card\" },\n h(\"div\", { class: \"muted\" }, ch ? `${ch.emoji} ${ch.title}` : \"Coach's challenge\"),\n h(\"div\", { class: \"big\" }, `+${run.points} XP`),\n resultStats(run, c),\n h(\"h3\", { style: \"margin-top:16px\" }, \"\u25B6\uFE0F One next action\"),\n h(\"p\", {}, nextAction(next)),\n missedList(next.missed),\n resultButtons(next),\n ),\n );\n renderStats();\n}\n", "// A run through a chapter: starting it, then each challenge in turn until the results. What happens once an answer\n// is in lives in answer.js.\nimport { runOrder } from \"./engine.js\";\nimport { app, chapterBySlug } from \"./state.js\";\nimport { h, show, toast } from \"./dom.js\";\nimport { baseEvent, post } from \"./store.js\";\nimport { renderStats } from \"./stats.js\";\nimport { RENDER, SELF_GRADED, TYPE_LABEL } from \"./challenges/index.js\";\nimport { finishTurn } from \"./answer.js\";\nimport { renderMap } from \"./screens/map.js\";\nimport { showResults } from \"./screens/results.js\";\n\nconst CONFIDENCE = [\n [\"guess\", \"\uD83D\uDE2C Guess\"],\n [\"fairly\", \"\uD83D\uDE42 Fairly\"],\n [\"sure\", \"\uD83D\uDE0E Sure (\u00D71.5 if right)\"],\n];\n// Types that keep their own clock, so they get no countdown in the header.\nconst OWN_CLOCK = new Set([\"lightning\", \"sprint\"]);\n\nfunction newRun(chapter, queue, boss, phase) {\n return {\n chapter,\n queue,\n boss,\n phase,\n i: 0,\n misses: [],\n points: 0,\n answered: 0,\n right: 0,\n bestCombo: 0,\n results: [],\n bossResult: null,\n };\n}\n\nexport function startChapter(slug, list = null) {\n const ch = chapterBySlug(slug);\n const order = list || runOrder(ch);\n app.run = newRun(\n ch,\n order.filter((c) => c.id !== ch.boss).map((c) => ({ c, second: false })),\n list ? null : order.find((c) => c.id === ch.boss),\n \"main\",\n );\n app.combo = 0;\n post(baseEvent(\"session_start\", { chapter: ch.chapter, slug }));\n showChallenge();\n}\n\n// Jump to any chapter out of order, by choice. Recording the unlock keeps it open from then on.\nexport function jumpTo(slug) {\n post(baseEvent(\"unlock\", { slug, chosen: true }));\n startChapter(slug);\n}\n\n// Skip ahead: the boss alone, cold. Beat it and it counts exactly as at the end of a run.\nexport function startBoss(slug) {\n const ch = chapterBySlug(slug);\n const boss = ch.challenges.find((c) => c.id === ch.boss);\n app.run = newRun(ch, [{ c: boss, second: false }], null, \"boss\");\n app.combo = 0;\n post(baseEvent(\"session_start\", { chapter: ch.chapter, slug, boss_only: true }));\n showChallenge();\n}\n\nexport function startSingle(ch, chapter) {\n app.run = newRun(chapter, [{ c: ch, second: false }], null, \"single\");\n showChallenge();\n}\n\nfunction current() {\n return app.run.queue[app.run.i];\n}\n\nconst BEFORE_BOSS = new Set([\"main\", \"second\"]);\n\nexport function advance() {\n const run = app.run;\n run.i++;\n if (run.i < run.queue.length) return showChallenge();\n if (run.phase === \"main\" && run.misses.length) {\n run.phase = \"second\";\n run.queue = run.misses.map((c) => ({ c, second: true }));\n run.misses = [];\n run.i = 0;\n toast(\"\uD83D\uDD01 Second chance: the ones you missed, for half points\");\n return showChallenge();\n }\n if (run.boss && BEFORE_BOSS.has(run.phase)) {\n run.phase = \"boss\";\n run.queue = [{ c: run.boss, second: false }];\n run.i = 0;\n toast(\"\uD83D\uDC79 Boss time\");\n return showChallenge();\n }\n showResults();\n}\n\nfunction runDots() {\n const run = app.run;\n return h(\n \"div\",\n { class: \"dots\", title: \"This run\" },\n run.queue.map((q, i) => {\n const r = run.results.find((x) => x.id === q.c.id && x.second === q.second);\n const cls = r ? (r.correct ? \"right\" : r.fraction >= 0.5 ? \"part\" : \"wrong\") : i === run.i ? \"now\" : \"\";\n return h(\"i\", { class: cls });\n }),\n );\n}\n\nfunction runBar(run) {\n const leave = () => {\n if (confirm(\"Leave this run? Your answers so far are kept.\")) renderMap();\n };\n return h(\n \"div\",\n { class: \"runbar\" },\n h(\n \"div\",\n {},\n h(\"b\", {}, run.chapter ? `${run.chapter.emoji} ${run.chapter.title}` : \"Coach's challenge\"),\n \" \",\n runDots(),\n ),\n h(\"button\", { class: \"btn ghost small\", onclick: leave }, \"Map\"),\n );\n}\n\nfunction kindPills({ run, c, second, isBoss }) {\n return h(\n \"div\",\n { class: \"kind\" },\n h(\"span\", { class: \"pill\" }, TYPE_LABEL[c.type]),\n h(\"span\", { class: \"pill\", title: \"Revised Bloom's level\" }, c.bloom),\n isBoss ? h(\"span\", { class: \"pill boss-tag\" }, \"\uD83D\uDC79 Boss\") : null,\n second ? h(\"span\", { class: \"pill\" }, \"\uD83D\uDD01 Second chance\") : null,\n run.phase === \"single\" ? h(\"span\", { class: \"pill\" }, \"\uD83C\uDFAF Coach's challenge\") : null,\n );\n}\n\n// How sure the player is, asked before answering: sure and right earns \u00D71.5.\nfunction confidencePicker(state) {\n const conf = h(\"div\", { class: \"conf\" }, h(\"span\", { class: \"muted\" }, \"How sure are you?\"));\n for (const [k, label] of CONFIDENCE) {\n const b = h(\n \"button\",\n {\n onclick: () => {\n state.confidence = k;\n conf.querySelectorAll(\"button\").forEach((x) => x.classList.toggle(\"sel\", x === b));\n },\n },\n label,\n );\n conf.append(b);\n }\n return conf;\n}\n\n// A challenge with a time limit counts down in its header; at zero, the challenge hears \"timeup\".\nfunction startCountdown(seconds, kind, body, state) {\n let left = seconds;\n const t = h(\"span\", { class: \"timer\" }, `\u23F1\uFE0F ${left}s`);\n kind.append(t);\n app.timers.push(\n setInterval(() => {\n if (state.submitted) return;\n left--;\n t.textContent = `\u23F1\uFE0F ${left}s`;\n t.classList.toggle(\"low\", left <= 10);\n if (left <= 0) body.dispatchEvent(new Event(\"timeup\"));\n }, 1000),\n );\n}\n\nfunction showChallenge() {\n const run = app.run;\n const { c, second } = current();\n const turn = { run, c, second, isBoss: run.phase === \"boss\", state: { confidence: null, submitted: false } };\n renderStats();\n turn.card = h(\"div\", { class: \"card challenge\" });\n turn.feedbackSlot = h(\"div\");\n const kind = kindPills(turn);\n const body = h(\"div\");\n turn.card.append(kind, h(\"div\", { class: \"prompt\" }, c.prompt));\n if (!SELF_GRADED.has(c.type)) turn.card.append(confidencePicker(turn.state));\n turn.card.append(body, turn.feedbackSlot);\n\n RENDER[c.type](c, body, (res, reveal) => finishTurn(turn, res, reveal), turn.state);\n if (c.seconds && !OWN_CLOCK.has(c.type)) startCountdown(c.seconds, kind, body, turn.state);\n show(runBar(run), turn.card);\n}\n", "// The coach panel: only when the local server is running.\nimport { $, ROOT, app } from \"./state.js\";\nimport { h, richText, toast } from \"./dom.js\";\nimport { startSingle } from \"./play.js\";\n\nexport function renderCoach() {\n const panel = $(\"coach\");\n panel.hidden = false;\n ROOT.querySelector(\".layout\").classList.add(\"with-coach\");\n panel.replaceChildren(\n h(\n \"div\",\n { class: \"row spread\" },\n h(\"h3\", { style: \"margin:0\" }, \"\uD83D\uDCAC Coach\"),\n h(\"span\", { class: \"pill\" }, \"Claude Code\"),\n ),\n h(\n \"div\",\n { class: \"muted\", style: \"font-size:13px\" },\n 'When Claude Code is running beside you, it sees your written answers and \"Ask coach\" requests and replies here. It never sets your points.',\n ),\n h(\"div\", { id: \"assigned\" }),\n h(\"div\", { class: \"msgs\", id: \"msgs\" }),\n );\n}\n\nfunction coachMessage(m) {\n const time = new Date(m.ts).toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\" });\n return h(\"div\", { class: \"msg\" }, h(\"div\", { class: \"t\" }, time), richText(m.text));\n}\n\nfunction showMessages(messages) {\n if (!messages.length) return;\n const box = $(\"msgs\");\n box.append(...messages.map(coachMessage));\n box.scrollTop = box.scrollHeight;\n if (app.coachNext > 0) toast(\"\uD83D\uDCAC The coach replied\");\n}\n\nfunction assignedCard(a) {\n const chapter = a.chapter ? app.bundle.chapters.find((c) => c.chapter === a.chapter) : null;\n return h(\n \"div\",\n { class: \"assigned\" },\n h(\"div\", {}, h(\"b\", {}, \"\uD83C\uDFAF Coach's challenge\"), a.why ? h(\"div\", { class: \"muted\" }, a.why) : null),\n h(\"div\", {}, a.challenge.prompt),\n h(\"button\", { class: \"btn small\", onclick: () => startSingle(a.challenge, chapter) }, \"Play it\"),\n );\n}\n\n// The coach's challenges you haven't answered yet.\nfunction showAssigned(assigned) {\n const done = new Set(app.events.filter((e) => e.kind === \"answer\").map((e) => e.challenge));\n const open = assigned.filter((a) => !done.has(a.challenge.id));\n if (open.length === app.assigned.length) return;\n if (open.length > app.assigned.length) toast(\"\uD83C\uDFAF The coach set you a challenge\");\n app.assigned = open;\n $(\"assigned\").replaceChildren(...open.map(assignedCard));\n}\n\nexport async function pollCoach() {\n try {\n const r = await (await fetch(`/api/coach?after=${app.coachNext}`, { cache: \"no-store\" })).json();\n showMessages(r.messages);\n app.coachNext = r.next;\n showAssigned(await (await fetch(\"/api/assigned\", { cache: \"no-store\" })).json());\n } catch {\n /* the server went away; try again next tick */\n }\n}\n", "// System Design Quest: the page. It starts the game and shows an error if it can't. All scoring comes from\n// engine.js; the rest lives in the modules imported here.\nimport { cleanProfile } from \"./engine.js\";\nimport { $, BASE, app, setRoot } from \"./state.js\";\nimport { h, show } from \"./dom.js\";\nimport { LocalStore, ServerStore } from \"./store.js\";\nimport { pollCoach, renderCoach } from \"./coach.js\";\nimport { renderMap } from \"./screens/map.js\";\nimport { renderProfile } from \"./screens/profile.js\";\n\n// root: where to draw (a shadow root holding #screen, #stats, #coach, #toasts, #home, #you).\n// lookForServer: false on a public website, so the game never asks for a local coach server there.\nexport async function boot(root, { base = BASE, lookForServer = true } = {}) {\n setRoot(root, base);\n let server = false;\n if (lookForServer) {\n try {\n const r = await fetch(\"/api/health\", { cache: \"no-store\" });\n server = r.ok && (await r.json()).ok;\n } catch {\n /* no local server: play in the browser */\n }\n }\n app.store = server ? new ServerStore() : new LocalStore();\n app.coach = server;\n app.bundle = await (await fetch(new URL(\"chapters.json\", BASE), { cache: \"no-cache\" })).json();\n app.events = await app.store.load();\n app.profile = cleanProfile(await app.store.loadProfile());\n app.holds = await app.store.holds();\n $(\"home\").onclick = () => {\n if (!app.run || confirm(\"Back to the map? Your answers so far are kept.\")) renderMap();\n };\n $(\"you\").onclick = () => {\n if (!app.run || confirm(\"Leave this run? Your answers so far are kept.\")) renderProfile();\n };\n if (app.coach) {\n renderCoach();\n await pollCoach();\n setInterval(pollCoach, 2500);\n }\n renderMap();\n}\n\nexport function showError(e) {\n show(h(\"div\", { class: \"card\" }, h(\"h2\", {}, \"Couldn't start\"), h(\"p\", {}, String(e))));\n}\n", "// <system-design-quest>: the whole game as one element. Its styles live in a shadow root, so a host page's CSS\n// can't reach in and the game's can't leak out.\n// <system-design-quest static theme=\"dark\"></system-design-quest>\n// static never look for a local coach server (use it on a public website)\n// theme \"dark\" or \"light\" to override the visitor's system setting\nimport { boot, showError } from \"./app.js\";\n\nconst base = new URL(\".\", import.meta.url);\n\nfunction el(tag, attrs = {}, ...kids) {\n const node = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) node.setAttribute(k, v);\n node.append(...kids);\n return node;\n}\n\nclass SystemDesignQuest extends HTMLElement {\n connectedCallback() {\n if (this.shadowRoot) return;\n const root = this.attachShadow({ mode: \"open\" });\n root.append(\n el(\"link\", { rel: \"stylesheet\", href: new URL(\"style.css\", base).href }),\n el(\n \"header\",\n { class: \"top\" },\n el(\n \"button\",\n { class: \"brand\", id: \"home\", title: \"Back to the map\" },\n \"\u2694\uFE0F \",\n el(\"span\", {}, \"System Design Quest\"),\n ),\n el(\"div\", { class: \"stats\", id: \"stats\", \"aria-live\": \"polite\" }),\n el(\"button\", { class: \"you\", id: \"you\", title: \"Your profile: optional\" }, \"\uD83D\uDC64 You\"),\n ),\n el(\n \"div\",\n { class: \"layout\" },\n el(\"section\", { id: \"screen\", tabindex: \"-1\", \"aria-label\": \"System Design Quest\" }),\n el(\"aside\", { id: \"coach\", class: \"coach\", hidden: \"\" }),\n ),\n el(\"div\", { id: \"toasts\", class: \"toasts\", \"aria-live\": \"polite\" }),\n );\n boot(root, { base, lookForServer: !this.hasAttribute(\"static\") }).catch(showError);\n }\n}\n\nif (!customElements.get(\"system-design-quest\")) customElements.define(\"system-design-quest\", SystemDesignQuest);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["BLOOM_POINTS", "BOSS_POINTS", "BOSS_PASS", "STAR_ACCURACY", "TOLERANCE", "OPEN_AT_START", "rng", "seed", "a", "t", "shuffle", "items", "rand", "i", "j", "nice", "min", "max", "opts", "p", "m", "v", "fmt", "n", "GENERATORS", "r", "users", "actions", "perDay", "avg", "peak", "kb", "gb", "tb", "writes", "rps", "mbs", "generate", "gen", "SELF_GRADES", "clamp01", "x", "rightMinusWrong", "picks", "want", "right", "wrong", "CHECKS", "ch", "res", "correct", "answer", "slots", "placed", "id", "label", "total", "list", "got", "item", "check", "fraction", "multiplier", "combo", "basePoints", "confidence", "isBoss", "base", "pts", "nextCombo", "secondChance", "score", "newCombo", "PROFILE_TEXT", "PROFILE_MAX", "INTERVIEW_TYPES", "DATE_RE", "HOLD_ID_RE", "isDate", "s", "isObject", "cleanHolds", "holds", "kept", "h", "out", "copyText", "k", "cleanProfile", "holdActive", "profile", "today", "RANKS", "weekdaysBack", "now", "days", "d", "wd", "localDay", "z", "beatsBoss", "e", "goodDay", "events", "need", "latest", "replayDays", "first", "byDay", "day", "rankOf", "played", "stars", "bossBeaten", "chapterProgress", "answers", "ids", "c", "mine", "unlock", "chapters", "opened", "bossesBeaten", "inOrder", "open", "isQuest", "unlocked", "markReady", "byNumber", "earnedBadges", "sureRight", "earned", "daysLeft", "weakest", "misses", "b", "progress", "bundle", "recommend", "chs", "st", "runOrder", "rest", "boss", "app", "ROOT", "BASE", "$", "id", "session", "setRoot", "root", "base", "clearTimers", "prog", "progress", "chapterBySlug", "slug", "c", "nextUp", "p", "recommend", "isLeftOut", "v", "setAttr", "el", "k", "toNode", "kid", "h", "tag", "attrs", "kids", "svg", "screen", "$", "show", "nodes", "clearTimers", "s", "host", "ROOT", "toast", "text", "t", "confetti", "box", "i", "isWrapped", "part", "mark", "richPart", "richText", "line", "ServerStore", "ev", "p", "LocalStore", "all", "events", "profile", "everything", "baseEvent", "kind", "extra", "now", "localDay", "session", "post", "app", "summarise", "c", "res", "out", "generate", "BADGE_EMOJI", "badgeEmoji", "id", "countdown", "daysLeft", "company", "app", "h", "to", "comboStat", "combo", "times", "multiplier", "renderStats", "p", "prog", "stats", "$", "chapterToasts", "before", "after", "slug", "c", "b", "toast", "chapterBySlug", "badgeToasts", "badge", "x", "celebrate", "bossBeaten", "confetti", "recall", "c", "body", "finish", "ta", "h", "reveal", "grade", "g", "label", "e", "b", "submitBtn", "label", "h", "optionList", "items", "multi", "onChange", "box", "sel", "buttons", "text", "value", "b", "x", "mark", "rightValues", "chosenValues", "isRight", "chosen", "multi", "c", "body", "finish", "items", "shuffle", "text", "value", "btn", "submitBtn", "picked", "list", "optionList", "v", "why", "h", "mark", "duel", "c", "body", "finish", "pick", "btn", "submitBtn", "groups", "lists", "key", "label", "opts", "list", "optionList", "shuffle", "text", "value", "v", "h", "right", "i", "mark", "write", "c", "body", "finish", "ta", "h", "btn", "after", "ticks", "kp", "i", "e", "t", "ticked", "x", "estimate", "c", "body", "finish", "seed", "g", "generate", "inp", "h", "btn", "submitBtn", "e", "reveal", "res", "TAG_MARK", "wrapLabel", "text", "max", "words", "lines", "w", "options", "slots", "clickable", "onNode", "onDrop", "arrowMarker", "marker", "svg", "layout", "nodes", "box", "n", "centre", "b", "clip", "c", "r", "toward", "dx", "dy", "t", "edgeEnds", "A", "B", "ca", "cb", "drawEdge", "root", "e", "markerId", "p", "q", "onActivate", "g", "act", "onDropLabel", "drop", "nodeGroup", "o", "isSlot", "canClick", "label", "writeLabel", "top", "ln", "i", "ts", "tagText", "item", "markResult", "group", "setText", "controls", "groups", "tagLayer", "id", "drawTags", "map", "list", "placed", "k", "v", "l", "s", "result", "fn", "diagram", "d", "opts", "W", "H", "defs", "fill", "c", "body", "finish", "placed", "chosen", "btn", "submitBtn", "slots", "chips", "shuffle", "label", "chip", "h", "x", "e", "refresh", "d", "used", "s", "diagram", "id", "stickerChips", "labels", "onPick", "chosen", "chips", "label", "chip", "h", "x", "toggleTag", "placed", "id", "list", "at", "markTags", "c", "ids", "result", "want", "got", "s", "sticker", "body", "finish", "btn", "submitBtn", "n", "diagram", "toast", "l", "flaw", "c", "body", "finish", "node", "fix", "btn", "submitBtn", "ready", "d", "diagram", "n", "id", "list", "optionList", "shuffle", "text", "value", "v", "mark", "h", "order", "c", "body", "finish", "state", "items", "shuffle", "x", "i", "ol", "h", "btn", "dragFrom", "draw", "text", "li", "e", "m", "submit", "b", "toast", "lightning", "c", "body", "finish", "state", "secs", "reaches", "p", "start", "h", "pairs", "shuffle", "i", "right", "left", "misses", "timer", "q", "opts", "end", "toLearn", "a", "b", "ask", "hear", "reach", "choices", "r", "text", "ok", "app", "clearTimers", "sprint", "c", "body", "finish", "left", "running", "clock", "h", "fmtClock", "go", "done", "hint", "app", "toast", "clearTimers", "ticks", "txt", "i", "e", "ticked", "t", "x", "s", "TYPE_LABEL", "SELF_GRADED", "RENDER", "recall", "multi", "duel", "write", "estimate", "fill", "sticker", "flaw", "order", "lightning", "sprint", "REVEAL_TEXT", "reveal", "BOSS_BEATEN", "verdictOf", "s", "fraction", "isBoss", "sourceLine", "source", "h", "noteBox", "field", "wrapAttrs", "label", "send", "sent", "button", "wrap", "askCoach", "c", "res", "where", "ta", "text", "post", "baseEvent", "summarise", "flag", "app", "feedbackActions", "actions", "nextBtn", "advance", "feedback", "verdict", "cls", "reveal", "REVEAL_TEXT", "richText", "lockAnswer", "card", "feedbackSlot", "el", "answerEvent", "run", "c", "second", "isBoss", "state", "res", "fraction", "s", "ev", "baseEvent", "summarise", "app", "comesBack", "tally", "turn", "finishTurn", "reveal", "check", "before", "prog", "score", "post", "feedback", "celebrate", "renderStats", "isSave", "data", "loadSave", "file", "events", "e", "app", "cleanProfile", "toast", "renderMap", "downloadSave", "blob", "a", "h", "clearProfile", "renderProfile", "clearEverything", "saveCard", "clearServerProfile", "clearRow", "textField", "me", "key", "label", "placeholder", "input", "h", "PROFILE_MAX", "saveProfile", "fields", "type", "date", "next", "app", "el", "cleanProfile", "toast", "renderMap", "profileCard", "INTERVIEW_TYPES", "t", "where", "holdStatus", "active", "mine", "isDate", "setHold", "id", "patch", "renderProfile", "holdRow", "hold", "today", "holdActive", "when", "liftNow", "holdsCard", "localDay", "renderStats", "kids", "clearRow", "saveCard", "show", "PROFILE_FIELDS", "plural", "n", "word", "label", "ch", "isQuest", "app", "a", "b", "badgeList", "badges", "h", "badgeEmoji", "hero", "p", "totalBosses", "beaten", "c", "me", "about", "dismissIntro", "cleanProfile", "renderMap", "introHint", "k", "renderProfile", "heldHint", "held", "nextUpCard", "up", "startChapter", "cardMeta", "byNumber", "buildsOn", "playButtons", "startBoss", "lockedRow", "jumpTo", "chapterCard", "stars", "sectionHead", "title", "note", "sections", "all", "card", "training", "quests", "beatenOf", "list", "out", "renderStats", "prog", "slug", "post", "baseEvent", "show", "nextUp", "missedFirstTime", "run", "ch", "r", "x", "nextAction", "missed", "bossFailed", "otherUp", "bossStat", "result", "h", "resultStats", "c", "missedList", "m", "resultButtons", "startChapter", "renderMap", "showResults", "app", "p", "prog", "post", "baseEvent", "up", "nextUp", "next", "show", "renderStats", "CONFIDENCE", "OWN_CLOCK", "newRun", "chapter", "queue", "boss", "phase", "startChapter", "slug", "list", "ch", "chapterBySlug", "order", "runOrder", "app", "c", "post", "baseEvent", "showChallenge", "jumpTo", "startBoss", "startSingle", "current", "BEFORE_BOSS", "advance", "run", "toast", "showResults", "runDots", "h", "q", "i", "r", "x", "cls", "runBar", "leave", "renderMap", "kindPills", "second", "isBoss", "TYPE_LABEL", "confidencePicker", "state", "conf", "k", "label", "b", "startCountdown", "seconds", "kind", "body", "left", "t", "turn", "renderStats", "SELF_GRADED", "RENDER", "res", "reveal", "finishTurn", "show", "renderCoach", "panel", "$", "ROOT", "h", "coachMessage", "m", "time", "richText", "showMessages", "messages", "box", "app", "toast", "assignedCard", "a", "chapter", "c", "startSingle", "showAssigned", "assigned", "done", "e", "open", "pollCoach", "r", "boot", "root", "base", "BASE", "lookForServer", "setRoot", "server", "r", "app", "ServerStore", "LocalStore", "cleanProfile", "$", "renderMap", "renderProfile", "renderCoach", "pollCoach", "showError", "e", "show", "h", "base", "el", "tag", "attrs", "kids", "node", "k", "v", "SystemDesignQuest", "root", "boot", "showError"]
|
|
7
|
+
}
|