ICT30016-Assignment-3/node_modules/.cache/babel-loader/8a054220958f5c2e08d914565568f30f82d2457a575d127b31850f02b5e036fe.json
dlawler489 a79a6afd34 intial
intial
2025-09-16 12:09:52 +10:00

1 line
No EOL
70 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"ast":null,"code":"var _jsxFileName = \"/Users/davidl/Nextcloud/Uni/Swinburne/ICT30016 - ICT Project/Assignment 3/incident-response-game/src/App.jsx\",\n _s = $RefreshSig$();\nimport React, { useState, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { Shield, Skull, RefreshCw, HelpCircle, Info, Sparkles } from \"lucide-react\";\n\n/**\n * Cybersecurity Incident Response Card Game (Web App Prototype)\n * Tailwind CSS v4: ensure src/index.css contains only: @import \"tailwindcss\";\n */\n\n// --- MITRE ATT&CK references ---\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst MITRE = {\n phishing: {\n name: \"Phishing\",\n tactic: \"Initial Access\",\n id: \"T1566\"\n },\n malware: {\n name: \"Malware\",\n tactic: \"Execution\",\n id: \"T1204\"\n },\n privEsc: {\n name: \"Privilege Escalation\",\n tactic: \"Privilege Escalation\",\n id: \"TA0004\"\n },\n lateral: {\n name: \"Lateral Movement\",\n tactic: \"Lateral Movement\",\n id: \"TA0008\"\n },\n exfil: {\n name: \"Data Exfiltration\",\n tactic: \"Exfiltration\",\n id: \"TA0010\"\n }\n};\n\n// --- Attack deck ---\nconst ATTACK_DECK = [{\n id: \"A1\",\n title: \"Phishing Email\",\n description: \"A convincing email attempts to trick a user into entering credentials.\",\n mitreTag: \"phishing\",\n difficulty: 1,\n counterTags: [\"report\", \"mfa\", \"blockSender\", \"awareness\"]\n}, {\n id: \"A2\",\n title: \"Malware Dropper\",\n description: \"A user executes a downloaded attachment that launches a dropper.\",\n mitreTag: \"malware\",\n difficulty: 2,\n counterTags: [\"edr\", \"isolateHost\", \"patch\"]\n}, {\n id: \"A3\",\n title: \"Privilege Escalation\",\n description: \"Attacker abuses a vulnerable service to gain admin rights.\",\n mitreTag: \"privEsc\",\n difficulty: 2,\n counterTags: [\"patch\", \"leastPrivilege\", \"audit\"]\n}, {\n id: \"A4\",\n title: \"Lateral Movement\",\n description: \"Compromised account used to pivot through the network.\",\n mitreTag: \"lateral\",\n difficulty: 3,\n counterTags: [\"networkSeg\", \"isolateHost\", \"resetCreds\", \"monitor\"]\n}, {\n id: \"A5\",\n title: \"Data Exfiltration\",\n description: \"Sensitive data is staged and sent out of the organisation.\",\n mitreTag: \"exfil\",\n difficulty: 3,\n counterTags: [\"dlp\", \"isolateHost\", \"blockEgress\", \"monitor\"]\n}];\n\n// --- Defence pool ---\nconst DEFENCE_POOL = [{\n id: \"D1\",\n title: \"Report to IT\",\n cost: 2,\n tags: [\"report\", \"awareness\"],\n description: \"Escalate suspicious activity to IT/security.\"\n}, {\n id: \"D2\",\n title: \"Enable MFA\",\n cost: 3,\n tags: [\"mfa\"],\n description: \"Require multi-factor authentication for access.\"\n}, {\n id: \"D3\",\n title: \"Patch Systems\",\n cost: 4,\n tags: [\"patch\"],\n description: \"Apply vendor patches to remediate vulnerabilities.\"\n}, {\n id: \"D4\",\n title: \"Endpoint Detection & Response\",\n cost: 5,\n tags: [\"edr\", \"monitor\"],\n description: \"Detect, contain, and remediate malicious processes.\"\n}, {\n id: \"D5\",\n title: \"Isolate Host\",\n cost: 6,\n tags: [\"isolateHost\"],\n description: \"Remove a device from the network to stop spread.\"\n}, {\n id: \"D6\",\n title: \"Network Segmentation\",\n cost: 5,\n tags: [\"networkSeg\"],\n description: \"Restrict lateral movement with segmented zones.\"\n}, {\n id: \"D7\",\n title: \"Reset Credentials\",\n cost: 3,\n tags: [\"resetCreds\"],\n description: \"Force password reset and revoke sessions.\"\n}, {\n id: \"D8\",\n title: \"DLP Policy\",\n cost: 5,\n tags: [\"dlp\"],\n description: \"Detect and prevent exfiltration of sensitive data.\"\n}, {\n id: \"D9\",\n title: \"Block Egress Rule\",\n cost: 4,\n tags: [\"blockEgress\"],\n description: \"Block suspicious outbound connections at firewall.\"\n}, {\n id: \"D10\",\n title: \"Block Sender/Domain\",\n cost: 2,\n tags: [\"blockSender\"],\n description: \"Block malicious sender to prevent recurrences.\"\n}, {\n id: \"D11\",\n title: \"Audit & Logging\",\n cost: 2,\n tags: [\"audit\", \"monitor\"],\n description: \"Increase logging and review to detect anomalies.\"\n}, {\n id: \"D12\",\n title: \"Reimage & Network Scan\",\n cost: 6,\n tags: [\"isolateHost\", \"monitor\"],\n description: \"Rebuild host and scan for indicators of compromise.\"\n}, {\n id: \"D13\",\n title: \"Least Privilege\",\n cost: 3,\n tags: [\"leastPrivilege\"],\n description: \"Reduce account/device permissions to minimum.\"\n}];\n\n// --- Helpers ---\nfunction pickN(arr, n) {\n const copy = [...arr];\n const out = [];\n while (out.length < n && copy.length) {\n const idx = Math.floor(Math.random() * copy.length);\n out.push(copy.splice(idx, 1)[0]);\n }\n return out;\n}\nfunction defenceEffect(attack, defence) {\n const overlap = defence.tags.some(t => attack.counterTags.includes(t));\n if (overlap) return {\n result: \"mitigate\",\n score: 2\n };\n if (defence.tags.includes(\"monitor\") || defence.tags.includes(\"audit\")) {\n return {\n result: \"reduce\",\n score: 1\n };\n }\n return {\n result: \"fail\",\n score: 0\n };\n}\nfunction mitreBadge(tagKey) {\n const tag = MITRE[tagKey];\n if (!tag) return null;\n return /*#__PURE__*/_jsxDEV(\"span\", {\n className: \"text-xs px-2 py-1 rounded-full bg-slate-100 border font-medium\",\n children: [tag.name, \" \\u2022 \", tag.tactic, \" (\", tag.id, \")\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 104,\n columnNumber: 5\n }, this);\n}\nfunction Card({\n title,\n children,\n icon,\n accent = \"\",\n onClick,\n disabled\n}) {\n return /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: onClick,\n disabled: disabled,\n className: `group relative text-left w-full ${onClick ? \"hover:-translate-y-0.5 active:translate-y-0\" : \"\"} transition disabled:opacity-50`,\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: `rounded-2xl shadow p-4 border ${accent} bg-white`,\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center gap-2 mb-2\",\n children: [icon, /*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"font-semibold text-slate-800\",\n children: title\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 120,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 118,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-sm text-slate-600\",\n children: children\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 122,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 117,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 112,\n columnNumber: 5\n }, this);\n}\n\n// --- Main App ---\n_c = Card;\nexport default function App() {\n _s();\n const [round, setRound] = useState(1);\n const [ap, setAp] = useState(10);\n const [score, setScore] = useState(0);\n const [attacksLeft, setAttacksLeft] = useState(5);\n const [currentAttack, setCurrentAttack] = useState(null);\n const [hand, setHand] = useState([]);\n const [log, setLog] = useState([]);\n const [showHelp, setShowHelp] = useState(false);\n const drawAttack = () => ATTACK_DECK[Math.floor(Math.random() * ATTACK_DECK.length)];\n function drawHandForAttack(attack, size = 5) {\n for (let i = 0; i < 25; i++) {\n const h = pickN(DEFENCE_POOL, size);\n const viable = h.some(d => d.tags.some(t => attack.counterTags.includes(t)));\n if (viable) return h;\n }\n const forced = pickN(DEFENCE_POOL, size - 1);\n const must = DEFENCE_POOL.find(d => d.tags.some(t => attack.counterTags.includes(t)));\n return [must, ...forced].slice(0, size);\n }\n useEffect(() => {\n if (!currentAttack) {\n const atk = drawAttack();\n setCurrentAttack(atk);\n setHand(drawHandForAttack(atk));\n }\n }, [currentAttack]);\n function playDefence(card) {\n if (card.cost > ap) return;\n setAp(v => v - card.cost);\n const outcome = defenceEffect(currentAttack, card);\n setScore(s => s + outcome.score);\n setLog(l => [{\n ts: Date.now(),\n text: `${card.title} (${card.cost} AP) → ${outcome.result.toUpperCase()} (+${outcome.score})`\n }, ...l]);\n const nextAttacks = attacksLeft - (outcome.result === \"mitigate\" ? 1 : 0);\n setAttacksLeft(nextAttacks);\n if (nextAttacks <= 0 || ap - card.cost <= 0) {\n return;\n }\n const atk = drawAttack();\n setCurrentAttack(atk);\n setHand(drawHandForAttack(atk));\n }\n function newRound() {\n setRound(r => r + 1);\n setAp(10);\n setAttacksLeft(5);\n setCurrentAttack(null);\n setHand([]);\n setLog([]);\n }\n const roundEnded = attacksLeft <= 0 || ap <= 0;\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"min-h-screen bg-slate-50 p-6\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"max-w-6xl mx-auto space-y-6\",\n children: [/*#__PURE__*/_jsxDEV(\"header\", {\n className: \"flex items-center justify-between\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center gap-3\",\n children: [/*#__PURE__*/_jsxDEV(Shield, {\n className: \"w-6 h-6\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 199,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"text-2xl font-bold\",\n children: \"Incident Response \\u2013 Card Game\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 200,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 198,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center gap-2\",\n children: [/*#__PURE__*/_jsxDEV(\"button\", {\n onClick: () => setShowHelp(true),\n className: \"inline-flex items-center gap-1 text-sm px-3 py-2 rounded-xl bg-white border shadow-sm hover:bg-slate-50\",\n children: [/*#__PURE__*/_jsxDEV(HelpCircle, {\n className: \"w-4 h-4\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 204,\n columnNumber: 15\n }, this), \" How to Play\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 203,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: newRound,\n className: \"inline-flex items-center gap-1 text-sm px-3 py-2 rounded-xl bg-white border shadow-sm hover:bg-slate-50\",\n children: [/*#__PURE__*/_jsxDEV(RefreshCw, {\n className: \"w-4 h-4\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 207,\n columnNumber: 15\n }, this), \" New Round\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 206,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 202,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 197,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"section\", {\n className: \"grid grid-cols-1 md:grid-cols-3 gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"md:col-span-2 space-y-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"grid grid-cols-3 gap-3\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"rounded-2xl bg-white border p-4 shadow-sm\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-xs text-slate-500\",\n children: \"Round\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 217,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-2xl font-semibold\",\n children: round\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 218,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 216,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"rounded-2xl bg-white border p-4 shadow-sm\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-xs text-slate-500\",\n children: \"Action Points\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 221,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-2xl font-semibold\",\n children: ap\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 222,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 220,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"rounded-2xl bg-white border p-4 shadow-sm\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-xs text-slate-500\",\n children: \"Score\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 225,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-2xl font-semibold\",\n children: score\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 226,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 224,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 215,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"rounded-2xl bg-white border p-5 shadow-sm\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center justify-between mb-3\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center gap-2\",\n children: [/*#__PURE__*/_jsxDEV(Skull, {\n className: \"w-5 h-5\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 234,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"font-semibold\",\n children: \"Current Attack\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 235,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 233,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"span\", {\n className: \"text-xs text-slate-500\",\n children: [\"Attacks remaining this round: \", attacksLeft]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 237,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 232,\n columnNumber: 15\n }, this), currentAttack && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-3\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex flex-wrap items-center gap-2\",\n children: [mitreBadge(currentAttack.mitreTag), /*#__PURE__*/_jsxDEV(\"span\", {\n className: \"text-xs px-2 py-1 rounded-full bg-amber-100 text-amber-800\",\n children: [\"Difficulty \", currentAttack.difficulty]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 244,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 242,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-lg font-semibold\",\n children: currentAttack.title\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 246,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-slate-600\",\n children: currentAttack.description\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 247,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 241,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 231,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-2\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center gap-2\",\n children: [/*#__PURE__*/_jsxDEV(Shield, {\n className: \"w-4 h-4\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 255,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"font-semibold\",\n children: \"Your Defence Hand\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 256,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 254,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3\",\n children: hand.map(card => /*#__PURE__*/_jsxDEV(Card, {\n title: `${card.title} • ${card.cost} AP`,\n icon: /*#__PURE__*/_jsxDEV(Shield, {\n className: \"w-4 h-4\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 263,\n columnNumber: 27\n }, this),\n onClick: !roundEnded ? () => playDefence(card) : undefined,\n disabled: roundEnded || card.cost > ap,\n accent: card.cost > ap ? \"border-slate-200\" : \"border-slate-200 hover:border-emerald-300\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-xs mb-2\",\n children: card.description\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 268,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex flex-wrap gap-1\",\n children: card.tags.map(t => /*#__PURE__*/_jsxDEV(\"span\", {\n className: \"text-[10px] px-2 py-0.5 rounded-full bg-slate-100 border\",\n children: t\n }, t, false, {\n fileName: _jsxFileName,\n lineNumber: 271,\n columnNumber: 25\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 269,\n columnNumber: 21\n }, this)]\n }, card.id, true, {\n fileName: _jsxFileName,\n lineNumber: 260,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 258,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 253,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 213,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-3\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"rounded-2xl bg-white border p-4 shadow-sm\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center gap-2 mb-2\",\n children: [/*#__PURE__*/_jsxDEV(Info, {\n className: \"w-4 h-4\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 286,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"font-semibold\",\n children: \"Event Log\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 287,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 285,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-2 max-h-80 overflow-auto pr-2\",\n children: [log.length === 0 && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-slate-500\",\n children: \"No actions yet. Play a defence card to respond.\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 290,\n columnNumber: 38\n }, this), log.map(e => /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-sm text-slate-700\",\n children: [new Date(e.ts).toLocaleTimeString(), \" \\u2014 \", e.text]\n }, e.ts, true, {\n fileName: _jsxFileName,\n lineNumber: 292,\n columnNumber: 19\n }, this))]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 289,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 284,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"rounded-2xl bg-gradient-to-br from-emerald-50 to-slate-50 border p-4 shadow-sm text-center\",\n children: roundEnded ? /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-2\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"inline-flex items-center gap-2 text-emerald-700\",\n children: [/*#__PURE__*/_jsxDEV(Sparkles, {\n className: \"w-4 h-4\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 304,\n columnNumber: 21\n }, this), \" \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: \"Round Complete\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 304,\n columnNumber: 54\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 303,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-sm text-slate-600\",\n children: [\"Score this round: \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: score\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 307,\n columnNumber: 39\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 306,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: newRound,\n className: \"mt-2 inline-flex items-center gap-1 text-sm px-3 py-2 rounded-xl bg-emerald-600 text-white hover:bg-emerald-700\",\n children: \"Start Next Round\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 309,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 302,\n columnNumber: 17\n }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-sm text-slate-600\",\n children: \"Mitigate attacks efficiently and conserve AP for tougher threats.\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 317,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 300,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 283,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 212,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"footer\", {\n className: \"text-xs text-slate-500 pt-4\",\n children: /*#__PURE__*/_jsxDEV(\"p\", {\n children: \"MITRE ATT&CK tags are indicative and simplified for learning. This prototype focuses on accessibility across skill levels and resource-based decision making.\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 324,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 323,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 196,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(AnimatePresence, {\n children: showHelp && /*#__PURE__*/_jsxDEV(motion.div, {\n initial: {\n opacity: 0\n },\n animate: {\n opacity: 1\n },\n exit: {\n opacity: 0\n },\n className: \"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center p-4 z-50\",\n children: /*#__PURE__*/_jsxDEV(motion.div, {\n initial: {\n scale: 0.95,\n opacity: 0\n },\n animate: {\n scale: 1,\n opacity: 1\n },\n exit: {\n scale: 0.95,\n opacity: 0\n },\n className: \"max-w-xl w-full bg-white rounded-2xl shadow-2xl border p-6 space-y-3\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center justify-between\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center gap-2\",\n children: [/*#__PURE__*/_jsxDEV(HelpCircle, {\n className: \"w-5 h-5\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 348,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"font-semibold\",\n children: \"How to Play\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 349,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 347,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: () => setShowHelp(false),\n className: \"text-slate-500 hover:text-slate-700\",\n children: \"Close\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 351,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 346,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"ol\", {\n className: \"list-decimal pl-5 text-sm space-y-2 text-slate-700\",\n children: [/*#__PURE__*/_jsxDEV(\"li\", {\n children: [\"The computer plays an \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: \"Attack\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 356,\n columnNumber: 43\n }, this), \". Review its MITRE tag and description.\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 356,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"li\", {\n children: [\"You have \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: \"10 Action Points\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 357,\n columnNumber: 30\n }, this), \" (AP) to spend each round. Each defence costs AP.\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 357,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"li\", {\n children: [\"Play a \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: \"Defence\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 359,\n columnNumber: 26\n }, this), \". If its tags match the attack\\u2019s counters, you \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: \"mitigate\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 359,\n columnNumber: 87\n }, this), \" it (+2 points). Generic controls may \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: \"reduce\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 359,\n columnNumber: 140\n }, this), \" impact (+1). Otherwise it \", /*#__PURE__*/_jsxDEV(\"b\", {\n children: \"fails\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 359,\n columnNumber: 180\n }, this), \" (0).\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 358,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"li\", {\n children: \"Mitigated attacks advance the round. When AP hits 0 or you clear all attacks, the round ends. Start a new round anytime.\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 361,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"li\", {\n children: \"Learn strategically: conserve AP for harder threats and combine monitoring with containment.\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 364,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 355,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"text-xs text-slate-500\",\n children: \"Designed for classrooms/workshops; quick rounds target 15\\u201320 minutes with discussion.\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 368,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 340,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 334,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 332,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 195,\n columnNumber: 5\n }, this);\n}\n_s(App, \"9/DowfyYaAy9fzb8ESi04nHjjD0=\");\n_c2 = App;\nvar _c, _c2;\n$RefreshReg$(_c, \"Card\");\n$RefreshReg$(_c2, \"App\");","map":{"version":3,"names":["React","useState","useEffect","motion","AnimatePresence","Shield","Skull","RefreshCw","HelpCircle","Info","Sparkles","jsxDEV","_jsxDEV","MITRE","phishing","name","tactic","id","malware","privEsc","lateral","exfil","ATTACK_DECK","title","description","mitreTag","difficulty","counterTags","DEFENCE_POOL","cost","tags","pickN","arr","n","copy","out","length","idx","Math","floor","random","push","splice","defenceEffect","attack","defence","overlap","some","t","includes","result","score","mitreBadge","tagKey","tag","className","children","fileName","_jsxFileName","lineNumber","columnNumber","Card","icon","accent","onClick","disabled","_c","App","_s","round","setRound","ap","setAp","setScore","attacksLeft","setAttacksLeft","currentAttack","setCurrentAttack","hand","setHand","log","setLog","showHelp","setShowHelp","drawAttack","drawHandForAttack","size","i","h","viable","d","forced","must","find","slice","atk","playDefence","card","v","outcome","s","l","ts","Date","now","text","toUpperCase","nextAttacks","newRound","r","roundEnded","map","undefined","e","toLocaleTimeString","div","initial","opacity","animate","exit","scale","_c2","$RefreshReg$"],"sources":["/Users/davidl/Nextcloud/Uni/Swinburne/ICT30016 - ICT Project/Assignment 3/incident-response-game/src/App.jsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { Shield, Skull, RefreshCw, HelpCircle, Info, Sparkles } from \"lucide-react\";\n\n/**\n * Cybersecurity Incident Response Card Game (Web App Prototype)\n * Tailwind CSS v4: ensure src/index.css contains only: @import \"tailwindcss\";\n */\n\n// --- MITRE ATT&CK references ---\nconst MITRE = {\n phishing: { name: \"Phishing\", tactic: \"Initial Access\", id: \"T1566\" },\n malware: { name: \"Malware\", tactic: \"Execution\", id: \"T1204\" },\n privEsc: { name: \"Privilege Escalation\", tactic: \"Privilege Escalation\", id: \"TA0004\" },\n lateral: { name: \"Lateral Movement\", tactic: \"Lateral Movement\", id: \"TA0008\" },\n exfil: { name: \"Data Exfiltration\", tactic: \"Exfiltration\", id: \"TA0010\" },\n};\n\n// --- Attack deck ---\nconst ATTACK_DECK = [\n {\n id: \"A1\",\n title: \"Phishing Email\",\n description: \"A convincing email attempts to trick a user into entering credentials.\",\n mitreTag: \"phishing\",\n difficulty: 1,\n counterTags: [\"report\", \"mfa\", \"blockSender\", \"awareness\"],\n },\n {\n id: \"A2\",\n title: \"Malware Dropper\",\n description: \"A user executes a downloaded attachment that launches a dropper.\",\n mitreTag: \"malware\",\n difficulty: 2,\n counterTags: [\"edr\", \"isolateHost\", \"patch\"],\n },\n {\n id: \"A3\",\n title: \"Privilege Escalation\",\n description: \"Attacker abuses a vulnerable service to gain admin rights.\",\n mitreTag: \"privEsc\",\n difficulty: 2,\n counterTags: [\"patch\", \"leastPrivilege\", \"audit\"],\n },\n {\n id: \"A4\",\n title: \"Lateral Movement\",\n description: \"Compromised account used to pivot through the network.\",\n mitreTag: \"lateral\",\n difficulty: 3,\n counterTags: [\"networkSeg\", \"isolateHost\", \"resetCreds\", \"monitor\"],\n },\n {\n id: \"A5\",\n title: \"Data Exfiltration\",\n description: \"Sensitive data is staged and sent out of the organisation.\",\n mitreTag: \"exfil\",\n difficulty: 3,\n counterTags: [\"dlp\", \"isolateHost\", \"blockEgress\", \"monitor\"],\n },\n];\n\n// --- Defence pool ---\nconst DEFENCE_POOL = [\n { id: \"D1\", title: \"Report to IT\", cost: 2, tags: [\"report\", \"awareness\"], description: \"Escalate suspicious activity to IT/security.\" },\n { id: \"D2\", title: \"Enable MFA\", cost: 3, tags: [\"mfa\"], description: \"Require multi-factor authentication for access.\" },\n { id: \"D3\", title: \"Patch Systems\", cost: 4, tags: [\"patch\"], description: \"Apply vendor patches to remediate vulnerabilities.\" },\n { id: \"D4\", title: \"Endpoint Detection & Response\", cost: 5, tags: [\"edr\", \"monitor\"], description: \"Detect, contain, and remediate malicious processes.\" },\n { id: \"D5\", title: \"Isolate Host\", cost: 6, tags: [\"isolateHost\"], description: \"Remove a device from the network to stop spread.\" },\n { id: \"D6\", title: \"Network Segmentation\", cost: 5, tags: [\"networkSeg\"], description: \"Restrict lateral movement with segmented zones.\" },\n { id: \"D7\", title: \"Reset Credentials\", cost: 3, tags: [\"resetCreds\"], description: \"Force password reset and revoke sessions.\" },\n { id: \"D8\", title: \"DLP Policy\", cost: 5, tags: [\"dlp\"], description: \"Detect and prevent exfiltration of sensitive data.\" },\n { id: \"D9\", title: \"Block Egress Rule\", cost: 4, tags: [\"blockEgress\"], description: \"Block suspicious outbound connections at firewall.\" },\n { id: \"D10\", title: \"Block Sender/Domain\", cost: 2, tags: [\"blockSender\"], description: \"Block malicious sender to prevent recurrences.\" },\n { id: \"D11\", title: \"Audit & Logging\", cost: 2, tags: [\"audit\", \"monitor\"], description: \"Increase logging and review to detect anomalies.\" },\n { id: \"D12\", title: \"Reimage & Network Scan\", cost: 6, tags: [\"isolateHost\", \"monitor\"], description: \"Rebuild host and scan for indicators of compromise.\" },\n { id: \"D13\", title: \"Least Privilege\", cost: 3, tags: [\"leastPrivilege\"], description: \"Reduce account/device permissions to minimum.\" },\n];\n\n// --- Helpers ---\nfunction pickN(arr, n) {\n const copy = [...arr];\n const out = [];\n while (out.length < n && copy.length) {\n const idx = Math.floor(Math.random() * copy.length);\n out.push(copy.splice(idx, 1)[0]);\n }\n return out;\n}\n\nfunction defenceEffect(attack, defence) {\n const overlap = defence.tags.some((t) => attack.counterTags.includes(t));\n if (overlap) return { result: \"mitigate\", score: 2 };\n if (defence.tags.includes(\"monitor\") || defence.tags.includes(\"audit\")) {\n return { result: \"reduce\", score: 1 };\n }\n return { result: \"fail\", score: 0 };\n}\n\nfunction mitreBadge(tagKey) {\n const tag = MITRE[tagKey];\n if (!tag) return null;\n return (\n <span className=\"text-xs px-2 py-1 rounded-full bg-slate-100 border font-medium\">\n {tag.name} • {tag.tactic} ({tag.id})\n </span>\n );\n}\n\nfunction Card({ title, children, icon, accent = \"\", onClick, disabled }) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`group relative text-left w-full ${onClick ? \"hover:-translate-y-0.5 active:translate-y-0\" : \"\"} transition disabled:opacity-50`}\n >\n <div className={`rounded-2xl shadow p-4 border ${accent} bg-white`}>\n <div className=\"flex items-center gap-2 mb-2\">\n {icon}\n <h3 className=\"font-semibold text-slate-800\">{title}</h3>\n </div>\n <div className=\"text-sm text-slate-600\">{children}</div>\n </div>\n </button>\n );\n}\n\n// --- Main App ---\nexport default function App() {\n const [round, setRound] = useState(1);\n const [ap, setAp] = useState(10);\n const [score, setScore] = useState(0);\n const [attacksLeft, setAttacksLeft] = useState(5);\n const [currentAttack, setCurrentAttack] = useState(null);\n const [hand, setHand] = useState([]);\n const [log, setLog] = useState([]);\n const [showHelp, setShowHelp] = useState(false);\n\n const drawAttack = () => ATTACK_DECK[Math.floor(Math.random() * ATTACK_DECK.length)];\n\n function drawHandForAttack(attack, size = 5) {\n for (let i = 0; i < 25; i++) {\n const h = pickN(DEFENCE_POOL, size);\n const viable = h.some((d) => d.tags.some((t) => attack.counterTags.includes(t)));\n if (viable) return h;\n }\n const forced = pickN(DEFENCE_POOL, size - 1);\n const must = DEFENCE_POOL.find((d) => d.tags.some((t) => attack.counterTags.includes(t)));\n return [must, ...forced].slice(0, size);\n }\n\n useEffect(() => {\n if (!currentAttack) {\n const atk = drawAttack();\n setCurrentAttack(atk);\n setHand(drawHandForAttack(atk));\n }\n }, [currentAttack]);\n\n function playDefence(card) {\n if (card.cost > ap) return;\n setAp((v) => v - card.cost);\n\n const outcome = defenceEffect(currentAttack, card);\n setScore((s) => s + outcome.score);\n setLog((l) => [\n { ts: Date.now(), text: `${card.title} (${card.cost} AP) → ${outcome.result.toUpperCase()} (+${outcome.score})` },\n ...l,\n ]);\n\n const nextAttacks = attacksLeft - (outcome.result === \"mitigate\" ? 1 : 0);\n setAttacksLeft(nextAttacks);\n\n if (nextAttacks <= 0 || ap - card.cost <= 0) {\n return;\n }\n\n const atk = drawAttack();\n setCurrentAttack(atk);\n setHand(drawHandForAttack(atk));\n }\n\n function newRound() {\n setRound((r) => r + 1);\n setAp(10);\n setAttacksLeft(5);\n setCurrentAttack(null);\n setHand([]);\n setLog([]);\n }\n\n const roundEnded = attacksLeft <= 0 || ap <= 0;\n\n return (\n <div className=\"min-h-screen bg-slate-50 p-6\">\n <div className=\"max-w-6xl mx-auto space-y-6\">\n <header className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Shield className=\"w-6 h-6\" />\n <h1 className=\"text-2xl font-bold\">Incident Response Card Game</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <button onClick={() => setShowHelp(true)} className=\"inline-flex items-center gap-1 text-sm px-3 py-2 rounded-xl bg-white border shadow-sm hover:bg-slate-50\">\n <HelpCircle className=\"w-4 h-4\" /> How to Play\n </button>\n <button onClick={newRound} className=\"inline-flex items-center gap-1 text-sm px-3 py-2 rounded-xl bg-white border shadow-sm hover:bg-slate-50\">\n <RefreshCw className=\"w-4 h-4\" /> New Round\n </button>\n </div>\n </header>\n\n <section className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"md:col-span-2 space-y-4\">\n {/* Status */}\n <div className=\"grid grid-cols-3 gap-3\">\n <div className=\"rounded-2xl bg-white border p-4 shadow-sm\">\n <div className=\"text-xs text-slate-500\">Round</div>\n <div className=\"text-2xl font-semibold\">{round}</div>\n </div>\n <div className=\"rounded-2xl bg-white border p-4 shadow-sm\">\n <div className=\"text-xs text-slate-500\">Action Points</div>\n <div className=\"text-2xl font-semibold\">{ap}</div>\n </div>\n <div className=\"rounded-2xl bg-white border p-4 shadow-sm\">\n <div className=\"text-xs text-slate-500\">Score</div>\n <div className=\"text-2xl font-semibold\">{score}</div>\n </div>\n </div>\n\n {/* Current Attack */}\n <div className=\"rounded-2xl bg-white border p-5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <Skull className=\"w-5 h-5\" />\n <h2 className=\"font-semibold\">Current Attack</h2>\n </div>\n <span className=\"text-xs text-slate-500\">Attacks remaining this round: {attacksLeft}</span>\n </div>\n\n {currentAttack && (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {mitreBadge(currentAttack.mitreTag)}\n <span className=\"text-xs px-2 py-1 rounded-full bg-amber-100 text-amber-800\">Difficulty {currentAttack.difficulty}</span>\n </div>\n <h3 className=\"text-lg font-semibold\">{currentAttack.title}</h3>\n <p className=\"text-sm text-slate-600\">{currentAttack.description}</p>\n </div>\n )}\n </div>\n\n {/* Defence Hand */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Shield className=\"w-4 h-4\" />\n <h2 className=\"font-semibold\">Your Defence Hand</h2>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3\">\n {hand.map((card) => (\n <Card\n key={card.id}\n title={`${card.title} • ${card.cost} AP`}\n icon={<Shield className=\"w-4 h-4\" />}\n onClick={!roundEnded ? () => playDefence(card) : undefined}\n disabled={roundEnded || card.cost > ap}\n accent={card.cost > ap ? \"border-slate-200\" : \"border-slate-200 hover:border-emerald-300\"}\n >\n <div className=\"text-xs mb-2\">{card.description}</div>\n <div className=\"flex flex-wrap gap-1\">\n {card.tags.map((t) => (\n <span key={t} className=\"text-[10px] px-2 py-0.5 rounded-full bg-slate-100 border\">\n {t}\n </span>\n ))}\n </div>\n </Card>\n ))}\n </div>\n </div>\n </div>\n\n {/* Event Log */}\n <div className=\"space-y-3\">\n <div className=\"rounded-2xl bg-white border p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Info className=\"w-4 h-4\" />\n <h3 className=\"font-semibold\">Event Log</h3>\n </div>\n <div className=\"space-y-2 max-h-80 overflow-auto pr-2\">\n {log.length === 0 && <p className=\"text-sm text-slate-500\">No actions yet. Play a defence card to respond.</p>}\n {log.map((e) => (\n <div key={e.ts} className=\"text-sm text-slate-700\">\n {new Date(e.ts).toLocaleTimeString()} — {e.text}\n </div>\n ))}\n </div>\n </div>\n\n {/* Round Summary */}\n <div className=\"rounded-2xl bg-gradient-to-br from-emerald-50 to-slate-50 border p-4 shadow-sm text-center\">\n {roundEnded ? (\n <div className=\"space-y-2\">\n <div className=\"inline-flex items-center gap-2 text-emerald-700\">\n <Sparkles className=\"w-4 h-4\" /> <b>Round Complete</b>\n </div>\n <div className=\"text-sm text-slate-600\">\n Score this round: <b>{score}</b>\n </div>\n <button\n onClick={newRound}\n className=\"mt-2 inline-flex items-center gap-1 text-sm px-3 py-2 rounded-xl bg-emerald-600 text-white hover:bg-emerald-700\"\n >\n Start Next Round\n </button>\n </div>\n ) : (\n <div className=\"text-sm text-slate-600\">Mitigate attacks efficiently and conserve AP for tougher threats.</div>\n )}\n </div>\n </div>\n </section>\n\n <footer className=\"text-xs text-slate-500 pt-4\">\n <p>\n MITRE ATT&CK tags are indicative and simplified for learning. This prototype focuses on accessibility across skill levels and\n resource-based decision making.\n </p>\n </footer>\n </div>\n\n {/* Help Modal */}\n <AnimatePresence>\n {showHelp && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center p-4 z-50\"\n >\n <motion.div\n initial={{ scale: 0.95, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.95, opacity: 0 }}\n className=\"max-w-xl w-full bg-white rounded-2xl shadow-2xl border p-6 space-y-3\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <HelpCircle className=\"w-5 h-5\" />\n <h3 className=\"font-semibold\">How to Play</h3>\n </div>\n <button onClick={() => setShowHelp(false)} className=\"text-slate-500 hover:text-slate-700\">\n Close\n </button>\n </div>\n <ol className=\"list-decimal pl-5 text-sm space-y-2 text-slate-700\">\n <li>The computer plays an <b>Attack</b>. Review its MITRE tag and description.</li>\n <li>You have <b>10 Action Points</b> (AP) to spend each round. Each defence costs AP.</li>\n <li>\n Play a <b>Defence</b>. If its tags match the attacks counters, you <b>mitigate</b> it (+2 points). Generic controls may <b>reduce</b> impact (+1). Otherwise it <b>fails</b> (0).\n </li>\n <li>\n Mitigated attacks advance the round. When AP hits 0 or you clear all attacks, the round ends. Start a new round anytime.\n </li>\n <li>\n Learn strategically: conserve AP for harder threats and combine monitoring with containment.\n </li>\n </ol>\n <div className=\"text-xs text-slate-500\">Designed for classrooms/workshops; quick rounds target 1520 minutes with discussion.</div>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}